From 62e76e42a08dc6f2ff7b2b77c9108ae83c8cb385 Mon Sep 17 00:00:00 2001 From: Spiros Maggioros Date: Sat, 3 Feb 2024 06:03:51 +0200 Subject: [PATCH] added iterators to interval tree class --- src/classes/tree/interval_tree.h | 93 ++++++++++++++++++++++++++++++++ tests/tree/interval_tree.cc | 10 ++++ 2 files changed, 103 insertions(+) diff --git a/src/classes/tree/interval_tree.h b/src/classes/tree/interval_tree.h index 78c6b84e..67149509 100644 --- a/src/classes/tree/interval_tree.h +++ b/src/classes/tree/interval_tree.h @@ -69,6 +69,28 @@ template class interval_tree { return i1.high >= i2.low && i1.low <= i2.high; } + class Iterator; + + /** + * @brief pointer that points to begin + * + * @return Iterator + */ + Iterator begin() { + std::vector> ino = this->inorder(); + return Iterator(0, ino); + } + + /** + * @brief pointer that points to end + * + * @return Iterator + */ + Iterator end() { + std::vector> ino = this->inorder(); + return Iterator(ino.size(), ino); + } + /** *@brief inorder function. *@returns vector>, the elements inorder. @@ -338,4 +360,75 @@ template class interval_tree { } }; +/** + * @brief Iterator class + */ +template class interval_tree::Iterator { +private: + std::vector> elements; + int64_t index; + +public: + /** + * @brief Construct a new Iterator object + * + * @param els vector - the elements in inorder fashion + */ + explicit Iterator(const int64_t &index, + std::vector> &els) noexcept + : index(index), elements(els) {} + + /** + * @brief = operator for Iterator type + * + * @param index the current index + * @return Iterator& + */ + Iterator &operator=(int64_t index) { + this->index = index; + return *(this); + } + + /** + * @brief operator ++ for type Iterator + * + * @return Iterator& + */ + Iterator &operator++() { + if (this->index < elements.size()) { + this->index++; + } + return *(this); + } + + /** + * @brief operator ++ for type Iterator + * + * @return Iterator + */ + Iterator operator++(int) { + Iterator it = *this; + ++*(this); + return it; + } + + /** + * @brief operator != for type Iterator + * + * @param it const Iterator + * @return true if index == it.index + * @return false otherwise + */ + bool operator!=(const Iterator &it) { return index != it.index; } + + /** + * @brief operator * for type Iterator + * + * @return T the value of the node + */ + std::pair operator*() { + return {elements[index].first, elements[index].second}; + } +}; + #endif diff --git a/tests/tree/interval_tree.cc b/tests/tree/interval_tree.cc index 0bc074b0..0de28123 100644 --- a/tests/tree/interval_tree.cc +++ b/tests/tree/interval_tree.cc @@ -35,4 +35,14 @@ TEST_CASE("testing remove") { REQUIRE(i.search({'w', 'w'}) == false); REQUIRE(i.search({'c', 'd'})); REQUIRE(i.search({'a', 'd'}) == true); +} + +TEST_CASE("testing iterators") { + interval_tree i({{1, 3}, {5, 6}, {2, 4}, {9, 10}}); + std::vector> els = i.inorder(); + std::vector> check; + for (auto it = i.begin(); it != i.end(); it++) { + check.push_back(*(it)); + } + REQUIRE(check == els); } \ No newline at end of file