Iros
 
Loading...
Searching...
No Matches
rb_tree_iterator.h
Go to the documentation of this file.
1#pragma once
2
7
8namespace di::container {
9template<typename Value, typename Tag>
10class RBTreeIterator : public IteratorBase<RBTreeIterator<Value, Tag>, BidirectionalIteratorTag, Value, ssize_t> {
11private:
12 using Node = RBTreeNode<Tag>;
13 using ConcreteNode = decltype(Tag::node_type(in_place_type<Value>));
14
15public:
16 RBTreeIterator() = default;
17
18 constexpr RBTreeIterator(Node* node, bool at_end = false) : m_current(node), m_at_end(at_end) {}
19 constexpr RBTreeIterator(Node& node) : m_current(util::addressof(node)) {}
20
21 constexpr auto operator*() const -> Value& {
22 DI_ASSERT(!m_at_end);
23 return Tag::down_cast(in_place_type<Value>, static_cast<ConcreteNode&>(*m_current));
24 }
25 constexpr auto operator->() const -> Value* { return util::addressof(**this); }
26 constexpr auto node() const -> Node& { return *m_current; }
27
28 constexpr void advance_one() {
29 auto* next = m_current->successor();
30 if (next) {
31 m_current = next;
32 } else {
33 m_at_end = true;
34 }
35 }
36
37 constexpr void back_one() {
38 if (m_at_end) {
39 m_at_end = false;
40 return;
41 }
42
43 m_current = m_current->predecessor();
44 }
45
46private:
47 constexpr friend auto operator==(RBTreeIterator const& a, RBTreeIterator const& b) -> bool {
48 return (a.m_at_end == b.m_at_end) && (a.m_current == b.m_current);
49 }
50
51 Node* m_current { nullptr };
52 bool m_at_end { true };
53};
54}
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr RBTreeIterator(Node *node, bool at_end=false)
Definition rb_tree_iterator.h:18
constexpr void advance_one()
Definition rb_tree_iterator.h:28
constexpr auto operator->() const -> Value *
Definition rb_tree_iterator.h:25
constexpr auto operator*() const -> Value &
Definition rb_tree_iterator.h:21
constexpr friend auto operator==(RBTreeIterator const &a, RBTreeIterator const &b) -> bool
Definition rb_tree_iterator.h:47
constexpr void back_one()
Definition rb_tree_iterator.h:37
constexpr auto node() const -> Node &
Definition rb_tree_iterator.h:26
constexpr RBTreeIterator(Node &node)
Definition rb_tree_iterator.h:19
Definition sequence.h:12
constexpr auto next
Definition next.h:35
Definition vocab.h:96
constexpr auto in_place_type
Definition in_place_type.h:12
Definition rb_tree_node.h:9