35 #include <unordered_set> 36 #include "DGtal/base/Common.h" 37 #include "DGtal/base/SetFunctions.h" 38 #include "DGtalCatch.h" 41 using namespace DGtal;
44 using DGtal::functions::setops::operator&;
45 using DGtal::functions::setops::operator-;
46 using DGtal::functions::setops::operator^;
50 TEMPLATE_TEST_CASE_4(
"SetFunctions module unit tests",
"[set_functions]",
55 std::unordered_set<int> )
58 int S1[ 10 ] = { 4, 15, 20, 17, 9, 7, 13, 12, 1, 3 };
59 int S2[ 6 ] = { 17, 14, 19, 2, 3, 4 };
60 Container C1( S1, S1 + 10 );
61 Container C2( S2, S2 + 6 );
62 Container C1_minus_C2 = C1 - C2;
63 REQUIRE( C1_minus_C2.size() == 7 );
64 Container C2_minus_C1 = C2 - C1;
65 REQUIRE( C2_minus_C1.size() == 3 );
66 REQUIRE( ( C1_minus_C2 - C1 ).size() == 0 );
67 REQUIRE( ( C2_minus_C1 - C2 ).size() == 0 );
68 REQUIRE( ( C1_minus_C2 - C2 ).size() == C1_minus_C2.size() );
69 REQUIRE( ( C2_minus_C1 - C1 ).size() == C2_minus_C1.size() );
72 REQUIRE( C1_union_C2.size() == 13 );
73 REQUIRE( C1_union_C2.size() == C2_union_C1.size() );
74 REQUIRE( ( DGtal::functions::setops::operator|(C1_minus_C2 , C2) ).size() == (DGtal::functions::setops::operator|(C2_minus_C1 , C1) ).size() );
76 Container C1_intersection_C2 = C1 & C2;
77 Container C2_intersection_C1 = C2 & C1;
78 REQUIRE( C1_intersection_C2.size() == 3 );
79 REQUIRE( C1_intersection_C2.size() == C2_intersection_C1.size() );
81 REQUIRE( ( DGtal::functions::setops::operator|(DGtal::functions::setops::operator|(C1_minus_C2 , C1_intersection_C2) , C2_minus_C1) ).size() == C1_union_C2.size() );
83 Container C1_symdiff_C2 = C1 ^ C2;
84 Container C2_symdiff_C1 = C2 ^ C1;
85 REQUIRE( C1_symdiff_C2.size() == C2_symdiff_C1.size() );
86 REQUIRE( C1_symdiff_C2.size() == ( C1_union_C2 - C1_intersection_C2 ).size() );
89 REQUIRE(
isEqual( C1_symdiff_C2, C1_union_C2 - C1_intersection_C2 ) );
90 REQUIRE(
isEqual( C1_symdiff_C2, DGtal::functions::setops::operator|(C1_minus_C2 , C2_minus_C1) ) );
91 REQUIRE(
isEqual( DGtal::functions::setops::operator|(DGtal::functions::setops::operator|(C1_minus_C2 , C1_intersection_C2) , C2_minus_C1), C1_union_C2 ) );
106 static const int NB = 10000;
107 static std::default_random_engine generator;
108 static std::uniform_int_distribution<int> distribution(1,NB);
112 return distribution(generator);
116 TEMPLATE_TEST_CASE_1(
"SetFunctions benchmark operator | (sequences)",
"[set_functions]",
120 typedef typename Container::size_type Size;
123 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
124 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
125 Container A( S1.begin(), S1.end() );
126 Container B( S2.begin(), S2.end() );
129 std::random_shuffle( A.begin(), A.end() );
130 std::random_shuffle( B.begin(), B.end() );
132 SECTION(
" - benchmark set operators |" )
136 Size size_A = A.size();
137 Size size_B = B.size();
138 Size size_AorB = AorB.size();
142 TEMPLATE_TEST_CASE_2(
"SetFunctions benchmark operator | (sets)",
"[set_functions]",
145 std::unordered_set<int> )
147 typedef typename Container::size_type Size;
149 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
151 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
152 Container A( S1.begin(), S1.end() );
153 Container B( S2.begin(), S2.end() );
156 SECTION(
" - benchmark set operators |" )
160 Size size_A = A.size();
161 Size size_B = B.size();
162 Size size_AorB = AorB.size();
167 TEMPLATE_TEST_CASE_1(
"SetFunctions benchmark operator & (sequences)",
"[set_functions]",
171 typedef typename Container::size_type Size;
173 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
175 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
176 Container A( S1.begin(), S1.end() );
177 Container B( S2.begin(), S2.end() );
180 std::random_shuffle( A.begin(), A.end() );
181 std::random_shuffle( B.begin(), B.end() );
183 SECTION(
" - benchmark set operators &" )
187 Size size_A = A.size();
188 Size size_B = B.size();
189 Size size_AandB = AandB.size();
190 REQUIRE( size_AandB <= std::min( size_A, size_B ) );
193 TEMPLATE_TEST_CASE_2(
"SetFunctions benchmark operator & (sets)",
"[set_functions]",
196 std::unordered_set<int> )
198 typedef typename Container::size_type Size;
200 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
202 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
203 Container A( S1.begin(), S1.end() );
204 Container B( S2.begin(), S2.end() );
207 SECTION(
" - benchmark set operators &" )
211 Size size_A = A.size();
212 Size size_B = B.size();
213 Size size_AandB = AandB.size();
214 REQUIRE( size_AandB <= std::min( size_A, size_B ) );
219 TEMPLATE_TEST_CASE_1(
"SetFunctions benchmark operator - (sequences)",
"[set_functions]",
223 typedef typename Container::size_type Size;
225 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
227 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
228 Container A( S1.begin(), S1.end() );
229 Container B( S2.begin(), S2.end() );
232 std::random_shuffle( A.begin(), A.end() );
233 std::random_shuffle( B.begin(), B.end() );
235 SECTION(
" - benchmark set operators -" )
239 Size size_A = A.size();
240 Size size_B = B.size();
241 Size size_AminusB = AminusB.size();
242 REQUIRE( size_AminusB <= size_A );
245 TEMPLATE_TEST_CASE_2(
"SetFunctions benchmark operator - (sets)",
"[set_functions]",
248 std::unordered_set<int> )
250 typedef typename Container::size_type Size;
252 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
254 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
255 Container A( S1.begin(), S1.end() );
256 Container B( S2.begin(), S2.end() );
259 SECTION(
" - benchmark set operators -" )
263 Size size_A = A.size();
264 Size size_B = B.size();
265 Size size_AminusB = AminusB.size();
266 REQUIRE( size_AminusB <= size_A );
271 TEMPLATE_TEST_CASE_1(
"SetFunctions benchmark operator ^ (sequences)",
"[set_functions]",
275 typedef typename Container::size_type Size;
277 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
279 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
280 Container A( S1.begin(), S1.end() );
281 Container B( S2.begin(), S2.end() );
284 std::random_shuffle( A.begin(), A.end() );
285 std::random_shuffle( B.begin(), B.end() );
287 SECTION(
" - benchmark set operators ^" )
291 Size size_A = A.size();
292 Size size_B = B.size();
293 Size size_AxorB = AxorB.size();
297 TEMPLATE_TEST_CASE_2(
"SetFunctions benchmark operator ^ (sets)",
"[set_functions]",
300 std::unordered_set<int> )
302 typedef typename Container::size_type Size;
304 for (
int i = 0; i < NB; ++i ) S1.insert( randomNB( ) );
306 for (
int i = 0; i < NB; ++i ) S2.insert( randomNB( ) );
307 Container A( S1.begin(), S1.end() );
308 Container B( S2.begin(), S2.end() );
311 SECTION(
" - benchmark set operators ^" )
315 Size size_A = A.size();
316 Size size_B = B.size();
317 Size size_AxorB = AxorB.size();
REQUIRE(domain.isInside(aPoint))
bool isEqual(const Container &S1, const Container &S2)
DGtal is the top-level namespace which contains all DGtal functions and types.
bool isSubset(const Container &S1, const Container &S2)
functions namespace gathers all DGtal functionsxs.
Container operator|(const Container &S1, const Container &S2)
SECTION("Testing constant forward iterators")