#include "TreeNode.h"

TreeNode::TreeNode(string name,string value,vector<TreeNode *> * childVec) {
	init(name,value,childVec);
}
TreeNode::TreeNode(string name,string value) {
	init(name,value,NULL);
}
TreeNode::TreeNode() {
	init("","",NULL);
}
void TreeNode::init(string names,string values,vector<TreeNode*> * vecChild) {
	name = string(names);
	value = string(values);
	if (vecChild==NULL) {
		children = new vector<TreeNode *>();
	} else {
		children = vecChild;
	}
}
TreeNode::~TreeNode() {
	//cout << "~TreeNode()\n";
	clearChildren();
	//if (children!=NULL) {
		//if (children->size() > 0) {
		//if (children.size() > 0) {
			//vector<TreeNode*>::iterator iter = NULL;
			//for (iter = children->begin(); iter < children->end(); iter++) {
			//for (iter = children.begin(); iter < children.end(); iter++) {
			//	delete (TreeNode*)(*iter);
			//}
			//children->clear();
			//children.clear();
		//}
		delete children;
	//}
}
TreeNode * TreeNode::getChild(const string & name) { //throws an exception if child not found!
						//Easier than NULL pointers!
	vector<TreeNode*>::iterator iter;
	if (children!=NULL) {
		//for (iter = children.begin(); iter < children.end(); iter++) {
		for (iter = children->begin(); iter < children->end(); iter++) {
			if ((*iter)->getName() == name) {
				return (*iter);
			}
		}
	}
	throw new string("Child Not Found!");
}
bool TreeNode::existChild(const string & name) { 
	vector<TreeNode*>::iterator iter;
	if (children!=NULL) {
		for (iter = children->begin(); iter < children->end(); iter++) {
		//for (iter = children.begin(); iter < children.end(); iter++) {
			if ((*iter)->getName() == name) {
				return true;
			}
		}
	}
	return false;
}
vector<TreeNode*> * TreeNode::getChildren() {
	return children;
}
void TreeNode::clearChildren() {
	vector<TreeNode*>::iterator iter = NULL;
	for (iter = children->begin(); iter < children->end(); iter++) {
		delete (TreeNode*)(*iter);
	}
	children->clear();
}
string TreeNode::getName() { return name; }
string TreeNode::getValue() { return value; }
