@@ -16,7 +16,7 @@ struct Oracle
16
16
template <typename numerical_type, typename interval_kind_ = lib_interval_tree::closed>
17
17
class OracleInterval : public lib_interval_tree ::interval<numerical_type, interval_kind_>
18
18
{
19
- public:
19
+ public:
20
20
using lib_interval_tree::interval<numerical_type, interval_kind_>::low_;
21
21
using lib_interval_tree::interval<numerical_type, interval_kind_>::high_;
22
22
@@ -60,26 +60,27 @@ class OracleInterval : public lib_interval_tree::interval<numerical_type, interv
60
60
{
61
61
return OracleInterval{oracle_, std::min (low_, other.low_ ), std::max (high_, other.high_ )};
62
62
}
63
- private:
63
+
64
+ private:
64
65
Oracle* oracle_;
65
66
};
66
67
67
68
template <typename numerical_type, typename interval_kind_ = lib_interval_tree::closed>
68
- OracleInterval <numerical_type, interval_kind_> makeSafeOracleInterval (Oracle* oracle, numerical_type lhs, numerical_type rhs)
69
+ OracleInterval<numerical_type, interval_kind_>
70
+ makeSafeOracleInterval (Oracle* oracle, numerical_type lhs, numerical_type rhs)
69
71
{
70
- return OracleInterval <numerical_type, interval_kind_>{oracle, std::min (lhs, rhs), std::max (lhs, rhs)};
72
+ return OracleInterval<numerical_type, interval_kind_>{oracle, std::min (lhs, rhs), std::max (lhs, rhs)};
71
73
}
72
74
73
- class EraseTests
74
- : public ::testing::Test
75
+ class EraseTests : public ::testing::Test
75
76
{
76
- public:
77
+ public:
77
78
using interval_type = OracleInterval<int >;
78
79
79
- public:
80
+ public:
80
81
auto makeTree ()
81
82
{
82
- lib_interval_tree::interval_tree_t <int > regularTree;
83
+ lib_interval_tree::interval_tree_t <int > regularTree;
83
84
regularTree.insert ({16 , 21 });
84
85
regularTree.insert ({8 , 9 });
85
86
regularTree.insert ({25 , 30 });
@@ -93,12 +94,12 @@ class EraseTests
93
94
return regularTree;
94
95
}
95
96
96
- protected:
97
+ protected:
97
98
Oracle oracle;
98
- lib_interval_tree::interval_tree <OracleInterval<int >> tree;
99
+ lib_interval_tree::interval_tree<OracleInterval<int >> tree;
99
100
std::default_random_engine gen;
100
- std::uniform_int_distribution <int > distSmall{-500 , 500 };
101
- std::uniform_int_distribution <int > distLarge{-50000 , 50000 };
101
+ std::uniform_int_distribution<int > distSmall{-500 , 500 };
102
+ std::uniform_int_distribution<int > distLarge{-50000 , 50000 };
102
103
};
103
104
104
105
TEST_F (EraseTests, EraseSingleElement)
@@ -170,7 +171,7 @@ TEST_F(EraseTests, RandomEraseTest)
170
171
171
172
for (int i = 0 ; i != deleteAmount; ++i)
172
173
{
173
- std::uniform_int_distribution <int > dist{0 , amount - i - 1 };
174
+ std::uniform_int_distribution<int > dist{0 , amount - i - 1 };
174
175
auto end = dist (gen);
175
176
auto iter = tree.begin ();
176
177
for (int j = 0 ; j != end; ++j)
@@ -183,16 +184,14 @@ TEST_F(EraseTests, RandomEraseTest)
183
184
testTreeHeightHealth (tree);
184
185
}
185
186
186
-
187
-
188
187
TEST_F (EraseTests, MassiveDeleteEntireTreeWithEraseReturnIterator)
189
188
{
190
189
constexpr int amount = 1000 ;
191
190
192
191
for (int i = 0 ; i != amount; ++i)
193
192
tree.insert (makeSafeOracleInterval (&oracle, distSmall (gen), distSmall (gen)));
194
193
195
- for (auto iter = tree.begin (); !tree.empty ();)
194
+ for (auto iter = tree.begin (); !tree.empty ();)
196
195
{
197
196
iter = tree.erase (iter);
198
197
}
@@ -255,11 +254,119 @@ TEST_F(EraseTests, CanEraseEntireTreeUsingReturnedIterator)
255
254
256
255
TEST_F (EraseTests, FromNuiTest)
257
256
{
258
- lib_interval_tree::interval_tree_t <int > tree;
257
+ lib_interval_tree::interval_tree_t <int > tree;
259
258
tree.insert ({0 , 0 });
260
259
tree.insert ({4 , 4 });
261
260
tree.insert ({13 , 13 });
262
261
263
262
auto iter = tree.erase (tree.find ({4 , 4 }));
264
263
EXPECT_EQ (*iter, (decltype (tree)::interval_type{13 , 13 })) << *iter;
265
264
}
265
+
266
+ TEST_F (EraseTests, EraseRangeOnEmptyTreeDoesNothing)
267
+ {
268
+ lib_interval_tree::interval_tree_t <int > tree;
269
+ ASSERT_NO_FATAL_FAILURE (tree.erase_range ({0 , 10 }, false ));
270
+ EXPECT_TRUE (tree.empty ());
271
+ }
272
+
273
+ TEST_F (EraseTests, EraseRangeOnIntervalInsideRangeIsRemoved)
274
+ {
275
+ lib_interval_tree::interval_tree_t <int > tree;
276
+ tree.insert ({0 , 10 });
277
+
278
+ tree.erase_range ({-10 , 20 }, false );
279
+ EXPECT_TRUE (tree.empty ());
280
+ }
281
+
282
+ TEST_F (EraseTests, EraseRangeOnIntervalEncompassingRangeIsRemoved)
283
+ {
284
+ lib_interval_tree::interval_tree_t <int > tree;
285
+ tree.insert ({0 , 10 });
286
+
287
+ tree.erase_range ({3 , 5 }, false );
288
+ EXPECT_TRUE (tree.empty ());
289
+ }
290
+
291
+ TEST_F (EraseTests, NonOverlappingIntervalIsNotRemoved)
292
+ {
293
+ lib_interval_tree::interval_tree_t <int > tree;
294
+ tree.insert ({0 , 10 });
295
+
296
+ tree.erase_range ({20 , 30 }, false );
297
+ EXPECT_EQ (tree.size (), 1 );
298
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{0 , 10 }));
299
+ }
300
+
301
+ TEST_F (EraseTests, NonOverlappingIntervalIsNotRemoved2)
302
+ {
303
+ lib_interval_tree::interval_tree_t <int > tree;
304
+ tree.insert ({0 , 10 });
305
+ tree.insert ({25 , 35 });
306
+
307
+ tree.erase_range ({20 , 30 }, false );
308
+ EXPECT_EQ (tree.size (), 1 );
309
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{0 , 10 }));
310
+ }
311
+
312
+ TEST_F (EraseTests, EraseRangeOnIntervalWithLeftSlice)
313
+ {
314
+ lib_interval_tree::interval_tree_t <int > tree;
315
+ tree.insert ({0 , 10 });
316
+
317
+ tree.erase_range ({-5 , 5 }, true );
318
+ EXPECT_EQ (tree.size (), 1 );
319
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{5 , 10 }));
320
+ }
321
+
322
+ TEST_F (EraseTests, EraseRangeOnIntervalWithRightSlice)
323
+ {
324
+ lib_interval_tree::interval_tree_t <int > tree;
325
+ tree.insert ({0 , 10 });
326
+
327
+ tree.erase_range ({5 , 15 }, true );
328
+ EXPECT_EQ (tree.size (), 1 );
329
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{0 , 5 }));
330
+ }
331
+
332
+ TEST_F (EraseTests, EraseRangeMiddleCutOut)
333
+ {
334
+ lib_interval_tree::interval_tree_t <int > tree;
335
+ tree.insert ({0 , 10 });
336
+
337
+ tree.erase_range ({3 , 5 }, true );
338
+ EXPECT_EQ (tree.size (), 2 );
339
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{0 , 3 }));
340
+ EXPECT_EQ (*(++tree.begin ()), (decltype (tree)::interval_type{5 , 10 }));
341
+ }
342
+
343
+ TEST_F (EraseTests, EraseRangeLeftSliceIsNotReinsertedIfParamIsFalse)
344
+ {
345
+ lib_interval_tree::interval_tree_t <int > tree;
346
+ tree.insert ({0 , 10 });
347
+
348
+ tree.erase_range ({-5 , 5 }, false );
349
+ EXPECT_TRUE (tree.empty ());
350
+ }
351
+
352
+ TEST_F (EraseTests, EraseRangeRightSliceIsNotReinsertedIfParamIsFalse)
353
+ {
354
+ lib_interval_tree::interval_tree_t <int > tree;
355
+ tree.insert ({0 , 10 });
356
+
357
+ tree.erase_range ({5 , 15 }, false );
358
+ EXPECT_TRUE (tree.empty ());
359
+ }
360
+
361
+ TEST_F (EraseTests, SlicesAreReinsertedWithMultioverlap)
362
+ {
363
+ lib_interval_tree::interval_tree_t <int > tree;
364
+ tree.insert ({0 , 10 });
365
+ tree.insert ({5 , 15 });
366
+ tree.insert ({10 , 20 });
367
+
368
+ tree.erase_range ({3 , 12 }, true );
369
+ EXPECT_EQ (tree.size (), 2 );
370
+ EXPECT_EQ (*tree.begin (), (decltype (tree)::interval_type{0 , 3 }));
371
+ EXPECT_EQ (*(++tree.begin ()), (decltype (tree)::interval_type{12 , 20 }));
372
+ }
0 commit comments