summaryrefslogtreecommitdiff
path: root/libs/revolution/src/homebuttonLib/nw4hbm/ut/ut_LinkList.cpp
blob: 1a812db5ba14cdefc5436a5d0b91ef1ea97076cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include "LinkList.h"

#include "../db/assert.h"

namespace nw4hbm {
    namespace ut {
        namespace detail {

            LinkListImpl::~LinkListImpl() {
                Clear();
            }

            LinkListImpl::Iterator LinkListImpl::Erase(Iterator it) {
                // clang-format off
                NW4HBM_ASSERT(31, it.mPointer!=&mNode);
                // clang-format on

                Iterator itNext(it);
                ++itNext;

                return Erase(it, itNext);
            }

            LinkListImpl::Iterator LinkListImpl::Erase(LinkListImpl::Iterator itFirst,
                                                       LinkListImpl::Iterator itLast) {
                LinkListNode *p = itFirst.mPointer, *pItLast = itLast.mPointer, *pNext;

                while (p != pItLast) {
                    pNext = p->mNext;
                    Erase(p);
                    p = pNext;
                }

                return itLast;
            }

            void LinkListImpl::Clear() {
                Erase(GetBeginIter(), GetEndIter());
            }

            LinkListImpl::Iterator LinkListImpl::Insert(Iterator it, LinkListNode* p) {
                NW4HBM_ASSERT_CHECK_NULL(74, p);

                LinkListNode* pIt = it.mPointer;
                NW4HBM_ASSERT_CHECK_NULL(76, pIt);

                LinkListNode* pItPrev = pIt->mPrev;
                NW4HBM_ASSERT_CHECK_NULL(79, pItPrev);

                NW4HBM_ASSERT(81, p->mNext == NULL);
                NW4HBM_ASSERT(82, p->mPrev == NULL);
                p->mNext = pIt;
                p->mPrev = pItPrev;

                pIt->mPrev = p;
                pItPrev->mNext = p;

                mSize++;

                return (Iterator)p;
            }

            LinkListImpl::Iterator LinkListImpl::Erase(LinkListNode* p) {
                // clang-format off
                NW4HBM_ASSERT(96, !IsEmpty());
                NW4HBM_ASSERT_CHECK_NULL(97, p);
                NW4HBM_ASSERT(98, p!=&mNode);
                // clang-format on

                LinkListNode* pNext = p->mNext;
                LinkListNode* pPrev = p->mPrev;

                SetPrev(pPrev, pNext);
                SetNext(pPrev, pNext);

                mSize--;

                p->mNext = NULL;
                p->mPrev = NULL;

                return (Iterator)pNext;
            }

            void LinkListImpl::SetPrev(LinkListNode* pPrev, LinkListNode* pNext) {
                NW4HBM_ASSERT_CHECK_NULL(101, pNext);
                pNext->mPrev = pPrev;
            }

            void LinkListImpl::SetNext(LinkListNode* pPrev, LinkListNode* pNext) {
                NW4HBM_ASSERT_CHECK_NULL(103, pPrev);
                pPrev->mNext = pNext;
            }

        }  // namespace detail
    }  // namespace ut
}  // namespace nw4hbm