mirror of
https://github.com/zeldaret/ss
synced 2026-06-01 09:47:32 -04:00
26af4db82d
* update from dtk-template and start work towards using clangd * include <a> -> "a" * Update build.yml * remove/add non-trivial class in union warning
122 lines
3.0 KiB
C++
122 lines
3.0 KiB
C++
#include "c/c_tree.h"
|
|
|
|
/* 0x802E0E70 */
|
|
cTreeNd_c::cTreeNd_c() {
|
|
this->forcedClear();
|
|
}
|
|
|
|
/* 0x802E0EA0 */
|
|
void cTreeNd_c::forcedClear() {
|
|
this->mpParent = nullptr;
|
|
this->mpChild = nullptr;
|
|
this->mpPrev = nullptr;
|
|
this->mpNext = nullptr;
|
|
}
|
|
|
|
/* 0x802E0EC0 */
|
|
bool cTreeMg_c::addTreeNode(cTreeNd_c *node, cTreeNd_c *parent) {
|
|
if (node != nullptr) {
|
|
if (parent != nullptr) {
|
|
node->mpParent = parent;
|
|
if (parent->mpChild == nullptr) {
|
|
parent->mpChild = node;
|
|
} else {
|
|
cTreeNd_c *cursor;
|
|
for (cursor = parent->mpChild; cursor->mpNext != nullptr; cursor = cursor->mpNext) {}
|
|
cursor->mpNext = node;
|
|
node->mpPrev = cursor;
|
|
}
|
|
} else {
|
|
cTreeNd_c *cursor = this->mpRootNode;
|
|
if (cursor != nullptr) {
|
|
for (; cursor->mpNext != nullptr; cursor = cursor->mpNext) {}
|
|
cursor->mpNext = node;
|
|
node->mpPrev = cursor;
|
|
} else {
|
|
this->mpRootNode = node;
|
|
}
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 0x802E0F60*/
|
|
bool cTreeMg_c::removeTreeNode(cTreeNd_c *node) {
|
|
if (node != nullptr) {
|
|
if (node->mpChild != nullptr) {
|
|
return false;
|
|
}
|
|
if (node->mpPrev != nullptr) {
|
|
node->mpPrev->mpNext = node->mpNext;
|
|
} else if (node->mpParent != nullptr) {
|
|
node->mpParent->mpChild = node->mpNext;
|
|
} else if (node == this->mpRootNode) {
|
|
this->mpRootNode = node->mpNext;
|
|
}
|
|
|
|
if (node->mpNext != nullptr) {
|
|
node->mpNext->mpPrev = node->mpPrev;
|
|
}
|
|
|
|
node->mpPrev = nullptr;
|
|
node->mpNext = nullptr;
|
|
node->mpParent = nullptr;
|
|
} else {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
/* 0x802E1000 */
|
|
bool cTreeMg_c::insertTreeNode(cTreeNd_c *node, cTreeNd_c *parent) {
|
|
cTreeNd_c *cursor;
|
|
|
|
for (cursor = parent; cursor != nullptr; cursor = cursor->mpParent) {
|
|
if (cursor == node) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (node != nullptr) {
|
|
cTreeNd_c *child = node->mpChild;
|
|
node->mpChild = nullptr;
|
|
if (!this->removeTreeNode(node)) {
|
|
node->mpChild = child;
|
|
return false;
|
|
} else {
|
|
node->mpChild = child;
|
|
return this->addTreeNode(node, parent);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/* 0x802E10C0 */
|
|
cTreeNd_c *cTreeNd_c::getTreeNext() const {
|
|
cTreeNd_c *child = this->mpChild;
|
|
if (child != nullptr) {
|
|
return child;
|
|
} else {
|
|
return this->getTreeNextNotChild();
|
|
}
|
|
}
|
|
|
|
/* 0x802E1100 */
|
|
cTreeNd_c *cTreeNd_c::getTreeNextNotChild() const {
|
|
if (this->mpNext != nullptr) {
|
|
return this->mpNext;
|
|
}
|
|
|
|
cTreeNd_c *parent;
|
|
|
|
for (parent = this->mpParent; parent != nullptr; parent = parent->mpParent) {
|
|
if (parent->mpNext != nullptr) {
|
|
return parent->mpNext;
|
|
}
|
|
}
|
|
return nullptr;
|
|
}
|