Skip to content

Commit 40234ea

Browse files
committed
Added on_after_insert hook and fixed some mistakes.
1 parent 1bb4a4a commit 40234ea

File tree

3 files changed

+46
-40
lines changed

3 files changed

+46
-40
lines changed

include/interval-tree/interval_tree.hpp

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

include/interval-tree/interval_tree_fwd.hpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22

33
namespace lib_interval_tree
44
{
5-
template <typename numerical_type, typename interval_kind_, typename tree_hooks>
5+
template <typename numerical_type, typename interval_kind_>
66
struct interval;
77

88
template <typename IntervalT, typename tree_hooks>
99
class interval_tree;
1010

11-
template <typename numerical_type, typename interval_type, typename tree_hooks>
11+
template <typename numerical_type, typename interval_type>
1212
class node;
1313

14-
template <typename node_type, typename owner_type>
14+
template <typename node_type, typename owner_type, typename tree_hooks>
1515
class basic_interval_tree_iterator;
1616

17-
template <typename node_type, bool reverse>
17+
template <typename node_type, bool reverse, typename tree_hooks>
1818
class const_interval_tree_iterator;
1919

20-
template <typename node_type, bool reverse>
20+
template <typename node_type, bool reverse, typename tree_hooks>
2121
class interval_tree_iterator;
2222
}

include/interval-tree/tree_hooks.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ namespace lib_interval_tree::hooks
1515
static inline void on_destroy(tree_type& tree) noexcept
1616
{}
1717

18+
template <typename tree_type>
19+
static inline void on_after_insert(tree_type& tree, typename tree_type::node_type* node) noexcept
20+
{}
21+
1822
template <typename tree_type>
1923
static inline void on_before_insert_fixup(tree_type& tree, typename tree_type::node_type* node) noexcept
2024
{}

0 commit comments

Comments
 (0)