diff options
Diffstat (limited to 'EASTL/source/intrusive_list.cpp')
-rw-r--r-- | EASTL/source/intrusive_list.cpp | 87 |
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 + + + + + + + + + + + + + + + + + |