datastructures 0.1.0
Loading...
Searching...
No Matches
_avl_iterator.hpp
Go to the documentation of this file.
7
8#pragma once
9
10#include <memory>
11
12namespace datastructures {
13
14template <class TKey, class TValue, class TKeyComp, class TAlloc>
15class map;
16
17namespace detail {
18
33template <class TTree, bool is_const>
35 private:
36 using tree_type = TTree;
37
41 using alloc_traits = typename std::allocator_traits<
42 typename std::allocator_traits<typename tree_type::allocator_type>::
43 template rebind_alloc<typename tree_type::item_type>>;
44
45 public:
48 using iterator_category = std::bidirectional_iterator_tag;
49
51 using value_type = typename tree_type::item_type;
52
54 using difference_type = typename alloc_traits::difference_type;
55
59 using pointer =
60 std::conditional_t<is_const, typename alloc_traits::const_pointer,
61 typename alloc_traits::pointer>;
62
66 using reference =
67 std::conditional_t<is_const, const value_type &, value_type &>;
68
71 using iterator_concept = std::bidirectional_iterator_tag;
72
73 private:
74 friend class avl_iterator<tree_type, true>;
75
76 template <class, class, class, class>
77 friend class ::datastructures::map;
78
79 using node_ptr = tree_type::node_ptr;
80
85 using tree_ptr = const tree_type *;
86
87 tree_ptr tree;
88 node_ptr node;
89
90 public:
91 // ==== Constructors & Assignments ====
92
101 avl_iterator(tree_ptr tree, node_ptr node) noexcept
102 : tree(tree), node(node) {}
103
105 avl_iterator() noexcept : avl_iterator(nullptr, nullptr) {}
106
107 avl_iterator(const avl_iterator &other) noexcept {
108 tree = other.tree;
109 node = other.node;
110 }
111
112 avl_iterator &operator=(const avl_iterator &other) noexcept {
113 tree = other.tree;
114 node = other.node;
115
116 return *this;
117 }
118
119 ~avl_iterator() noexcept = default;
120
121 avl_iterator(const avl_iterator<tree_type, false> &other) noexcept
122 requires(is_const)
123 : node(other.node) {}
124
125 reference operator*() const noexcept {
126 return node->item;
127 }
128 pointer operator->() const noexcept {
129 return &node->item;
130 }
131
133 node = tree->successor(node);
134 return *this;
135 }
136
137 avl_iterator operator++(int) noexcept {
138 avl_iterator tmp(*this);
139 ++(*this);
140 return tmp;
141 }
142
144 node = (node == nullptr) ? tree->max_from(tree->get_root())
145 : tree->predecessor(node);
146 return *this;
147 }
148
149 avl_iterator operator--(int) noexcept {
150 avl_iterator tmp(*this);
151 --(*this);
152 return tmp;
153 }
154
155 bool operator==(const avl_iterator &other) const noexcept {
156 return tree == other.tree && node == other.node;
157 }
158
159 bool operator!=(const avl_iterator &other) const noexcept {
160 return !(*this == other);
161 }
162};
163
164} // namespace detail
165} // namespace datastructures
The AVL tree iterator type.
Definition _avl_iterator.hpp:34
bool operator==(const avl_iterator &other) const noexcept
Definition _avl_iterator.hpp:155
bool operator!=(const avl_iterator &other) const noexcept
Definition _avl_iterator.hpp:159
avl_iterator(const avl_iterator &other) noexcept
Definition _avl_iterator.hpp:107
avl_iterator & operator++() noexcept
Definition _avl_iterator.hpp:132
avl_iterator & operator--() noexcept
Definition _avl_iterator.hpp:143
std::bidirectional_iterator_tag iterator_concept
Tells the compiler that this iterator is bidirectional, needed by STL.
Definition _avl_iterator.hpp:71
avl_iterator operator--(int) noexcept
Definition _avl_iterator.hpp:149
typename tree_type::item_type value_type
The tree item type, needed by STL.
Definition _avl_iterator.hpp:51
typename alloc_traits::difference_type difference_type
Item pointer difference type, needed by STL.
Definition _avl_iterator.hpp:54
std::conditional_t< is_const, typename alloc_traits::const_pointer, typename alloc_traits::pointer > pointer
Item pointer, needed by STL.
Definition _avl_iterator.hpp:61
avl_iterator(tree_ptr tree, node_ptr node) noexcept
Creates a new iterator to the given tree.
Definition _avl_iterator.hpp:101
reference operator*() const noexcept
Definition _avl_iterator.hpp:125
pointer operator->() const noexcept
Definition _avl_iterator.hpp:128
avl_iterator & operator=(const avl_iterator &other) noexcept
Definition _avl_iterator.hpp:112
avl_iterator() noexcept
Same as avl_iterator(nullptr, nullptr).
Definition _avl_iterator.hpp:105
std::bidirectional_iterator_tag iterator_category
Tells the compiler that this iterator is bidirectional, needed by STL.
Definition _avl_iterator.hpp:48
std::conditional_t< is_const, const value_type &, value_type & > reference
Item pointer, needed by STL.
Definition _avl_iterator.hpp:67
avl_iterator operator++(int) noexcept
Definition _avl_iterator.hpp:137
A map type using an AVL tree as the underlying structure.
Definition map.hpp:47
Declarations of the persistent map.
Definition _avl.hpp:14