//#define DEBUG_SYMBOL_TREE
// uncomment for totally noisy version.
+#include <loggers/program_wide_logger.h>
#undef LOG
-#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), s)
+#define LOG(s) CLASS_EMERGENCY_LOG(program_wide_logger::get(), astring(s) + a_sprintf(" [obj=%p]", this))
+using namespace loggers;
using namespace basis;
using namespace structures;
namespace nodes {
+//hmmm: used for... explain please.
class symbol_tree_associations : public symbol_table<symbol_tree *>
{
public:
symbol_tree_associations(int estimated_elements)
: symbol_table<symbol_tree *>(estimated_elements) {}
+ virtual ~symbol_tree_associations() {
+//probably we don't actually want to whack here???
+// for (int i = 0; i < symbols(); i++) {
+// WHACK(use(i));
+// }
+ }
};
//////////////
_associations(new symbol_tree_associations(estimated_elements)),
_name(new astring(node_name))
{
+ FUNCDEF("constructor")
}
symbol_tree::~symbol_tree()
{
- WHACK(_name);
+ FUNCDEF("destructor");
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: prior to whacks");
+#endif
WHACK(_associations);
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: after whacking associations");
+#endif
+ WHACK(_name);
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("symtree dtor: after all whacks");
+#endif
}
int symbol_tree::children() const { return _associations->symbols(); }
FUNCDEF("prune");
#endif
symbol_tree *to_zap = dynamic_cast<symbol_tree *>(to_zap_in);
- if (!to_zap)
- throw("error: symbol_tree::prune: wrong type of node in prune");
+ if (to_zap) {
+#ifdef DEBUG_SYMBOL_TREE
+ LOG(astring("zapping node for ") + to_zap->name());
+#endif
+ int found = which(to_zap); // find the node in the tree.
+ if (negative(found)) return common::NOT_FOUND; // not found.
+#ifdef DEBUG_SYMBOL_TREE
+ int kids = _associations->symbols();
+#endif
+ _associations->whack(to_zap->name()); // remove from associations.
#ifdef DEBUG_SYMBOL_TREE
- LOG(astring("zapping node for ") + to_zap->name());
+ if (kids - 1 != _associations->symbols())
+ throw("error: symbol_tree::prune: failed to crop kid in symtab");
#endif
- int found = which(to_zap); // find the node in the tree.
- if (negative(found)) return common::NOT_FOUND; // not found.
+ } else {
#ifdef DEBUG_SYMBOL_TREE
- int kids = _associations->symbols();
+ LOG("skip symtree prune steps due to null symtree after dynamic cast.");
#endif
- _associations->whack(to_zap->name()); // remove from associations.
+///hmmm: how about not? throw("error: symbol_tree::prune: wrong type of node in prune");
+ }
#ifdef DEBUG_SYMBOL_TREE
- if (kids - 1 != _associations->symbols())
- throw("error: symbol_tree::prune: failed to crop kid in symtab");
+ LOG("about to call base tree::prune...");
#endif
tree::prune(to_zap); // remove from tree.
+#ifdef DEBUG_SYMBOL_TREE
+ LOG("after called base tree::prune.");
+#endif
return common::OKAY;
}
#ifdef DEBUG_SYMBOL_TREE
FUNCDEF("find");
#endif
- if (comp == NIL) comp = astring_comparator;
+ if (comp == NULL_POINTER) comp = astring_comparator;
#ifdef DEBUG_SYMBOL_TREE
LOG(astring("finding node called ") + to_find);
#endif
// perform the upward recursion first, since it's pretty simple.
if (how == recurse_upward) {
symbol_tree *our_parent = dynamic_cast<symbol_tree *>(parent());
- if (!our_parent) return NIL; // done recursing.
+ if (!our_parent) return NULL_POINTER; // done recursing.
return our_parent->find(to_find, how, comp);
}
if (!found) {
if (how == recurse_downward) {
// see if we can't find that name in a sub-node.
- symbol_tree *answer = NIL;
+ symbol_tree *answer = NULL_POINTER;
for (int i = 0; i < branches(); i++) {
// we will try each branch in turn and see if it has a child named
// appropriately.
return answer;
}
}
- return NIL;
+ return NULL_POINTER;
}
return *found;
}