Files
tp/libs/SSystem/SComponent/c_node.cpp
T
Jasper St. Pierre 937da3c59b SComponent c_list / c_node (#5)
* SComponent c_list / c_node

* SComponent: c_tree

* SComponent: start c_phase

* SComponent: c_tag

* SComponent: c_counter

* f_pc_line / f_pc_line_tag

the beginnings of the framework process system

* f_pc_method_tag

* SComponent: c_node_iter / c_list_iter / c_tag_iter / c_tree_iter

* f_pc_draw_priority

* f_pc_method_iter

* f_pc_profile

Also add (untested) base header classes for f_pc_base

* f_pc_searcher

* f_pc_create_tag

* f_pc_creator

* f_pc_layer skeleton

* f_pc_method

* f_pc_line_iter

* f_pc_leaf somewhat

* f_pc_delete_tag

* f_pc_create_req

* Fix a few non-matchings

* c_phase: slight additional notes

* c_node: more matching

* fix build

* c_node: One more matching

* f_pc_line_iter: Matching

* f_pc_create_req: a bit more

* f_pc_load, f_pc_deletor partial

* f_pc_executor partial

* f: minor cleanups

* f_pc_executor

Co-authored-by: Pheenoh <pheenoh@gmail.com>
2020-11-30 17:26:55 -05:00

126 lines
2.3 KiB
C++

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