35 |
#if USE_EXCEPTIONS |
#if USE_EXCEPTIONS |
36 |
# include <stdexcept> |
# include <stdexcept> |
37 |
# include <string> |
# include <string> |
|
const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated"; |
|
38 |
#endif // USE_EXCEPTIONS |
#endif // USE_EXCEPTIONS |
39 |
|
|
40 |
|
#if DEVMODE |
41 |
|
const std::string __err_msg_iterator_invalidated = "Pool/RTList iterator invalidated"; |
42 |
|
#endif |
43 |
|
|
44 |
// just symbol prototyping |
// just symbol prototyping |
45 |
template<typename T> class Pool; |
template<typename T> class Pool; |
46 |
template<typename T> class RTList; |
template<typename T> class RTList; |
48 |
template<typename T> |
template<typename T> |
49 |
class RTListBase { |
class RTListBase { |
50 |
protected: |
protected: |
51 |
template<typename _T> |
template<typename T1> |
52 |
struct _Node { |
struct _Node { |
53 |
_Node<_T>* next; |
_Node<T1>* next; |
54 |
_Node<_T>* prev; |
_Node<T1>* prev; |
55 |
_T* data; |
T1* data; |
56 |
#if DEVMODE |
#if DEVMODE |
57 |
RTListBase<_T>* list; // list to which this node currently belongs to |
RTListBase<T1>* list; // list to which this node currently belongs to |
58 |
#endif // DEVMODE |
#endif // DEVMODE |
59 |
|
|
60 |
_Node() { |
_Node() { |
69 |
typedef _Node<T> Node; |
typedef _Node<T> Node; |
70 |
|
|
71 |
public: |
public: |
72 |
template<typename _T> |
template<typename T1> |
73 |
class _Iterator { |
class _Iterator { |
74 |
public: |
public: |
75 |
_Iterator() { |
_Iterator() { |
82 |
|
|
83 |
/// prefix increment op. |
/// prefix increment op. |
84 |
inline _Iterator& operator++() { |
inline _Iterator& operator++() { |
85 |
#if DEVMODE |
#if DEVMODE |
86 |
#if USE_EXCEPTIONS |
if (!isValid()) { |
87 |
if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated); |
#if USE_EXCEPTIONS |
88 |
#else |
throw std::runtime_error(__err_msg_iterator_invalidated); |
89 |
if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated |
#else |
90 |
#endif // USE_EXCEPTIONS |
std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; |
91 |
|
return *(_Iterator*)NULL; // force segfault if iterator became invalidated |
92 |
|
#endif // USE_EXCEPTIONS |
93 |
|
} |
94 |
#endif // DEVMODE |
#endif // DEVMODE |
95 |
fallback = current; |
fallback = current; |
96 |
current = current->next; |
current = current->next; |
100 |
/// postfix increment op. |
/// postfix increment op. |
101 |
inline _Iterator operator++(int) { |
inline _Iterator operator++(int) { |
102 |
_Iterator preval = *this; |
_Iterator preval = *this; |
103 |
++*this; |
++*this; // use prefix operator implementation |
104 |
return preval; |
return preval; |
105 |
} |
} |
106 |
|
|
107 |
/// prefix decrement op. |
/// prefix decrement op. |
108 |
inline _Iterator& operator--() { |
inline _Iterator& operator--() { |
109 |
#if DEVMODE |
#if DEVMODE |
110 |
#if USE_EXCEPTIONS |
if (!isValid()) { |
111 |
if (!isValid()) throw std::runtime_error(__err_msg_iterator_invalidated); |
#if USE_EXCEPTIONS |
112 |
#else |
throw std::runtime_error(__err_msg_iterator_invalidated); |
113 |
if (!isValid()) return *(_Iterator*)NULL; // force segfault if iterator became invalidated |
#else |
114 |
#endif // USE_EXCEPTIONS |
std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; |
115 |
|
return *(_Iterator*)NULL; // force segfault if iterator became invalidated |
116 |
|
#endif // USE_EXCEPTIONS |
117 |
|
} |
118 |
#endif // DEVMODE |
#endif // DEVMODE |
119 |
fallback = current; |
fallback = current; |
120 |
current = current->prev; |
current = current->prev; |
124 |
/// postfix decrement op. |
/// postfix decrement op. |
125 |
inline _Iterator operator--(int) { |
inline _Iterator operator--(int) { |
126 |
_Iterator preval = *this; |
_Iterator preval = *this; |
127 |
--*this; |
--*this; // use prefix operator implementation |
128 |
return preval; |
return preval; |
129 |
} |
} |
130 |
|
|
131 |
inline _T& operator*() { |
inline T1& operator*() { |
132 |
#if DEVMODE |
#if DEVMODE |
133 |
#if USE_EXCEPTIONS |
if (!isValid()) { // if iterator became invalidated |
134 |
if (isValid()) return *current->data; |
#if USE_EXCEPTIONS |
135 |
else throw std::runtime_error(__err_msg_iterator_invalidated); |
throw std::runtime_error(__err_msg_iterator_invalidated); |
136 |
#else |
#else |
137 |
return *(isValid() ? current->data : (_T*)NULL); // force segfault if iterator became invalidated |
std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; |
138 |
#endif // USE_EXCEPTIONS |
return *((T1*)NULL); // force segfault if iterator became invalidated |
139 |
#else |
#endif // USE_EXCEPTIONS |
140 |
return *current->data; |
} |
141 |
#endif // DEVMODE |
#endif // DEVMODE |
142 |
|
return *current->data; |
143 |
|
|
144 |
} |
} |
145 |
|
|
146 |
inline _T* operator->() { |
inline T1* operator->() { |
147 |
#if DEVMODE |
#if DEVMODE |
148 |
#if USE_EXCEPTIONS |
if (!isValid()) { // if iterator became invalidated |
149 |
if (isValid()) return current->data; |
#if USE_EXCEPTIONS |
150 |
else throw std::runtime_error(__err_msg_iterator_invalidated); |
throw std::runtime_error(__err_msg_iterator_invalidated); |
151 |
#else |
#else |
152 |
return isValid() ? current->data : (_T*)NULL; // force segfault if iterator became invalidated |
std::cerr << __err_msg_iterator_invalidated << std::endl << std::flush; |
153 |
#endif // USE_EXCEPTIONS |
return (T1*)NULL; // force segfault if iterator became invalidated |
154 |
#else |
#endif // USE_EXCEPTIONS |
155 |
return current->data; |
} |
156 |
#endif // DEVMODE |
#endif // DEVMODE |
157 |
|
return current->data; |
158 |
} |
} |
159 |
|
|
160 |
inline bool operator==(const _Iterator<_T> other) { |
inline bool operator==(const _Iterator<T1> other) { |
161 |
return current == other.current; |
return current == other.current; |
162 |
} |
} |
163 |
|
|
164 |
inline bool operator!=(const _Iterator<_T> other) { |
inline bool operator!=(const _Iterator<T1> other) { |
165 |
return current != other.current; |
return current != other.current; |
166 |
} |
} |
167 |
|
|
173 |
return !(current && current->data); |
return !(current && current->data); |
174 |
} |
} |
175 |
|
|
176 |
inline _Iterator moveToEndOf(RTListBase<_T>* pDstList) { |
inline _Iterator moveToEndOf(RTListBase<T1>* pDstList) { |
177 |
detach(); |
detach(); |
178 |
pDstList->append(*this); |
pDstList->append(*this); |
179 |
_Iterator iterOnDstList = _Iterator(current); |
_Iterator iterOnDstList = _Iterator(current); |
181 |
return iterOnDstList; |
return iterOnDstList; |
182 |
} |
} |
183 |
|
|
184 |
inline _Iterator moveToBeginOf(RTListBase<_T>* pDstList) { |
inline _Iterator moveToBeginOf(RTListBase<T1>* pDstList) { |
185 |
detach(); |
detach(); |
186 |
pDstList->prepend(*this); |
pDstList->prepend(*this); |
187 |
_Iterator iterOnDstList = _Iterator(current); |
_Iterator iterOnDstList = _Iterator(current); |
203 |
dir_backward |
dir_backward |
204 |
}; |
}; |
205 |
#if DEVMODE |
#if DEVMODE |
206 |
RTListBase<_T>* list; |
RTListBase<T1>* list; |
207 |
#endif // DEVMODE |
#endif // DEVMODE |
208 |
|
|
209 |
_Iterator(Node* pNode, dir_t direction = dir_forward) { |
_Iterator(Node* pNode, dir_t direction = dir_forward) { |
228 |
} |
} |
229 |
|
|
230 |
inline void detach() { |
inline void detach() { |
231 |
RTListBase<_T>::detach(*this); |
RTListBase<T1>::detach(*this); |
232 |
} |
} |
233 |
|
|
234 |
friend class RTListBase<_T>; |
friend class RTListBase<T1>; |
235 |
friend class RTList<_T>; |
friend class RTList<T1>; |
236 |
friend class Pool<_T>; |
friend class Pool<T1>; |
237 |
}; |
}; |
238 |
typedef _Iterator<T> Iterator; |
typedef _Iterator<T> Iterator; |
239 |
|
|
346 |
next->prev = prev; |
next->prev = prev; |
347 |
} |
} |
348 |
|
|
349 |
|
friend class _Iterator<T>; |
350 |
|
friend class RTList<T>; |
351 |
friend class Pool<T>; |
friend class Pool<T>; |
352 |
}; |
}; |
353 |
|
|