]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/geometry/test/algorithms/set_operations/difference/test_difference_linear_linear.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / geometry / test / algorithms / set_operations / difference / test_difference_linear_linear.hpp
CommitLineData
7c673cae
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2014-2015, Oracle and/or its affiliates.
4
5// Licensed under the Boost Software License version 1.0.
6// http://www.boost.org/users/license.html
7
8// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
9
10#ifndef BOOST_GEOMETRY_TEST_DIFFERENCE_LINEAR_LINEAR_HPP
11#define BOOST_GEOMETRY_TEST_DIFFERENCE_LINEAR_LINEAR_HPP
12
13#include <limits>
14
15#include <boost/geometry/geometry.hpp>
16#include "../test_set_ops_linear_linear.hpp"
17#include "../check_turn_less.hpp"
18#include <from_wkt.hpp>
19#include <to_svg.hpp>
20
21
22//==================================================================
23//==================================================================
24// difference of (linear) geometries
25//==================================================================
26//==================================================================
27
28template
29<
30 typename Geometry1, typename Geometry2,
31 typename MultiLineString
32>
33class test_difference_of_geometries
34{
35private:
36 static inline void base_test(Geometry1 const& geometry1,
37 Geometry2 const& geometry2,
38 MultiLineString const& mls_diff,
39 std::string const& case_id,
40 double tolerance,
41 bool test_vector_and_deque = true,
42 bool reverse_output_for_checking = false)
43 {
44 static bool vector_deque_already_tested = false;
45
46 typedef typename boost::range_value<MultiLineString>::type LineString;
47 typedef std::vector<LineString> linestring_vector;
48 typedef std::deque<LineString> linestring_deque;
49
50 MultiLineString mls_output;
51
52 linestring_vector ls_vector_output;
53 linestring_deque ls_deque_output;
54
55 bg::difference(geometry1, geometry2, mls_output);
56
57 if ( reverse_output_for_checking )
58 {
59 bg::reverse(mls_output);
60 }
61
62 BOOST_CHECK_MESSAGE( equals::apply(mls_diff, mls_output, tolerance),
63 "case id: " << case_id
64 << ", difference L/L: " << bg::wkt(geometry1)
65 << " " << bg::wkt(geometry2)
66 << " -> Expected: " << bg::wkt(mls_diff)
67 << std::setprecision(20)
68 << " computed: " << bg::wkt(mls_output) );
69
70 set_operation_output("difference", case_id,
71 geometry1, geometry2, mls_output);
72
73 if ( !vector_deque_already_tested && test_vector_and_deque )
74 {
75 vector_deque_already_tested = true;
76#ifdef BOOST_GEOMETRY_TEST_DEBUG
77 std::cout << std::endl;
78 std::cout << "Testing with vector and deque as output container..."
79 << std::endl;
80#endif
81 bg::difference(geometry1, geometry2, ls_vector_output);
82 bg::difference(geometry1, geometry2, ls_deque_output);
83
84 BOOST_CHECK(multilinestring_equals
85 <
86 false
87 >::apply(mls_diff, ls_vector_output, tolerance));
88
89 BOOST_CHECK(multilinestring_equals
90 <
91 false
92 >::apply(mls_diff, ls_deque_output, tolerance));
93
94#ifdef BOOST_GEOMETRY_TEST_DEBUG
95 std::cout << "Done!" << std::endl << std::endl;
96#endif
97 }
98
99#ifdef BOOST_GEOMETRY_TEST_DEBUG
100 std::cout << "Geometry #1: " << bg::wkt(geometry1) << std::endl;
101 std::cout << "Geometry #2: " << bg::wkt(geometry2) << std::endl;
102 std::cout << "difference : " << bg::wkt(mls_output) << std::endl;
103 std::cout << "expected difference : " << bg::wkt(mls_diff) << std::endl;
104 std::cout << std::endl;
105 std::cout << "************************************" << std::endl;
106 std::cout << std::endl;
107 std::cout << std::endl;
108#endif
109
110 check_turn_less::apply(geometry1, geometry2);
111 }
112
113
114public:
115 static inline void apply(Geometry1 const& geometry1,
116 Geometry2 const& geometry2,
117 MultiLineString const& mls_diff,
118 std::string const& case_id,
119 double tolerance
120 = std::numeric_limits<double>::epsilon())
121 {
122#ifdef BOOST_GEOMETRY_TEST_DEBUG
123 std::cout << "test case: " << case_id << std::endl;
124 std::stringstream sstr;
125 sstr << "svgs/" << case_id << ".svg";
126#ifdef TEST_WITH_SVG
127 to_svg(geometry1, geometry2, sstr.str());
128#endif
129#endif
130
131 Geometry1 rg1(geometry1);
132 bg::reverse<Geometry1>(rg1);
133
134 Geometry2 rg2(geometry2);
135 bg::reverse<Geometry2>(rg2);
136
137 test_get_turns_ll_invariance<>::apply(geometry1, geometry2);
138#ifdef BOOST_GEOMETRY_TEST_DEBUG
139 std::cout << std::endl
140 << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
141 << std::endl << std::endl;
142#endif
143 test_get_turns_ll_invariance<>::apply(rg1, geometry2);
144
145 base_test(geometry1, geometry2, mls_diff, case_id, tolerance);
146 base_test(geometry1, rg2, mls_diff, case_id, tolerance, false);
147 base_test(rg1, geometry2, mls_diff, case_id, tolerance, false, true);
148 base_test(rg1, rg2, mls_diff, case_id, tolerance, false, true);
149
150#ifdef BOOST_GEOMETRY_TEST_DEBUG
151 std::cout << std::endl;
152 std::cout << std::endl;
153#endif
154 }
155};
156
157
158#endif // BOOST_GEOMETRY_TEST_DIFFERENCE_LINEAR_LINEAR_HPP