55 static_assert(Member !=
nullptr,
"IntrusiveList requires a valid node member");
59 template <
typename Value, node_t* (node_t::*Forward)(), node_t* (node_t::*Backward)()>
66 Value& operator*()
const {
67 return *m_Node->value;
70 Value* operator->()
const {
75 m_Node = (m_Node->*Forward)();
86 m_Node = (m_Node->*Backward)();
96 template <
typename OtherValue,
node_t* (
node_t::*OtherForward)(),
99 return m_Node == other.__getNode();
102 template <
typename OtherValue,
node_t* (
node_t::*OtherForward)(),
105 return !(*
this == other);
108 node_t* __getNode()
const {
123 m_Empty.m_Next = &m_Empty;
124 m_Empty.m_Previous = &m_Empty;
134 size_t size()
const {
138 size_t count()
const {
148 const node_t& node = value.*Member;
149 return node.m_Owner == &m_Empty;
152 void pushBack(T& value) {
153 insertBefore(m_Empty, value);
156 void pushFront(T& value) {
157 insertBefore(*m_Empty.m_Next, value);
164 return remove(*m_Empty.m_Previous);
171 return remove(*m_Empty.m_Next);
176 if (!contains(value))
179 remove(value.*Member);
185 if (node == &m_Empty)
188 node_t* next = node->m_Next;
193 ReverseIterator erase(ReverseIterator& iterator) {
194 node_t* node = iterator.__getNode();
195 if (node == &m_Empty)
198 node_t* previous = node->m_Previous;
200 return ReverseIterator(previous);
207 ConstIterator begin()
const {
208 return ConstIterator(m_Empty.m_Next);
215 ConstIterator end()
const {
216 return ConstIterator(
const_cast<node_t*
>(&m_Empty));
219 ReverseIterator rbegin() {
220 return ReverseIterator(m_Empty.m_Previous);
223 ConstReverseIterator rbegin()
const {
224 return ConstReverseIterator(m_Empty.m_Previous);
227 ReverseIterator rend() {
228 return ReverseIterator(&m_Empty);
231 ConstReverseIterator rend()
const {
232 return ConstReverseIterator(
const_cast<node_t*
>(&m_Empty));
237 remove(*m_Empty.m_Next);
241 void insertBefore(node_t& position, T& value) {
242 node_t& node = value.*Member;
243 assert(!node.m_Next && !node.m_Previous && !node.m_Owner);
246 node.m_Owner = &m_Empty;
247 node.m_Next = &position;
248 node.m_Previous = position.m_Previous;
249 position.m_Previous->m_Next = &node;
250 position.m_Previous = &node;
254 T* remove(node_t& node) {
255 assert(&node != &m_Empty);
256 assert(node.m_Next && node.m_Previous);
257 assert(node.m_Owner == &m_Empty);
259 node.m_Previous->m_Next = node.m_Next;
260 node.m_Next->m_Previous = node.m_Previous;
262 T* value = node.value;
263 node.m_Next =
nullptr;
264 node.m_Previous =
nullptr;
265 node.m_Owner =
nullptr;
266 node.value =
nullptr;
bool operator==(const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T1 > &x1, const Iterator< originalT, Struct, FunctionPrev, FunctionNext, T2 > &x2)