16 std::unique_ptr<IntervalNode<T>>
_left;
17 std::unique_ptr<IntervalNode<T>>
_right;
28 uint64_t
low()
const {
34 uint64_t
max()
const {
41 std::unique_ptr<IntervalNode<T>>&
left() {
44 std::unique_ptr<IntervalNode<T>>&
right() {
93 std::unique_ptr<IntervalNode<T>>
_root;
97 uint64_t left_max =
find_max(node->left());
98 uint64_t right_max =
find_max(node->right());
99 return std::max({node->high(), left_max, right_max});
104 node = std::make_unique<IntervalNode<T>>(low, high, payload);
109 bool overlap = (low < node->high() && high > node->low());
110 bool child_is_entirely_contained_by_parent = (low >= node->low() && high <= node->high());
111 bool parent_is_entirely_contained_by_child = (node->low() >= low && node->high() <= high);
113 bool partial_overlap = overlap &&
114 !child_is_entirely_contained_by_parent &&
115 !parent_is_entirely_contained_by_child;
117 assert(!partial_overlap &&
"Partial overlap given: this should be impossible");
120 if (parent_is_entirely_contained_by_child) {
121 std::unique_ptr<IntervalNode<T>> old_parent = std::move(node);
122 node = std::make_unique<IntervalNode<T>>(low, high, payload);
123 node->set_right(std::move(old_parent));
128 if (low < node->low()) {
142 if (node->low() <= point && point <= node->high()) {
143 overlaps.push_back(node->payload());
147 if (node->left() && node->left()->max() >= point) {
152 if (node->right() && node->right()->low() <= point) {
159 void insert(uint64_t low, uint64_t high, T payload) {
160 if (
_root ==
nullptr) {
161 _root = std::make_unique<IntervalNode<T>>(low, high, payload);
169 std::vector<T> overlaps;
192 if (overlaps.empty()) {
197 return overlaps.back();
Definition IntervalTree.h:14
void set_max(uint64_t max)
Definition IntervalTree.h:60
T _payload
Definition IntervalTree.h:21
uint64_t _low
Definition IntervalTree.h:18
void set_low(uint64_t low)
Definition IntervalTree.h:54
T payload() const
Definition IntervalTree.h:37
IntervalNode(uint64_t low, uint64_t high, T payload)
Definition IntervalTree.h:23
void set_payload(T payload)
Definition IntervalTree.h:63
std::unique_ptr< IntervalNode< T > > & left()
Definition IntervalTree.h:41
uint64_t high() const
Definition IntervalTree.h:31
std::unique_ptr< IntervalNode< T > > & right()
Definition IntervalTree.h:44
void set_high(uint64_t high)
Definition IntervalTree.h:57
std::unique_ptr< IntervalNode< T > > _right
Definition IntervalTree.h:17
void set_right(std::unique_ptr< IntervalNode< T > > right)
Definition IntervalTree.h:51
std::unique_ptr< IntervalNode< T > > _left
Definition IntervalTree.h:16
uint64_t low() const
Definition IntervalTree.h:28
IntervalNode(uint64_t low, uint64_t high)
Definition IntervalTree.h:26
void set_left(std::unique_ptr< IntervalNode< T > > left)
Definition IntervalTree.h:48
uint64_t max() const
Definition IntervalTree.h:34
uint64_t _high
Definition IntervalTree.h:19
uint64_t _max
Definition IntervalTree.h:20
A specialized implementation of an Interval Tree for Bash++'s particular use case.
Definition IntervalTree.h:91
uint64_t find_max(std::unique_ptr< IntervalNode< T > > &node)
Definition IntervalTree.h:95
std::vector< T > find_overlaps(uint64_t point)
Definition IntervalTree.h:168
IntervalTree()
Definition IntervalTree.h:158
std::unique_ptr< IntervalNode< T > > _root
Definition IntervalTree.h:93
void find_overlaps(std::unique_ptr< IntervalNode< T > > &node, uint64_t point, std::vector< T > &overlaps)
Definition IntervalTree.h:138
T find_innermost_overlap(uint64_t point)
Find the innermost interval that contains the given point.
Definition IntervalTree.h:190
void insert_node(std::unique_ptr< IntervalNode< T > > &node, uint64_t low, uint64_t high, T payload)
Definition IntervalTree.h:102
void insert(uint64_t low, uint64_t high, T payload)
Definition IntervalTree.h:159