X-Git-Url: https://feistymeow.org/gitweb/?a=blobdiff_plain;f=nucleus%2Flibrary%2Fnodes%2Ftree.cpp;h=7398274bd6e101f324c88e146dad9d32bf095860;hb=092bb1f6c64b3caf3d9b36577d0900fdf6c2af26;hp=0a2fbf9eea119fd052362fb24356b9a60273e8fe;hpb=5a8e13e7a44ed98d9683bc6cd3bb374e9d3b0756;p=feisty_meow.git diff --git a/nucleus/library/nodes/tree.cpp b/nucleus/library/nodes/tree.cpp index 0a2fbf9e..7398274b 100644 --- a/nucleus/library/nodes/tree.cpp +++ b/nucleus/library/nodes/tree.cpp @@ -17,6 +17,7 @@ #include #include #include +#include //#define DEBUG_TREE // uncomment if you want lots of debugging info. @@ -25,6 +26,7 @@ #define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s) using namespace basis; +using namespace loggers; namespace nodes { @@ -50,12 +52,12 @@ bool tree::iterator::next_node(tree *&to_return) #ifdef DEBUG_TREE FUNCDEF("next_node"); #endif - to_return = NIL; + to_return = NULL_POINTER; #ifdef DEBUG_TREE if ( (_order != to_branches) && (_order != reverse_branches) ) { - if (_aim == AWAY_FROM_ROOT) LOG("going down") - else LOG("going up"); + if (_aim == AWAY_FROM_ROOT) LOG("going down...") + else LOG("going up..."); } #endif switch (_order) { @@ -255,7 +257,7 @@ tree *tree::iterator::next() #ifdef DEBUG_TREE FUNCDEF("next"); #endif - tree *to_return = NIL; + tree *to_return = NULL_POINTER; bool found_tree = false; while (!found_tree) { bool still_running = next_node(to_return); @@ -270,17 +272,19 @@ tree *tree::iterator::next() tree::tree() : node(1) -{ set_link(BACKWARDS_BRANCH, NIL); } +{ set_link(BACKWARDS_BRANCH, NULL_POINTER); } tree::~tree() { + FUNCDEF("destructor"); // must at least unhook ourselves from the parent so we don't become a lost // cousin. tree *my_parent = parent(); if (my_parent) my_parent->prune(this); - my_parent = NIL; // disavow since we are loose now. + my_parent = NULL_POINTER; // disavow since we are loose now. #if 0 + //hmmm: clean this code when it's been examined long enough. maybe already. //original version suffers from being too recursive on windoze, //which blows out the stack. linux never showed this problem. so, i @@ -298,7 +302,8 @@ tree::~tree() // newer version of delete doesn't recurse; it just iterates instead, // which avoids the massive recursive depth of the original approach. tree *curr_node = this; - while (curr_node != NIL) { + tree *stop_node = this; // don't whack self. + while (curr_node != NULL_POINTER) { // make a breadcrumb for getting back to 'here' in the tree. tree *way_back = curr_node; // our main operation here is to go down a node without using any @@ -306,7 +311,7 @@ tree::~tree() // or there are no kids at all. curr_node = curr_node->branch(0); - if (curr_node = NIL) { + if (curr_node == NULL_POINTER) { // wayback has no children, so we can take action. // if wayback is the same as "this", then we exit from iterations since @@ -320,19 +325,14 @@ tree::~tree() // our remit, since wayback is not the same node as the top level one // in the destructor (as long as there are no cycles in the tree...). curr_node = way_back->parent(); // go up in tree on next iteration. - delete way_back; // whack a node, finally. - + WHACK(way_back); // whack a node, finally. } else { // okay, there's a node below here. we will spider down to it. continue; } - - } #endif - - } tree *tree::parent() const { return (tree *)get_link(BACKWARDS_BRANCH); } @@ -342,7 +342,7 @@ int tree::branches() const { return links() - 1; } tree *tree::branch(int branch_number) const { branch_number++; - bounds_return(branch_number, 1, branches(), NIL); + bounds_return(branch_number, 1, branches(), NULL_POINTER); return (tree *)get_link(branch_number); } @@ -352,8 +352,8 @@ int tree::which(tree *branch_to_find) const tree *tree::root() const { const tree *traveler = this; - // keep looking at the backwards branch until it is a NIL. the tree with - // a NIL BACKWARDS_BRANCH is the root. return that tree. + // keep looking at the backwards branch until it is a NULL_POINTER. the tree with + // a NULL_POINTER BACKWARDS_BRANCH is the root. return that tree. while (traveler->get_link(BACKWARDS_BRANCH)) traveler = (tree *)traveler->get_link(BACKWARDS_BRANCH); return const_cast(traveler); @@ -369,7 +369,7 @@ void tree::attach(tree *new_branch) void tree::insert(int branch_place, tree *new_branch) { branch_place++; - insert_link(links(), NIL); + insert_link(links(), NULL_POINTER); if (branch_place >= links()) branch_place = links() - 1; for (int i = links() - 1; i > branch_place; i--) @@ -390,7 +390,7 @@ outcome tree::prune_index(int branch_to_cut) branch_to_cut++; bounds_return(branch_to_cut, 1, branches(), basis::common::NOT_FOUND); tree *that_branch = (tree *)get_link(branch_to_cut); - that_branch->set_link(BACKWARDS_BRANCH, NIL); + that_branch->set_link(BACKWARDS_BRANCH, NULL_POINTER); zap_link(branch_to_cut); return basis::common::OKAY; } @@ -415,7 +415,7 @@ if (to_follow.size()) {} /* tree *traveller = this; path to_accumulate(root()); - while (traveller->parent() != NIL) { + while (traveller->parent() != NULL_POINTER) { // int branch_number = traveller->parent()->which(traveller); // if (branch_number == BRANCH_NOT_FOUND) non_continuable_error // (class_name(), "generate_path", "branch not found during path construction");