@@ -26,13 +26,12 @@ namespace lib_interval_tree
2626 // ############################################################################################################
2727 using default_interval_value_type = int ;
2828 // ############################################################################################################
29- template <typename numerical_type, typename interval_kind_ = closed, typename tree_hooks = hooks::regular >
29+ template <typename numerical_type, typename interval_kind_ = closed>
3030 struct interval
3131 {
3232 public:
3333 using value_type = numerical_type;
3434 using interval_kind = interval_kind_;
35- friend tree_hooks;
3635
3736 /* *
3837 * Constructs an interval. low MUST be smaller than high.
@@ -180,7 +179,7 @@ namespace lib_interval_tree
180179 /* *
181180 * Creates a safe interval that puts the lower bound left automatically.
182181 */
183- template <typename numerical_type, typename interval_kind_ = closed, typename tree_hooks = hooks::regular >
182+ template <typename numerical_type, typename interval_kind_ = closed>
184183#if __cplusplus >= 201703L
185184 constexpr
186185#endif
@@ -192,8 +191,7 @@ namespace lib_interval_tree
192191 // ############################################################################################################
193192 template <
194193 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>>
197195 class node
198196 {
199197 private:
@@ -202,15 +200,16 @@ namespace lib_interval_tree
202200 public:
203201 using interval_type = interval_type_;
204202 using value_type = numerical_type;
205- using tree_hooks_type = tree_hooks;
206- friend tree_hooks_type;
207203
208204 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 ;
214213
215214 template <typename T>
216215 friend void increment (T& iter);
@@ -345,14 +344,13 @@ namespace lib_interval_tree
345344 rb_color color_;
346345 };
347346 // ############################################################################################################
348- template <typename node_type, typename owner_type>
347+ template <typename node_type, typename owner_type, typename tree_hooks >
349348 class basic_interval_tree_iterator : public std ::forward_iterator_tag
350349 {
351350 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>;
354352
355- using tree_hooks_type = typename node_type::tree_hooks_type ;
353+ using tree_hooks_type = tree_hooks ;
356354 using tree_type = interval_tree<typename node_type::interval_type, tree_hooks_type>;
357355 using value_type = node_type;
358356
@@ -421,16 +419,17 @@ namespace lib_interval_tree
421419 template <typename T>
422420 inline void increment_reverse (T& iter);
423421 // ############################################################################################################
424- template <typename node_type, bool reverse>
422+ template <typename node_type, bool reverse, typename tree_hooks >
425423 class const_interval_tree_iterator
426424 : public basic_interval_tree_iterator<
427425 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>
429428 {
430429 public:
431- using tree_hooks_type = typename node_type::tree_hooks_type ;
430+ using tree_hooks_type = tree_hooks ;
432431 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 >;
434433 using value_type = typename iterator_base::value_type;
435434 using iterator_base::node_;
436435 using iterator_base::owner_;
@@ -524,20 +523,21 @@ namespace lib_interval_tree
524523
525524 private:
526525 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}
528527 {}
529528 };
530529 // ############################################################################################################
531- template <typename node_type, bool reverse = false >
530+ template <typename node_type, bool reverse, typename tree_hooks >
532531 class interval_tree_iterator
533532 : public basic_interval_tree_iterator<
534533 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>
536536 {
537537 public:
538- using tree_hooks_type = typename node_type::tree_hooks_type ;
538+ using tree_hooks_type = tree_hooks ;
539539 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 >;
541541 using value_type = typename iterator_base::value_type;
542542 using iterator_base::node_;
543543 using iterator_base::owner_;
@@ -631,7 +631,7 @@ namespace lib_interval_tree
631631
632632 private:
633633 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}
635635 {}
636636 };
637637 // ############################################################################################################
@@ -711,14 +711,14 @@ namespace lib_interval_tree
711711 // Node type:
712712 using node_type = std::conditional_t <
713713 std::is_same_v<typename tree_hooks::node_type, void >,
714- node<value_type, interval_type, tree_hooks >,
714+ node<value_type, interval_type>,
715715 typename tree_hooks::node_type>;
716716
717717 // 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 >;
722722
723723 // Size type:
724724 using size_type = std::conditional_t <
@@ -729,10 +729,10 @@ namespace lib_interval_tree
729729 using this_type = interval_tree<interval_type, tree_hooks>;
730730
731731 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 >;
736736 friend tree_hooks;
737737
738738 template <typename T>
@@ -847,6 +847,8 @@ namespace lib_interval_tree
847847 insert_fixup (z);
848848 recalculate_max (z);
849849
850+ tree_hooks::template on_after_insert<this_type>(*this , z);
851+
850852 ++size_;
851853 return {z, this };
852854 }
0 commit comments