diff options
| author | Jcw87 <Jcw87@users.noreply.github.com> | 2026-01-08 06:52:18 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-01-08 07:52:18 -0700 |
| commit | 0e7b42e9ea78e960647ce25528cf7b65a6ddfc9d (patch) | |
| tree | 19bbd556b98acd6c23451d8e35ca7b2bce9d592a /src/JSystem | |
| parent | 2b52bc59d00bc83abce50c026447780d6c8ad943 (diff) | |
linklist debug (#3025)
Diffstat (limited to 'src/JSystem')
| -rw-r--r-- | src/JSystem/JGadget/linklist.cpp | 123 |
1 files changed, 109 insertions, 14 deletions
diff --git a/src/JSystem/JGadget/linklist.cpp b/src/JSystem/JGadget/linklist.cpp index 4a705dd5e7..366a8db320 100644 --- a/src/JSystem/JGadget/linklist.cpp +++ b/src/JSystem/JGadget/linklist.cpp @@ -1,7 +1,10 @@ #include "JSystem/JSystem.h" // IWYU pragma: keep #include "JSystem/JGadget/linklist.h" +#include "JSystem/JGadget/define.h" +namespace JGadget { +namespace { template <typename T> class TPRIsEqual_pointer_ { public: @@ -12,29 +15,45 @@ public: private: const T* p_; }; +} +} -JGadget::TNodeLinkList::~TNodeLinkList() {} +JGadget::TNodeLinkList::~TNodeLinkList() { +#if DEBUG + Confirm(); + clear(); + JGADGET_ASSERTWARN(84, empty()) + oNode_.clear_(); +#endif +} JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::erase(JGadget::TNodeLinkList::iterator it) { + JUT_ASSERT(102, it.p_!=&oNode_); iterator next = it; ++next; return erase(it, next); } JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::erase(iterator a, iterator b) { - TLinkListNode* cur = a.node; - TLinkListNode* end = b.node; + TLinkListNode* cur = a.p_; + TLinkListNode* end = b.p_; TLinkListNode* next; for (; cur != end; cur = next) { - next = cur->mNext; + next = cur->pNext_; Erase(cur); } return b; } +void JGadget::TNodeLinkList::splice(iterator it, TNodeLinkList& rSrc) { + JUT_ASSERT(146, this!=&rSrc); + splice(it, rSrc, rSrc.begin(), rSrc.end()); + JUT_ASSERT(148, rSrc.empty()); +} + void JGadget::TNodeLinkList::splice(iterator it, TNodeLinkList& rSrc, iterator itSrc) { iterator itSrcNext = itSrc; ++itSrcNext; @@ -48,24 +67,69 @@ void JGadget::TNodeLinkList::splice(iterator it, TNodeLinkList& rSrc, iterator i } } +void JGadget::TNodeLinkList::splice(iterator it, TNodeLinkList& rSrc, iterator itBegin, iterator itEnd) { + s32 dist = 0; + if (this == &rSrc) { + if (itBegin == itEnd) { + return; + } + } else { + dist = std::distance(itBegin, itEnd); + if (dist == 0) { + return; + } + } + TLinkListNode* r31 = it.p_; + TLinkListNode* r30 = itBegin.p_; + TLinkListNode* r29 = itEnd.p_; + TLinkListNode* r25 = r29->pPrev_; + TLinkListNode* r24 = r30->pPrev_; + r24->pNext_ = r29; + r29->pPrev_ = r24; + rSrc.count -= dist; + TLinkListNode* r23 = r31->pPrev_; + r23->pNext_ = r30; + r30->pPrev_ = r23; + r25->pNext_ = r31; + r31->pPrev_ = r25; + count += dist; +} + +JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Find(const JGadget::TLinkListNode* p) { + return std::find_if(begin(), end(), TPRIsEqual_pointer_<TLinkListNode>(p)); +} + JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Insert(iterator it, TLinkListNode* p) { - TLinkListNode* pIt = it.node; - TLinkListNode* pItPrev = pIt->mPrev; + JUT_ASSERT(300, p!=NULL); + TLinkListNode* pIt = it.p_; + JUT_ASSERT(302, pIt!=NULL); + TLinkListNode* pItPrev = pIt->pPrev_; + JUT_ASSERT(305, pItPrev!=0); + JGADGET_ASSERTWARN(307, p->pNext_==NULL); + JGADGET_ASSERTWARN(308, p->pPrev_==NULL); - p->mNext = pIt; - p->mPrev = pItPrev; - pIt->mPrev = p; - pItPrev->mNext = p; + p->pNext_ = pIt; + p->pPrev_ = pItPrev; + pIt->pPrev_ = p; + pItPrev->pNext_ = p; count++; return iterator(p); } JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Erase(TLinkListNode* p) { - TLinkListNode* pNext = p->mNext; - TLinkListNode* pPrev = p->mPrev; - pNext->mPrev = pPrev; - pPrev->mNext = pNext; + JUT_ASSERT(325, !empty()); + JUT_ASSERT(326, p!=0); + JUT_ASSERT(327, p!=&oNode_); + TLinkListNode* pNext = p->pNext_; + TLinkListNode* pPrev = p->pPrev_; + JUT_ASSERT(330, pNext!=NULL); + pNext->pPrev_ = pPrev; + JUT_ASSERT(332, pPrev!=NULL); + pPrev->pNext_ = pNext; count--; +#if DEBUG + p->clear_(); +#endif return iterator(pNext); } @@ -73,3 +137,34 @@ JGadget::TNodeLinkList::iterator JGadget::TNodeLinkList::Erase(TLinkListNode* p) void JGadget::TNodeLinkList::Remove(TLinkListNode* p) { remove_if(TPRIsEqual_pointer_<TLinkListNode>(p)); } + +bool JGadget::TNodeLinkList::Confirm() const { + int u = 0; + const_iterator itEnd = end(); + JGADGET_EXITWARN(357, itEnd.p_==&oNode_); + const_iterator it = begin(); + JGADGET_EXITWARN(359, it.p_==oNode_.pNext_); + for (; it != itEnd; ++it, ++u) { + JGADGET_EXITWARN(362, u<size()); + const TLinkListNode* pIt = it.p_; + JUT_ASSERT(364, pIt!=NULL); + JGADGET_EXITWARN(365, pIt->pNext_->pPrev_==pIt); + JGADGET_EXITWARN(366, pIt->pPrev_->pNext_==pIt); + } + JGADGET_EXITWARN(368, it.p_==&oNode_); + JGADGET_EXITWARN(369, u==size()); + return true; +} + +bool JGadget::TNodeLinkList::Confirm_iterator(const_iterator it) const { + const_iterator itBegin = begin(); + const_iterator itEnd = end(); + while (itBegin != itEnd) { + if (itBegin == it) { + return true; + } + ++itBegin; + } + JGADGET_EXITWARN(383, it==itEnd); + return true; +} |
