2013-05-11 16:13:46 -04:00
# ifndef NODETREE_H
# define NODETREE_H
# ifndef NULL
# define NULL 0
2013-05-20 19:34:15 -04:00
# endif
2013-05-11 16:13:46 -04:00
2013-06-23 05:54:58 -04:00
# include <util.h>
2013-07-28 19:45:08 -04:00
//#include <Symbol.h>
2013-06-23 05:54:58 -04:00
2013-05-11 16:13:46 -04:00
# include <vector>
# include <string>
2013-06-23 05:54:58 -04:00
# include <iostream>
2013-05-11 16:13:46 -04:00
2013-06-27 23:45:38 -04:00
//Circular references
2013-07-28 19:45:08 -04:00
//class Symbol;
2013-06-27 23:45:38 -04:00
2013-07-28 19:45:08 -04:00
template < class T >
2013-05-11 16:13:46 -04:00
class NodeTree {
public :
NodeTree ( ) ;
2013-07-28 19:45:08 -04:00
NodeTree ( std : : string name , T inData ) ;
2013-05-11 16:13:46 -04:00
~ NodeTree ( ) ;
void setParent ( NodeTree * parent ) ;
NodeTree * getParent ( ) ;
void addChild ( NodeTree * child ) ;
int findChild ( NodeTree * child ) ;
void removeChild ( NodeTree * child ) ;
void removeChild ( int index ) ;
NodeTree * get ( int index ) ;
2013-06-27 23:45:38 -04:00
std : : string getName ( ) ;
2013-05-11 16:13:46 -04:00
void setName ( std : : string ) ;
2013-07-28 19:45:08 -04:00
T getData ( ) ;
void setData ( T data ) ;
2013-06-27 23:45:38 -04:00
2013-05-11 16:13:46 -04:00
int size ( ) ;
std : : string DOTGraphString ( ) ;
private :
std : : string DOTGraphStringHelper ( ) ;
2013-06-23 05:54:58 -04:00
std : : string getDOTName ( ) ;
2013-05-11 16:13:46 -04:00
std : : string name ;
2013-07-28 19:45:08 -04:00
T data ;
2013-05-11 16:13:46 -04:00
NodeTree * parent ;
std : : vector < NodeTree * > children ;
2013-06-23 05:54:58 -04:00
static int idCounter ;
int id ;
2013-05-11 16:13:46 -04:00
} ;
2013-07-28 19:45:08 -04:00
template < class T >
int NodeTree < T > : : idCounter ;
template < class T >
NodeTree < T > : : NodeTree ( ) {
parent = NULL ;
name = " UnnamedNode " ;
data = NULL ;
id = idCounter + + ;
}
template < class T >
NodeTree < T > : : NodeTree ( std : : string name , T inData ) {
parent = NULL ;
data = NULL ;
this - > name = name ;
this - > data = inData ;
id = idCounter + + ;
}
template < class T >
NodeTree < T > : : ~ NodeTree ( ) {
children . clear ( ) ;
}
template < class T >
void NodeTree < T > : : setParent ( NodeTree < T > * parent ) {
if ( this - > parent ! = NULL ) {
this - > parent - > removeChild ( this ) ;
}
this - > parent = parent ;
}
template < class T >
NodeTree < T > * NodeTree < T > : : getParent ( ) {
return parent ;
}
template < class T >
void NodeTree < T > : : addChild ( NodeTree < T > * child ) {
if ( findChild ( child ) = = - 1 )
children . push_back ( child ) ;
}
template < class T >
int NodeTree < T > : : findChild ( NodeTree < T > * child ) {
for ( int i = 0 ; i < children . size ( ) ; i + + ) {
if ( children [ i ] = = child ) {
return i ;
}
}
return - 1 ;
}
template < class T >
void NodeTree < T > : : removeChild ( int index ) {
children [ index ] = NULL ;
children . erase ( children . begin ( ) + index ) ;
}
template < class T >
void NodeTree < T > : : removeChild ( NodeTree < T > * child ) {
int index = findChild ( child ) ;
if ( index ! = 0 ) {
removeChild ( index ) ;
}
}
template < class T >
int NodeTree < T > : : size ( ) {
int count = 0 ;
for ( int i = 0 ; i < children . size ( ) ; i + + ) {
count + = children [ i ] - > size ( ) ;
}
return 1 + count ;
}
template < class T >
NodeTree < T > * NodeTree < T > : : get ( int index ) {
return children [ index ] ;
}
template < class T >
std : : string NodeTree < T > : : getName ( ) {
return name ;
}
template < class T >
void NodeTree < T > : : setName ( std : : string name ) {
this - > name = name ;
}
template < class T >
T NodeTree < T > : : getData ( ) {
return data ;
}
template < class T >
void NodeTree < T > : : setData ( T data ) {
this - > data = data ;
}
template < class T >
std : : string NodeTree < T > : : DOTGraphString ( ) {
return ( " digraph Kraken { \n " + DOTGraphStringHelper ( ) + " } " ) ;
}
template < class T >
std : : string NodeTree < T > : : DOTGraphStringHelper ( ) {
std : : string ourDOTRelation = " " ;
for ( int i = 0 ; i < children . size ( ) ; i + + ) {
ourDOTRelation + = getDOTName ( ) + " -> " + children [ i ] - > getDOTName ( ) + " ; \n " + children [ i ] - > DOTGraphStringHelper ( ) ;
}
return ( ourDOTRelation ) ;
}
template < class T >
std : : string NodeTree < T > : : getDOTName ( ) {
if ( data ! = NULL )
return " \" " + name + " - " + data - > toString ( ) + " _ " + intToString ( id ) + " \" " ; //Note that terminals already have a quote in the front of their name, so we don't need to add one
return " \" " + name + " _ " + intToString ( id ) + " \" " ;
}
2013-05-20 19:34:15 -04:00
# endif