The Pedigree Project 0.1
Iterator.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef KERNEL_UTILITIES_ITERATOR_H
21#define KERNEL_UTILITIES_ITERATOR_H
22
23#include "pedigree/kernel/utilities/cpp.h"
24#include "pedigree/kernel/utilities/template.h"
25
39template <typename originalT, class Struct, Struct* (Struct::*FunctionPrev)() = &Struct::previous,
40 Struct* (Struct::*FunctionNext)() = &Struct::next, typename T = originalT>
41class Iterator {
44 template <typename _originalT, class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
45 _Struct* (_Struct::*_FunctionNext)(), typename _T>
46 friend class Iterator;
47
49 template <typename _originalT, class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
50 _Struct* (_Struct::*_FunctionNext)(), typename _T1, typename _T2>
51 friend bool operator==(
54
55 public:
62
70 template <typename T2>
75 Iterator(Struct* Node) : m_Node(Node), m_Default() {}
78
82 m_Node = x.m_Node;
83 m_Default = x.m_Default;
84 return *this;
85 }
88 if (m_Node)
89 m_Node = (m_Node->*FunctionNext)();
90 return *this;
91 }
94 if (m_Node) {
95 Struct* newNode = (m_Node->*FunctionPrev)();
96 if (newNode)
97 m_Node = newNode;
98 }
99 return *this;
100 }
103 // Verify that we actually have a valid node
104 if (m_Node)
105 return m_Node->value;
106 else {
107 return m_Default;
108 }
109 }
112 return *this;
113 }
114
116 operator Const() {
117 return Const(m_Node);
118 }
119
121 Struct* __getNode() {
122 return m_Node;
123 }
124
125 protected:
127 Struct* m_Node;
130};
131
144template <typename originalT, class Struct, Struct* (Struct::*FunctionPrev)() = &Struct::previous,
145 Struct* (Struct::*FunctionNext)() = &Struct::next, typename K = originalT,
146 typename T = originalT>
150 template <typename _originalT, class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
151 _Struct* (_Struct::*_FunctionNext)(), typename _K, typename _T>
152 friend class TreeIterator;
153
155 template <typename _originalT, class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
156 _Struct* (_Struct::*_FunctionNext)(), typename _K1, typename _T1, typename _K2,
157 typename _T2>
158 friend bool operator==(
161
162 public:
169
177 template <typename K2, typename T2>
182 TreeIterator(Struct* Node) : m_Node(Node) {}
185
189 m_Node = x.m_Node;
190 return *this;
191 }
194 m_Node = (m_Node->*FunctionNext)();
195 return *this;
196 }
199 m_Node = (m_Node->*FunctionPrev)();
200 return *this;
201 }
204 return m_Node->value;
205 }
208 return m_Node->value;
209 }
210
212 operator Const() {
213 return Const(m_Node);
214 }
215
217 Struct* __getNode() {
218 return m_Node;
219 }
220
221 K key() {
222 if (m_Node) {
223 if (m_Node->value)
224 return m_Node->value->key;
225 }
226 return 0;
227 }
228
229 T value() {
230 if (m_Node) {
231 if (m_Node->value)
232 return m_Node->value->element;
233 }
234 return 0;
235 }
236
237 const T& value(const T& failed = T()) const {
238 if (m_Node) {
239 if (m_Node->value)
240 return m_Node->value->element;
241 }
242 return failed;
243 }
244
245 protected:
247 Struct* m_Node;
248};
249
254template <typename originalT, class Struct, Struct* (Struct::*FunctionPrev)(),
255 Struct* (Struct::*FunctionNext)(), typename T1, typename T2>
258 if (x1.m_Node != x2.m_Node)
259 return false;
260 return true;
261}
262
267template <typename originalT, class Struct, Struct* (Struct::*FunctionPrev)(),
268 Struct* (Struct::*FunctionNext)(), typename K1, typename T1, typename K2, typename T2>
271 // Exhausted traversal retains its cursor object; end() has no cursor.
272 const auto* value1 = x1.m_Node ? x1.m_Node->value : nullptr;
273 const auto* value2 = x2.m_Node ? x2.m_Node->value : nullptr;
274 return value1 == value2;
275}
276
279#endif
An iterator applicable for many data structures.
Definition Iterator.h:41
T m_Default
Definition Iterator.h:129
Iterator & operator++()
Definition Iterator.h:87
Iterator & operator=(const Iterator &x)
Definition Iterator.h:81
Iterator< originalT, Struct, FunctionNext, FunctionPrev, T > Reverse
Definition Iterator.h:59
Iterator< originalT, Struct, FunctionNext, FunctionPrev, T const > ConstReverse
Definition Iterator.h:61
friend bool operator==(const Iterator< _originalT, _Struct, _FunctionPrev, _FunctionNext, _T1 > &x1, const Iterator< _originalT, _Struct, _FunctionPrev, _FunctionNext, _T2 > &x2)
Iterator< originalT, Struct, FunctionPrev, FunctionNext, T const > Const
Definition Iterator.h:57
Iterator(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x)
Definition Iterator.h:71
Iterator & operator--()
Definition Iterator.h:93
Struct * m_Node
Definition Iterator.h:127
~Iterator()
Definition Iterator.h:77
Iterator(const Iterator &x)
Definition Iterator.h:67
T & operator*()
Definition Iterator.h:102
Struct * __getNode()
Definition Iterator.h:121
Iterator(Struct *Node)
Definition Iterator.h:75
T & operator->()
Definition Iterator.h:111
Iterator()
Definition Iterator.h:64
An iterator applicable for many data structures.
Definition Iterator.h:147
TreeIterator & operator--()
Definition Iterator.h:198
Struct * __getNode()
Definition Iterator.h:217
TreeIterator(Struct *Node)
Definition Iterator.h:182
TreeIterator & operator++()
Definition Iterator.h:193
TreeIterator< originalT, Struct, FunctionNext, FunctionPrev, K, T > Reverse
Definition Iterator.h:166
Struct * m_Node
Definition Iterator.h:247
TreeIterator< originalT, Struct, FunctionPrev, FunctionNext, K, T const > Const
Definition Iterator.h:164
friend bool operator==(const TreeIterator< _originalT, _Struct, _FunctionPrev, _FunctionNext, _K1, _T1 > &x1, const TreeIterator< _originalT, _Struct, _FunctionPrev, _FunctionNext, _K2, _T2 > &x2)
TreeIterator(const TreeIterator< originalT, Struct, FunctionPrev, FunctionNext, K2, T2 > &x)
Definition Iterator.h:178
TreeIterator(const TreeIterator &x)
Definition Iterator.h:174
TreeIterator & operator=(const TreeIterator &x)
Definition Iterator.h:188
TreeIterator< originalT, Struct, FunctionNext, FunctionPrev, K, T const > ConstReverse
Definition Iterator.h:168
bool operator==(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T1 > &x1, const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x2)
Definition Iterator.h:256