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