OpenBarnyard
 
Loading...
Searching...
No Matches
T2Iterator.h
Go to the documentation of this file.
1#pragma once
2#include <type_traits>
3
4#define T2_FOREACH( vecName, iteratorName ) \
5 for ( auto iteratorName = ( vecName ).Begin(); iteratorName != ( vecName ).End(); ++iteratorName )
6
7#define T2_FOREACH_BACK( vecName, iteratorName ) \
8 for ( auto iteratorName = ( vecName ).Tail(); iteratorName != ( vecName ).End(); --iteratorName )
9
10#define T2_FOREACH_ARRAY( arrName, iteratorName ) \
11 for ( TINT iteratorName = 0; iteratorName < TARRAYSIZE( arrName ); ++iteratorName )
12
13#define T2_FOREACH_ARRAY_BACK( arrName, iteratorName ) \
14 for ( TINT iteratorName = TARRAYSIZE( arrName ) - 1; iteratorName >= 0; --iteratorName )
15
16#define T2_DEFINE_ITERATOR_FRIEND() \
17 template <class T, class Node> friend class Toshi::T2Iterator
18
19#define T2_DEFINE_ITERATOR( TYPE, NODE_TYPE ) \
20 using Iterator = Toshi::T2Iterator<TYPE, NODE_TYPE>
21
23
24template <class T, class Node>
26{
27public:
28 TSTATICASSERT( std::is_base_of<Node, T>::value );
29
31 {
32 m_pPtr = TNULL;
33 }
34
36 {
37 m_pPtr = TSTATICCAST( T, pPtr );
38 }
39
40 T2Iterator( T* pPtr )
41 {
42 m_pPtr = pPtr;
43 }
44
45 T2Iterator( const T2Iterator& other )
46 {
47 m_pPtr = other.m_pPtr;
48 }
49
50 T* Get()
51 {
52 return m_pPtr;
53 }
54
55 const T* Get() const
56 {
57 return m_pPtr;
58 }
59
60 T& operator*() noexcept
61 {
62 return *m_pPtr;
63 }
64
65 const T& operator*() const noexcept
66 {
67 return *m_pPtr;
68 }
69
71 {
72 TASSERT( m_pPtr != TNULL );
73 return T2Iterator{ TSTATICCAST( Node, m_pPtr )->Next() };
74 }
75
77 {
78 TASSERT( m_pPtr != TNULL );
79 return T2Iterator{ TSTATICCAST( Node, m_pPtr )->Prev() };
80 }
81
82 void operator=( const T2Iterator& other )
83 {
84 m_pPtr = other.m_pPtr;
85 }
86
87 void operator=( T* pPtr )
88 {
89 m_pPtr = pPtr;
90 }
91
92 T* operator->() const
93 {
94 TASSERT( m_pPtr != TNULL );
95 return m_pPtr;
96 }
97
98 operator T*() const
99 {
100 TASSERT( m_pPtr != TNULL );
101 return TSTATICCAST( T, m_pPtr );
102 }
103
105 {
106 TASSERT( m_pPtr != TNULL );
107 T2Iterator old = m_pPtr;
108 m_pPtr = TSTATICCAST( T, TSTATICCAST( Node, m_pPtr )->Next() );
109 return old;
110 }
111
113 {
114 TASSERT( m_pPtr != TNULL );
115 T2Iterator old = m_pPtr;
116 m_pPtr = TSTATICCAST( T, TSTATICCAST( Node, m_pPtr )->Prev() );
117 return old;
118 }
119
121 {
122 TASSERT( m_pPtr != TNULL );
123 m_pPtr = TSTATICCAST( T, TSTATICCAST( Node, m_pPtr )->Next() );
124 return T2Iterator{ m_pPtr };
125 }
126
128 {
129 TASSERT( m_pPtr != TNULL );
130 m_pPtr = TSTATICCAST( T, TSTATICCAST( Node, m_pPtr )->Prev() );
131 return T2Iterator{ m_pPtr };
132 }
133
134private:
135 T* m_pPtr;
136};
137
#define TASSERT(X,...)
Definition Defines.h:138
#define TSTATICCAST(POINTERTYPE, VALUE)
Definition Defines.h:69
#define TOSHI_NAMESPACE_START
Definition Defines.h:47
#define TOSHI_NAMESPACE_END
Definition Defines.h:50
#define TNULL
Definition Typedefs.h:23
int TINT
Definition Typedefs.h:7
void operator=(const T2Iterator &other)
Definition T2Iterator.h:82
T2Iterator Prev() const
Definition T2Iterator.h:76
T * Get()
Definition T2Iterator.h:50
const T & operator*() const noexcept
Definition T2Iterator.h:65
T & operator*() noexcept
Definition T2Iterator.h:60
T2Iterator operator--(TINT)
Definition T2Iterator.h:112
TSTATICASSERT(std::is_base_of< Node, T >::value)
const T * Get() const
Definition T2Iterator.h:55
T2Iterator(T *pPtr)
Definition T2Iterator.h:40
T * operator->() const
Definition T2Iterator.h:92
T2Iterator operator--()
Definition T2Iterator.h:127
void operator=(T *pPtr)
Definition T2Iterator.h:87
T2Iterator Next() const
Definition T2Iterator.h:70
T2Iterator(const T2Iterator &other)
Definition T2Iterator.h:45
T2Iterator operator++(TINT)
Definition T2Iterator.h:104
T2Iterator operator++()
Definition T2Iterator.h:120
T2Iterator(Node *pPtr)
Definition T2Iterator.h:35