summaryrefslogtreecommitdiff
path: root/src/nw4r/ut/ut_LinkList.cpp
blob: 5df5be9f2a599a7e7f2c515ed111c07d818e31f6 (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
#include "nw4r/ut/ut_LinkList.h"

namespace nw4r {
namespace ut {
namespace detail {

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

LinkListImpl::Iterator LinkListImpl::Erase(LinkListImpl::Iterator it) {
    Iterator copy(it);
    return Erase(it, ++copy);
}

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

LinkListImpl::Iterator LinkListImpl::Insert(Iterator it, LinkListNode *p) {
    LinkListNode *next = it.mNode;
    LinkListNode *prev = next->mPrev;

    // prev <- p -> next
    p->mNext = next;
    p->mPrev = prev;
    // prev <-> p <-> next
    next->mPrev = p;
    prev->mNext = p;

    mSize++;

    return Iterator(p);
}

LinkListImpl::Iterator LinkListImpl::Erase(LinkListNode *p) {
    LinkListNode *next = p->mNext;
    LinkListNode *prev = p->mPrev;

    // Remove connections to node
    next->mPrev = prev;
    prev->mNext = next;

    mSize--;

    // Isolate node
    p->mNext = NULL;
    p->mPrev = NULL;

    return Iterator(next);
}

/* Not in SS */
LinkListImpl::Iterator LinkListImpl::Erase(Iterator begin, Iterator end) {
    LinkListNode *pCur = begin.mNode;
    LinkListNode *pEnd = end.mNode;

    while (pCur != pEnd) {
        // Preserve next node before erasing pointers
        LinkListNode *pNext = pCur->mNext;
        // Erase current node
        Erase(pCur);
        pCur = pNext;
    }

    return Iterator(pEnd);
}

} // namespace detail
} // namespace ut
} // namespace nw4r