20#ifndef KERNEL_UTILITIES_ITERATOR_H
21#define KERNEL_UTILITIES_ITERATOR_H
23#include "pedigree/kernel/utilities/cpp.h"
24#include "pedigree/kernel/utilities/template.h"
39template <
typename originalT,
class Struct, Struct* (Struct::*FunctionPrev)() = &Struct::previous,
40 Struct* (Struct::*FunctionNext)() = &Struct::next,
typename T = originalT>
44 template <
typename _originalT,
class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
45 _Struct* (_Struct::*_FunctionNext)(),
typename _T>
49 template <
typename _originalT,
class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
50 _Struct* (_Struct::*_FunctionNext)(),
typename _T1,
typename _T2>
70 template <
typename T2>
95 Struct* newNode = (
m_Node->*FunctionPrev)();
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>
155 template <
typename _originalT,
class _Struct, _Struct* (_Struct::*_FunctionPrev)(),
156 _Struct* (_Struct::*_FunctionNext)(),
typename _K1,
typename _T1,
typename _K2,
177 template <
typename K2,
typename T2>
224 return m_Node->value->key;
232 return m_Node->value->element;
237 const T& value(
const T& failed = T())
const {
240 return m_Node->value->element;
254template <
typename originalT,
class Struct, Struct* (Struct::*FunctionPrev)(),
255 Struct* (Struct::*FunctionNext)(),
typename T1,
typename T2>
267template <
typename originalT,
class Struct, Struct* (Struct::*FunctionPrev)(),
268 Struct* (Struct::*FunctionNext)(),
typename K1,
typename T1,
typename K2,
typename T2>
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;
An iterator applicable for many data structures.
Iterator & operator=(const Iterator &x)
Iterator< originalT, Struct, FunctionNext, FunctionPrev, T > Reverse
Iterator< originalT, Struct, FunctionNext, FunctionPrev, T const > ConstReverse
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
Iterator(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x)
Iterator(const Iterator &x)
An iterator applicable for many data structures.
TreeIterator & operator--()
TreeIterator(Struct *Node)
TreeIterator & operator++()
TreeIterator< originalT, Struct, FunctionNext, FunctionPrev, K, T > Reverse
TreeIterator< originalT, Struct, FunctionPrev, FunctionNext, K, T const > Const
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)
TreeIterator(const TreeIterator &x)
TreeIterator & operator=(const TreeIterator &x)
TreeIterator< originalT, Struct, FunctionNext, FunctionPrev, K, T const > ConstReverse
bool operator==(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T1 > &x1, const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x2)