@@ -26,13 +26,12 @@ namespace lib_interval_tree
26
26
// ############################################################################################################
27
27
using default_interval_value_type = int ;
28
28
// ############################################################################################################
29
- template <typename numerical_type, typename interval_kind_ = closed, typename tree_hooks = hooks::regular >
29
+ template <typename numerical_type, typename interval_kind_ = closed>
30
30
struct interval
31
31
{
32
32
public:
33
33
using value_type = numerical_type;
34
34
using interval_kind = interval_kind_;
35
- friend tree_hooks;
36
35
37
36
/* *
38
37
* Constructs an interval. low MUST be smaller than high.
@@ -180,7 +179,7 @@ namespace lib_interval_tree
180
179
/* *
181
180
* Creates a safe interval that puts the lower bound left automatically.
182
181
*/
183
- template <typename numerical_type, typename interval_kind_ = closed, typename tree_hooks = hooks::regular >
182
+ template <typename numerical_type, typename interval_kind_ = closed>
184
183
#if __cplusplus >= 201703L
185
184
constexpr
186
185
#endif
@@ -192,8 +191,7 @@ namespace lib_interval_tree
192
191
// ############################################################################################################
193
192
template <
194
193
typename numerical_type = default_interval_value_type,
195
- typename interval_type_ = interval<numerical_type, closed, hooks::regular>,
196
- typename tree_hooks = hooks::regular>
194
+ typename interval_type_ = interval<numerical_type, closed>>
197
195
class node
198
196
{
199
197
private:
@@ -202,15 +200,16 @@ namespace lib_interval_tree
202
200
public:
203
201
using interval_type = interval_type_;
204
202
using value_type = numerical_type;
205
- using tree_hooks_type = tree_hooks;
206
- friend tree_hooks_type;
207
203
208
204
public:
209
- friend lib_interval_tree::interval_tree<interval_type, tree_hooks>;
210
- friend lib_interval_tree::const_interval_tree_iterator<node<numerical_type, interval_type, tree_hooks>, true >;
211
- friend lib_interval_tree::const_interval_tree_iterator<node<numerical_type, interval_type, tree_hooks>, false >;
212
- friend lib_interval_tree::interval_tree_iterator<node<numerical_type, interval_type, tree_hooks>, true >;
213
- friend lib_interval_tree::interval_tree_iterator<node<numerical_type, interval_type, tree_hooks>, false >;
205
+ template <typename interval_type, typename hooks_type>
206
+ friend class interval_tree ;
207
+
208
+ template <typename node_type, bool reverse, typename tree_hooks>
209
+ friend class const_interval_tree_iterator ;
210
+
211
+ template <typename node_type, bool reverse, typename tree_hooks>
212
+ friend class interval_tree_iterator ;
214
213
215
214
template <typename T>
216
215
friend void increment (T& iter);
@@ -345,14 +344,13 @@ namespace lib_interval_tree
345
344
rb_color color_;
346
345
};
347
346
// ############################################################################################################
348
- template <typename node_type, typename owner_type>
347
+ template <typename node_type, typename owner_type, typename tree_hooks >
349
348
class basic_interval_tree_iterator : public std ::forward_iterator_tag
350
349
{
351
350
public:
352
- friend interval_tree<typename node_type::interval_type, typename node_type::tree_hooks_type>;
353
- friend typename node_type::tree_hooks_type;
351
+ friend interval_tree<typename node_type::interval_type, tree_hooks>;
354
352
355
- using tree_hooks_type = typename node_type::tree_hooks_type ;
353
+ using tree_hooks_type = tree_hooks ;
356
354
using tree_type = interval_tree<typename node_type::interval_type, tree_hooks_type>;
357
355
using value_type = node_type;
358
356
@@ -421,16 +419,17 @@ namespace lib_interval_tree
421
419
template <typename T>
422
420
inline void increment_reverse (T& iter);
423
421
// ############################################################################################################
424
- template <typename node_type, bool reverse>
422
+ template <typename node_type, bool reverse, typename tree_hooks >
425
423
class const_interval_tree_iterator
426
424
: public basic_interval_tree_iterator<
427
425
node_type,
428
- interval_tree<typename node_type::interval_type, typename node_type::tree_hooks_type> const *>
426
+ interval_tree<typename node_type::interval_type, tree_hooks> const *,
427
+ tree_hooks>
429
428
{
430
429
public:
431
- using tree_hooks_type = typename node_type::tree_hooks_type ;
430
+ using tree_hooks_type = tree_hooks ;
432
431
using tree_type = interval_tree<typename node_type::interval_type, tree_hooks_type>;
433
- using iterator_base = basic_interval_tree_iterator<node_type, tree_type const *>;
432
+ using iterator_base = basic_interval_tree_iterator<node_type, tree_type const *, tree_hooks >;
434
433
using value_type = typename iterator_base::value_type;
435
434
using iterator_base::node_;
436
435
using iterator_base::owner_;
@@ -524,20 +523,21 @@ namespace lib_interval_tree
524
523
525
524
private:
526
525
const_interval_tree_iterator (node_type const * node, tree_type const * owner)
527
- : basic_interval_tree_iterator<node_type, tree_type const *>{node, owner}
526
+ : basic_interval_tree_iterator<node_type, tree_type const *, tree_hooks >{node, owner}
528
527
{}
529
528
};
530
529
// ############################################################################################################
531
- template <typename node_type, bool reverse = false >
530
+ template <typename node_type, bool reverse, typename tree_hooks >
532
531
class interval_tree_iterator
533
532
: public basic_interval_tree_iterator<
534
533
node_type,
535
- interval_tree<typename node_type::interval_type, typename node_type::tree_hooks_type>*>
534
+ interval_tree<typename node_type::interval_type, tree_hooks>*,
535
+ tree_hooks>
536
536
{
537
537
public:
538
- using tree_hooks_type = typename node_type::tree_hooks_type ;
538
+ using tree_hooks_type = tree_hooks ;
539
539
using tree_type = interval_tree<typename node_type::interval_type, tree_hooks_type>;
540
- using iterator_base = basic_interval_tree_iterator<node_type, tree_type*>;
540
+ using iterator_base = basic_interval_tree_iterator<node_type, tree_type*, tree_hooks >;
541
541
using value_type = typename iterator_base::value_type;
542
542
using iterator_base::node_;
543
543
using iterator_base::owner_;
@@ -631,7 +631,7 @@ namespace lib_interval_tree
631
631
632
632
private:
633
633
interval_tree_iterator (node_type* node, tree_type* owner)
634
- : basic_interval_tree_iterator<node_type, tree_type*>{node, owner}
634
+ : basic_interval_tree_iterator<node_type, tree_type*, tree_hooks >{node, owner}
635
635
{}
636
636
};
637
637
// ############################################################################################################
@@ -711,14 +711,14 @@ namespace lib_interval_tree
711
711
// Node type:
712
712
using node_type = std::conditional_t <
713
713
std::is_same_v<typename tree_hooks::node_type, void >,
714
- node<value_type, interval_type, tree_hooks >,
714
+ node<value_type, interval_type>,
715
715
typename tree_hooks::node_type>;
716
716
717
717
// Iterators:
718
- using iterator = interval_tree_iterator<node_type, false >;
719
- using const_iterator = const_interval_tree_iterator<node_type, false >;
720
- using reverse_iterator = interval_tree_iterator<node_type, true >;
721
- using const_reverse_iterator = const_interval_tree_iterator<node_type, true >;
718
+ using iterator = interval_tree_iterator<node_type, false , tree_hooks >;
719
+ using const_iterator = const_interval_tree_iterator<node_type, false , tree_hooks >;
720
+ using reverse_iterator = interval_tree_iterator<node_type, true , tree_hooks >;
721
+ using const_reverse_iterator = const_interval_tree_iterator<node_type, true , tree_hooks >;
722
722
723
723
// Size type:
724
724
using size_type = std::conditional_t <
@@ -729,10 +729,10 @@ namespace lib_interval_tree
729
729
using this_type = interval_tree<interval_type, tree_hooks>;
730
730
731
731
public:
732
- friend const_interval_tree_iterator<node_type, true >;
733
- friend const_interval_tree_iterator<node_type, false >;
734
- friend interval_tree_iterator<node_type, true >;
735
- friend interval_tree_iterator<node_type, false >;
732
+ friend const_interval_tree_iterator<node_type, true , tree_hooks >;
733
+ friend const_interval_tree_iterator<node_type, false , tree_hooks >;
734
+ friend interval_tree_iterator<node_type, true , tree_hooks >;
735
+ friend interval_tree_iterator<node_type, false , tree_hooks >;
736
736
friend tree_hooks;
737
737
738
738
template <typename T>
@@ -847,6 +847,8 @@ namespace lib_interval_tree
847
847
insert_fixup (z);
848
848
recalculate_max (z);
849
849
850
+ tree_hooks::template on_after_insert<this_type>(*this , z);
851
+
850
852
++size_;
851
853
return {z, this };
852
854
}
0 commit comments