nuclear@0: #include nuclear@0: #include nuclear@0: #include "node.h" nuclear@0: nuclear@0: Node::Node() nuclear@0: { nuclear@0: parent = 0; nuclear@0: } nuclear@0: nuclear@0: Node::~Node() nuclear@0: { nuclear@0: } nuclear@0: nuclear@0: void Node::set_name(const char *name) nuclear@0: { nuclear@0: this->name = name; nuclear@0: } nuclear@0: nuclear@0: const char *Node::get_name() const nuclear@0: { nuclear@0: return name.c_str(); nuclear@0: } nuclear@0: nuclear@0: void Node::add_child(Node *c) nuclear@0: { nuclear@0: // make sure we don't add it twice nuclear@0: if(std::find(children.begin(), children.end(), c) != children.end()) { nuclear@0: return; nuclear@0: } nuclear@0: children.push_back(c); nuclear@0: c->parent = this; nuclear@0: } nuclear@0: nuclear@0: int Node::get_num_children() const nuclear@0: { nuclear@0: return (int)children.size(); nuclear@0: } nuclear@0: nuclear@0: Node *Node::get_child(int idx) const nuclear@0: { nuclear@0: if(idx < 0 || idx >= get_num_children()) { nuclear@0: return 0; nuclear@0: } nuclear@0: return children[idx]; nuclear@0: } nuclear@0: nuclear@0: Node *Node::get_child(const char *name) const nuclear@0: { nuclear@0: for(size_t i=0; iget_name(), name) == 0) { nuclear@0: return children[i]; nuclear@0: } nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: Node *Node::get_descendant(const char *name) const nuclear@0: { nuclear@0: Node *c = get_child(name); nuclear@0: if(c) { nuclear@0: return c; nuclear@0: } nuclear@0: nuclear@0: // depth first search might not be ideal in this case, but it's the simplest nuclear@0: for(size_t i=0; iget_descendant(name))) { nuclear@0: return c; nuclear@0: } nuclear@0: } nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: Node *Node::get_parent() const nuclear@0: { nuclear@0: return parent; nuclear@0: } nuclear@0: nuclear@0: Node *Node::get_ancestor(const char *name) const nuclear@0: { nuclear@0: Node *n = (Node*)this; nuclear@0: nuclear@0: if(!name) { nuclear@0: // just return the root nuclear@0: while(n->parent) { nuclear@0: n = n->parent; nuclear@0: } nuclear@0: return n; nuclear@0: } nuclear@0: nuclear@0: // otherwise we're looking for a specific ancestor nuclear@0: while(n && strcmp(n->get_name(), name) != 0) { nuclear@0: n = n->parent; nuclear@0: } nuclear@0: return n; nuclear@0: }