]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/geometry/test/algorithms/set_operations/sym_difference/test_sym_difference_linear_linear.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / libs / geometry / test / algorithms / set_operations / sym_difference / test_sym_difference_linear_linear.hpp
1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2
3 // Copyright (c) 2014-2017, Oracle and/or its affiliates.
4 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
6
7 // Licensed under the Boost Software License version 1.0.
8 // http://www.boost.org/users/license.html
9
10
11 #ifndef BOOST_GEOMETRY_TEST_SYM_DIFFERENCE_LINEAR_LINEAR_HPP
12 #define BOOST_GEOMETRY_TEST_SYM_DIFFERENCE_LINEAR_LINEAR_HPP
13
14 #include <limits>
15
16 #include <boost/geometry/geometry.hpp>
17 #include "../test_set_ops_linear_linear.hpp"
18 #include <from_wkt.hpp>
19 #include <to_svg.hpp>
20
21
22 //==================================================================
23 //==================================================================
24 // symmetric difference of (linear) geometries
25 //==================================================================
26 //==================================================================
27
28 template <typename Geometry1, typename Geometry2, typename MultiLineString>
29 inline void check_result(Geometry1 const& geometry1,
30 Geometry2 const& geometry2,
31 MultiLineString const& mls_output,
32 MultiLineString const& mls_sym_diff,
33 std::string const& case_id,
34 double tolerance)
35 {
36 BOOST_CHECK_MESSAGE( equals::apply(mls_sym_diff, mls_output, tolerance),
37 "case id: " << case_id
38 << ", sym diff L/L: " << bg::wkt(geometry1)
39 << " " << bg::wkt(geometry2)
40 << " -> Expected: " << bg::wkt(mls_sym_diff)
41 << " computed: " << bg::wkt(mls_output) );
42 }
43
44 template
45 <
46 typename Geometry1, typename Geometry2,
47 typename MultiLineString
48 >
49 class test_sym_difference_of_geometries
50 {
51 private:
52 static inline void base_test(Geometry1 const& geometry1,
53 Geometry2 const& geometry2,
54 MultiLineString const& mls_sym_diff,
55 std::string const& case_id,
56 double tolerance,
57 bool test_vector_and_deque = false)
58 {
59 static bool vector_deque_already_tested = false;
60
61 typedef typename boost::range_value<MultiLineString>::type LineString;
62 typedef std::vector<LineString> linestring_vector;
63 typedef std::deque<LineString> linestring_deque;
64
65 MultiLineString mls_output;
66
67 linestring_vector ls_vector_output;
68 linestring_deque ls_deque_output;
69
70 // Check strategy passed explicitly
71 typedef typename bg::strategy::relate::services::default_strategy
72 <
73 Geometry1, Geometry2
74 >::type strategy_type;
75 bg::sym_difference(geometry1, geometry2, mls_output, strategy_type());
76
77 check_result(geometry1, geometry2, mls_output, mls_sym_diff, case_id, tolerance);
78
79 // Check normal behaviour
80 bg::clear(mls_output);
81 bg::sym_difference(geometry1, geometry2, mls_output);
82
83 check_result(geometry1, geometry2, mls_output, mls_sym_diff, case_id, tolerance);
84
85 set_operation_output("sym_difference", case_id,
86 geometry1, geometry2, mls_output);
87
88 #ifdef BOOST_GEOMETRY_TEST_DEBUG
89 std::cout << "Geometry #1: " << bg::wkt(geometry1) << std::endl;
90 std::cout << "Geometry #2: " << bg::wkt(geometry2) << std::endl;
91 std::cout << "sym_difference : " << bg::wkt(mls_output) << std::endl;
92 std::cout << "expected sym_difference : " << bg::wkt(mls_sym_diff)
93 << std::endl;
94 std::cout << std::endl;
95 std::cout << "************************************" << std::endl;
96 std::cout << std::endl;
97 std::cout << std::endl;
98 #endif
99
100 if ( !vector_deque_already_tested && test_vector_and_deque )
101 {
102 vector_deque_already_tested = true;
103 #ifdef BOOST_GEOMETRY_TEST_DEBUG
104 std::cout << std::endl;
105 std::cout << "Testing with vector and deque as output container..."
106 << std::endl;
107 #endif
108 bg::sym_difference(geometry1, geometry2, ls_vector_output);
109 bg::sym_difference(geometry1, geometry2, ls_deque_output);
110
111 BOOST_CHECK(multilinestring_equals
112 <
113 false
114 >::apply(mls_sym_diff, ls_vector_output, tolerance));
115
116 BOOST_CHECK(multilinestring_equals
117 <
118 false
119 >::apply(mls_sym_diff, ls_deque_output, tolerance));
120
121 #ifdef BOOST_GEOMETRY_TEST_DEBUG
122 std::cout << "Done!" << std::endl << std::endl;
123 #endif
124 }
125
126 // check the symmetric difference where the order of the two
127 // geometries is reversed
128 bg::clear(mls_output);
129 bg::sym_difference(geometry2, geometry1, mls_output);
130
131 BOOST_CHECK_MESSAGE( equals::apply(mls_sym_diff, mls_output, tolerance),
132 "case id: " << case_id
133 << ", sym diff L/L: " << bg::wkt(geometry2)
134 << " " << bg::wkt(geometry1)
135 << " -> Expected: " << bg::wkt(mls_sym_diff)
136 << " computed: " << bg::wkt(mls_output) );
137
138 #ifdef BOOST_GEOMETRY_TEST_DEBUG
139 std::cout << "Geometry #1: " << bg::wkt(geometry2) << std::endl;
140 std::cout << "Geometry #2: " << bg::wkt(geometry1) << std::endl;
141 std::cout << "sym_difference : " << bg::wkt(mls_output) << std::endl;
142 std::cout << "expected sym_difference : " << bg::wkt(mls_sym_diff)
143 << std::endl;
144 std::cout << std::endl;
145 std::cout << "************************************" << std::endl;
146 std::cout << std::endl;
147 std::cout << std::endl;
148 #endif
149 }
150
151
152 public:
153 static inline void apply(Geometry1 const& geometry1,
154 Geometry2 const& geometry2,
155 MultiLineString const& mls_sym_diff,
156 std::string const& case_id,
157 double tolerance
158 = std::numeric_limits<double>::epsilon())
159 {
160 #ifdef BOOST_GEOMETRY_TEST_DEBUG
161 std::cout << "test case: " << case_id << std::endl;
162 std::stringstream sstr;
163 sstr << "svgs/" << case_id << ".svg";
164 #ifdef TEST_WITH_SVG
165 to_svg(geometry1, geometry2, sstr.str());
166 #endif
167 #endif
168
169 Geometry1 rg1(geometry1);
170 bg::reverse<Geometry1>(rg1);
171
172 Geometry2 rg2(geometry2);
173 bg::reverse<Geometry2>(rg2);
174
175 test_get_turns_ll_invariance<>::apply(geometry1, geometry2);
176 #ifdef BOOST_GEOMETRY_TEST_DEBUG
177 std::cout << std::endl
178 << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
179 << std::endl << std::endl;
180 #endif
181 test_get_turns_ll_invariance<>::apply(rg1, geometry2);
182
183 base_test(geometry1, geometry2, mls_sym_diff, case_id, tolerance, true);
184 // base_test(geometry1, rg2, mls_sym_diff);
185 // base_test(rg1, geometry2, mls_sym_diff);
186 base_test(rg1, rg2, mls_sym_diff, case_id, tolerance);
187
188 #ifdef BOOST_GEOMETRY_TEST_DEBUG
189 std::cout << std::endl;
190 std::cout << std::endl;
191 #endif
192 }
193 };
194
195
196 #endif // BOOST_GEOMETRY_TEST_SYM_DIFFERENCE_LINEAR_LINEAR_HPP