summaryrefslogtreecommitdiff
path: root/src/SSystem/SComponent/c_node.cpp
blob: f23b7b3371ed7a7004ed5b4b98af997e24cd5443 (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
97
98
99
100
101
102
103
104
105
106
107
108
/**
 * c_node.cpp
 *
 */

#include "SSystem/SComponent/c_node.h"
#include <types.h>

void cNd_Join(node_class* node_a, node_class* node_b) {
    node_a->mpNextNode = node_b;
    node_b->mpPrevNode = node_a;
}

int cNd_LengthOf(node_class* node) {
    int count = 0;
    while (node) {
        count++;
        node = NODE_GET_NEXT(node);
    }
    return count;
}

node_class* cNd_First(node_class* node) {
    node_class* ret = NULL;
    while (node) {
        ret = node;
        node = NODE_GET_PREV(node);
    }
    return ret;
}

node_class* cNd_Last(node_class* node) {
    node_class* ret = NULL;
    while (node) {
        ret = node;
        node = NODE_GET_NEXT(node);
    }
    return ret;
}

node_class* cNd_Order(node_class* node, int idx) {
    node_class* ret = NULL;
    int i = 0;
    while (i < idx && node) {
        ret = node;
        i++;
        node = NODE_GET_NEXT(node);
    }

    return i < idx ? ret : NULL;
}

void cNd_SingleCut(node_class* node) {
    node_class* prev = node->mpPrevNode;
    node_class* next = node->mpNextNode;

    if (prev)
        prev->mpNextNode = node->mpNextNode;
    if (next)
        next->mpPrevNode = node->mpPrevNode;
    node->mpPrevNode = NULL;
    node->mpNextNode = NULL;
}

void cNd_Cut(node_class* node) {
    if (node->mpPrevNode)
        node->mpPrevNode->mpNextNode = NULL;
    node->mpPrevNode = NULL;
}

void cNd_Addition(node_class* node_a, node_class* node_b) {
    node_class* pLast = cNd_Last(node_a);
    cNd_Join(pLast, node_b);
}

void cNd_Insert(node_class* node_a, node_class* node_b) {
    if (node_a->mpPrevNode == NULL) {
        cNd_Addition(node_b, node_a);
    } else {
        node_class* prev = node_a->mpPrevNode;
        cNd_Cut(node_a);
        cNd_Addition(prev, node_b);
        cNd_Addition(node_b, node_a);
    }
}

void cNd_SetObject(node_class* node, void* data) {
    while (node) {
        node->mpData = data;
        node = NODE_GET_NEXT(node);
    }
}

void cNd_ClearObject(node_class* node) {
    cNd_SetObject(node, NULL);
}

void cNd_ForcedClear(node_class* node) {
    node->mpPrevNode = NULL;
    node->mpNextNode = NULL;
    node->mpData = NULL;
}

void cNd_Create(node_class* node, void* data) {
    node->mpPrevNode = NULL;
    node->mpNextNode = NULL;
    node->mpData = data;
}