Files
tp/libs/SSystem/SComponent/c_node.cpp
T

112 lines
2.3 KiB
C++
Raw Normal View History

2020-11-30 14:26:55 -08:00
#include "SComponent/c_node.h"
2020-12-26 11:31:49 -05:00
#include "global.h"
2020-11-30 14:26:55 -08:00
extern "C" {
#define NODE_GET_PREV(pNode) (pNode ? pNode->mpPrevNode : NULL)
#define NODE_GET_NEXT(pNode) (pNode ? pNode->mpNextNode : NULL)
2020-12-26 11:31:49 -05:00
void cNd_Join(node_class* pA, node_class* pB) {
2020-11-30 14:26:55 -08:00
pA->mpNextNode = pB;
pB->mpPrevNode = pA;
}
2020-12-26 11:31:49 -05:00
int cNd_LengthOf(node_class* pNode) {
2020-11-30 14:26:55 -08:00
int count = 0;
while (pNode) {
count++;
pNode = NODE_GET_NEXT(pNode);
}
return count;
}
2020-12-26 11:31:49 -05:00
node_class* cNd_First(node_class* pNode) {
node_class* pRet = NULL;
2020-11-30 14:26:55 -08:00
while (pNode) {
pRet = pNode;
pNode = NODE_GET_PREV(pNode);
}
return pRet;
}
2020-12-26 11:31:49 -05:00
node_class* cNd_Last(node_class* pNode) {
node_class* pRet = NULL;
2020-11-30 14:26:55 -08:00
while (pNode) {
pRet = pNode;
pNode = NODE_GET_NEXT(pNode);
}
return pRet;
}
2020-12-26 11:31:49 -05:00
node_class* cNd_Order(node_class* pNode, int idx) {
node_class* pRet = NULL;
2020-11-30 14:26:55 -08:00
int i = 0;
while (i < idx && pNode) {
pRet = pNode;
i++;
pNode = NODE_GET_NEXT(pNode);
}
if (i < idx)
return pRet;
return NULL;
}
2020-12-26 11:31:49 -05:00
void cNd_SingleCut(node_class* pNode) {
node_class* pPrev = pNode->mpPrevNode;
node_class* pNext = pNode->mpNextNode;
2020-11-30 14:26:55 -08:00
if (pPrev)
pPrev->mpNextNode = pNode->mpNextNode;
if (pNext)
pNext->mpPrevNode = pNode->mpPrevNode;
pNode->mpPrevNode = NULL;
pNode->mpNextNode = NULL;
}
2020-12-26 11:31:49 -05:00
void cNd_Cut(node_class* pNode) {
2020-11-30 14:26:55 -08:00
if (pNode->mpPrevNode)
pNode->mpPrevNode->mpNextNode = NULL;
pNode->mpPrevNode = NULL;
}
2020-12-26 11:31:49 -05:00
void cNd_Addition(node_class* pA, node_class* pB) {
node_class* pLast = cNd_Last(pA);
2020-11-30 14:26:55 -08:00
cNd_Join(pLast, pB);
}
2020-12-26 11:31:49 -05:00
void cNd_Insert(node_class* pA, node_class* pB) {
node_class* pPrev = pA->mpPrevNode;
2020-11-30 14:26:55 -08:00
if (pPrev == NULL) {
cNd_Addition(pB, pA);
} else {
cNd_Cut(pA);
cNd_Addition(pPrev, pB);
cNd_Addition(pB, pA);
}
}
2020-12-26 11:31:49 -05:00
void cNd_SetObject(node_class* pNode, void* pData) {
2020-11-30 14:26:55 -08:00
while (pNode) {
pNode->mpData = pData;
pNode = NODE_GET_NEXT(pNode);
}
}
2020-12-26 11:31:49 -05:00
void cNd_ClearObject(node_class* pNode) {
2020-11-30 14:26:55 -08:00
cNd_SetObject(pNode, NULL);
}
2020-12-26 11:31:49 -05:00
void cNd_ForcedClear(node_class* pNode) {
2020-11-30 14:26:55 -08:00
pNode->mpPrevNode = NULL;
pNode->mpNextNode = NULL;
pNode->mpData = NULL;
}
2020-12-26 11:31:49 -05:00
void cNd_Create(node_class* pNode, void* pData) {
2020-11-30 14:26:55 -08:00
pNode->mpPrevNode = NULL;
pNode->mpNextNode = NULL;
pNode->mpData = pData;
}
};