aboutsummaryrefslogtreecommitdiff
path: root/EASTL/source/intrusive_list.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'EASTL/source/intrusive_list.cpp')
-rw-r--r--EASTL/source/intrusive_list.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/EASTL/source/intrusive_list.cpp b/EASTL/source/intrusive_list.cpp
new file mode 100644
index 0000000..c8e8a25
--- /dev/null
+++ b/EASTL/source/intrusive_list.cpp
@@ -0,0 +1,87 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright (c) Electronic Arts Inc. All rights reserved.
+///////////////////////////////////////////////////////////////////////////////
+
+#include <EASTL/intrusive_list.h>
+
+
+namespace eastl
+{
+
+
+ EASTL_API void intrusive_list_base::reverse() EA_NOEXCEPT
+ {
+ intrusive_list_node* pNode = &mAnchor;
+ do {
+ intrusive_list_node* const pTemp = pNode->mpNext;
+ pNode->mpNext = pNode->mpPrev;
+ pNode->mpPrev = pTemp;
+ pNode = pNode->mpPrev;
+ }
+ while(pNode != &mAnchor);
+ }
+
+
+
+ EASTL_API bool intrusive_list_base::validate() const
+ {
+ const intrusive_list_node *p = &mAnchor;
+ const intrusive_list_node *q = p;
+
+ // We do two tests below:
+ //
+ // 1) Prev and next pointers are symmetric. We check (p->next->prev == p)
+ // for each node, which is enough to verify all links.
+ //
+ // 2) Loop check. We bump the q pointer at one-half rate compared to the
+ // p pointer; (p == q) if and only if we are at the start (which we
+ // don't check) or if there is a loop somewhere in the list.
+
+ do {
+ // validate node (even phase)
+ if (p->mpNext->mpPrev != p)
+ return false; // broken linkage detected
+
+ // bump only fast pointer
+ p = p->mpNext;
+ if (p == &mAnchor)
+ break;
+
+ if (p == q)
+ return false; // loop detected
+
+ // validate node (odd phase)
+ if (p->mpNext->mpPrev != p)
+ return false; // broken linkage detected
+
+ // bump both pointers
+ p = p->mpNext;
+ q = q->mpNext;
+
+ if (p == q)
+ return false; // loop detected
+
+ } while(p != &mAnchor);
+
+ return true;
+ }
+
+
+} // namespace eastl
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+