1// Boost.Geometry (aka GGL, Generic Geometry Library)
2// Unit Test
3
4// Copyright (c) 2010-2012 Barend Gehrels, Amsterdam, the Netherlands.
5
6// Use, modification and distribution is subject to the Boost Software License,
7// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
8// http://www.boost.org/LICENSE_1_0.txt)
9
10
11#include <geometry_test_common.hpp>
12
13
14#include <boost/geometry/geometry.hpp>
15#include <boost/geometry/geometries/geometries.hpp>
16#include <boost/geometry/geometries/point_xy.hpp>
17#include <boost/geometry/geometries/adapted/boost_range/adjacent_filtered.hpp>
18#include <boost/geometry/geometries/adapted/boost_range/filtered.hpp>
19#include <boost/geometry/geometries/adapted/boost_range/reversed.hpp>
20#include <boost/geometry/geometries/adapted/boost_range/strided.hpp>
21#include <boost/geometry/geometries/adapted/boost_range/sliced.hpp>
22#include <boost/geometry/geometries/adapted/boost_range/uniqued.hpp>
23
24#include <boost/geometry/io/wkt/wkt.hpp>
25
26#include <sstream>
27
28#ifdef BOOST_GEOMETRY_TEST_QUARANTINED
29struct not_two
30{
31 template <typename P>
32 bool operator()(P const& p) const
33 {
34 return boost::geometry::get<0>(p) != 2.0;
35 }
36};
37
38struct sum_not_five
39{
40 template <typename P>
41 bool operator()(P const& p1, P const& p2) const
42 {
43 return boost::geometry::get<0>(p1) + boost::geometry::get<0>(p2) != 5.0;
44 }
45};
46#endif
47
48
49template <typename P>
50void test_range_adaptor()
51{
52 bg::model::linestring<P> ls;
53 bg::read_wkt("LINESTRING(1 1,2 2,3 3,4 4)", ls);
54
55 {
56 std::ostringstream out;
57 out << bg::wkt(ls);
58 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(1 1,2 2,3 3,4 4)");
59 }
60
61 {
62 std::ostringstream out;
63 out << bg::wkt(ls | boost::adaptors::reversed);
64 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(4 4,3 3,2 2,1 1)");
65 }
66
67 {
68 std::ostringstream out;
69 out << bg::wkt(ls | boost::adaptors::strided(2));
70 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(1 1,3 3)");
71 }
72
73 {
74 std::ostringstream out;
75 out << bg::wkt(ls | boost::adaptors::sliced(1,3));
76 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(2 2,3 3)");
77 }
78
79#ifdef BOOST_GEOMETRY_TEST_QUARANTINED
80// range filter adaptor does not support boost::size()
81// This makes it in practice not applicable, boost::geometry calls boost::size
82// in most if not all algorithms
83 {
84 std::ostringstream out;
85 out << bg::wkt(ls | boost::adaptors::filtered(not_two()));
86 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(1 1,3 3,4 4)");
87 }
88
89 {
90 std::ostringstream out;
91 out << bg::wkt(ls | boost::adaptors::adjacent_filtered(sum_not_five()));
92 BOOST_CHECK_EQUAL(out.str(), "LINESTRING(1 1,3 3,4 4)");
93 }
94
95 {
96 bg::model::linestring<P> ls2;
97 bg::read_wkt("LINESTRING(1 1,1 1,2 2,3 3,3 3,4 4)", ls2);
98 std::ostringstream out;
99
100
101 // uniqued needs == operator, equals
102 //out << bg::wkt(ls | boost::adaptors::uniqued);
103 //BOOST_CHECK_EQUAL(out.str(), "LINESTRING(1 1,2 2,3 3,4 4)");
104 }
105#endif
106}
107
108template <typename P>
109void test_all()
110{
111 test_range_adaptor<P>();
112}
113
114
115
116int test_main(int, char* [])
117{
118 test_all<bg::model::d2::point_xy<double> >();
119 test_all<bg::model::point<int, 2, bg::cs::cartesian> >();
120
121 return 0;
122 }
123
124