Skip to content

Commit 846c9a0

Browse files
committed
Cleaned up punch helper functions.
1 parent 11ec88a commit 846c9a0

File tree

1 file changed

+44
-95
lines changed

1 file changed

+44
-95
lines changed

include/interval-tree/interval_tree.hpp

Lines changed: 44 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,100 +1421,6 @@ namespace lib_interval_tree
14211421
return punch({min, max});
14221422
}
14231423

1424-
// TODO: private
1425-
/**
1426-
* @brief Finds the interval that is right of the given value and does not contain it.
1427-
* Only works with deoverlapped trees.
1428-
*
1429-
* @param low
1430-
* @return node_type*
1431-
*/
1432-
node_type* find_directly_right_of_i(value_type search_value) const
1433-
{
1434-
if (empty())
1435-
return nullptr;
1436-
1437-
// There can be no interval strictly right of the value, if the value
1438-
// is larger than the max.
1439-
if (search_value > root_->max_)
1440-
return nullptr;
1441-
1442-
const auto is_interval_strictly_right_of_value = [search_value](node_type* node) {
1443-
return node->low() > search_value ||
1444-
(node->low() == search_value && !node->interval()->within(search_value));
1445-
};
1446-
1447-
auto* node = root_;
1448-
1449-
// If the interval is not strictly right of the value, we can only go down right
1450-
// And dont have to check left.
1451-
while (!is_interval_strictly_right_of_value(node) && node->right_)
1452-
node = node->right_;
1453-
1454-
bool go_left = false;
1455-
bool go_right = false;
1456-
do
1457-
{
1458-
go_left = node->left_ && is_interval_strictly_right_of_value(node->left_);
1459-
go_right = node->right_ && is_interval_strictly_right_of_value(node->right_);
1460-
1461-
if (go_left)
1462-
node = node->left_;
1463-
else if (go_right)
1464-
node = node->right_;
1465-
} while (go_left || go_right);
1466-
1467-
if (is_interval_strictly_right_of_value(node))
1468-
return node;
1469-
1470-
// We only end up here when node == root_, otherwise we never went down the tree to begin with.
1471-
return nullptr;
1472-
}
1473-
1474-
/**
1475-
* @brief Find the interval that is left of the given value or contains it.
1476-
* Only works in deoverlapped trees. Because a deoverlapped tree is indistinguishable
1477-
* from a regular binary search tree. The tree is then also sorted by the upper interval bound.
1478-
* Making this search possible in the first place.
1479-
*
1480-
* @param search_value
1481-
* @return node_type*
1482-
*/
1483-
node_type* find_leftest_interval_of_value_i(value_type search_value) const
1484-
{
1485-
if (empty())
1486-
return nullptr;
1487-
1488-
auto* node = root_;
1489-
1490-
// low of a node is always lower than the lows of all nodes right of that node
1491-
// high of a node is always lower than the lows of all nodes right of that node
1492-
1493-
bool go_left = false;
1494-
bool go_right = false;
1495-
1496-
do
1497-
{
1498-
go_right = search_value > node->high();
1499-
if (go_right)
1500-
{
1501-
go_right &= node->right_ != nullptr;
1502-
if (go_right)
1503-
node = node->right_;
1504-
continue;
1505-
}
1506-
1507-
go_left = node->left_ != nullptr && search_value < node->low();
1508-
if (go_left)
1509-
node = node->left_;
1510-
} while (go_left || go_right);
1511-
1512-
if (search_value < node->low())
1513-
return nullptr;
1514-
1515-
return node;
1516-
}
1517-
15181424
/**
15191425
* Only works with deoverlapped trees.
15201426
* Removes all intervals from the given interval and produces a tree that contains the remaining intervals.
@@ -1562,7 +1468,6 @@ namespace lib_interval_tree
15621468
if (ex.right_slice)
15631469
{
15641470
ival = std::move(*ex.right_slice);
1565-
// TODO: Can I avoid assigning this every loop? -> maybe by extracting the first iteration?
15661471
insert_remaining = true;
15671472
}
15681473
else
@@ -1671,6 +1576,50 @@ namespace lib_interval_tree
16711576
}
16721577

16731578
private:
1579+
/**
1580+
* @brief Find the interval that is left of the given value or contains it.
1581+
* Only works in deoverlapped trees. Because a deoverlapped tree is indistinguishable
1582+
* from a regular binary search tree. The tree is then also sorted by the upper interval bound.
1583+
* Making this search possible in the first place.
1584+
*
1585+
* @param search_value
1586+
* @return node_type*
1587+
*/
1588+
node_type* find_leftest_interval_of_value_i(value_type search_value) const
1589+
{
1590+
if (empty())
1591+
return nullptr;
1592+
1593+
auto* node = root_;
1594+
1595+
// low of a node is always lower than the lows of all nodes right of that node
1596+
// high of a node is always lower than the lows of all nodes right of that node
1597+
1598+
bool go_left = false;
1599+
bool go_right = false;
1600+
1601+
do
1602+
{
1603+
go_right = search_value > node->high();
1604+
if (go_right)
1605+
{
1606+
go_right &= node->right_ != nullptr;
1607+
if (go_right)
1608+
node = node->right_;
1609+
continue;
1610+
}
1611+
1612+
go_left = node->left_ != nullptr && search_value < node->low();
1613+
if (go_left)
1614+
node = node->left_;
1615+
} while (go_left || go_right);
1616+
1617+
if (search_value < node->low())
1618+
return nullptr;
1619+
1620+
return node;
1621+
}
1622+
16741623
node_type* copy_tree_impl(node_type* root, node_type* parent)
16751624
{
16761625
if (root)

0 commit comments

Comments
 (0)