Skip to content
Snippets Groups Projects
Commit c888890e authored by Jan Trávníček's avatar Jan Trávníček
Browse files

add functionality to common tree implementation

parent 4b40de4e
No related branches found
No related tags found
No related merge requests found
......@@ -243,6 +243,17 @@ class FixedaryNode {
std::vector < Data > children;
 
public:
template < typename ... Types >
FixedaryNode ( Types ... data ) {
Data args[] { std::move ( data ) ... };
for ( Data & child : args )
children.push_back ( std::move ( child ) );
for ( Data & child : children )
child->parent = static_cast < Cast * > ( this );
}
FixedaryNode ( std::vector < Data > c ) : children ( std::move ( c ) ) {
for ( Data & child : children )
child->parent = static_cast < Cast * > ( this );
......@@ -264,12 +275,13 @@ public:
FixedaryNode & operator =( FixedaryNode && other ) noexcept {
std::swap ( this->children, other.children );
 
children->parent = static_cast < Cast * > ( this );
for ( Data & child : children )
child->parent = static_cast < Cast * > ( this );
 
return * this;
}
 
const std::vector < Data > & getChildren ( ) {
std::vector < Data > & getChildren ( ) {
return children;
}
 
......@@ -303,6 +315,9 @@ class VararyNode {
std::vector < Data > children;
 
public:
VararyNode ( ) {
}
VararyNode ( std::vector < Data > c ) : children ( std::move ( c ) ) {
for ( Data & child : children )
child->parent = static_cast < Cast * > ( this );
......@@ -324,12 +339,13 @@ public:
VararyNode & operator =( VararyNode && other ) noexcept {
std::swap ( this->children, other.children );
 
children->parent = static_cast < Cast * > ( this );
for ( Data & child : children )
child->parent = static_cast < Cast * > ( this );
 
return * this;
}
 
const std::vector < Data > & getChildren ( ) {
std::vector < Data > & getChildren ( ) {
return children;
}
 
......@@ -350,6 +366,29 @@ public:
children[index]->parent = static_cast < Cast * > ( this );
}
 
void setChild ( Data d, typename std::vector < Data >::iterator it ) {
* it = std::move ( d );
( * it )->parent = static_cast < Cast * > ( this );
}
template < class InputIterator >
typename std::vector < Data >::iterator insert ( typename std::vector < Data >::iterator it, InputIterator first, InputIterator last ) {
size_t off = it - children.begin ( );
size_t size = last - first;
children.insert ( it, first, last );
it = children.begin ( ) + off;
// TODO on g++-4.9 use: it = children->insert( it, first, last );
typename std::vector < Data >::iterator end = it + size;
for ( ; it != end; it++ )
( * it )->parent = static_cast < Cast * > ( this );
return it;
}
void pushBackChild ( Data d ) {
children.push_back ( std::move ( d ) );
children[children.size ( ) - 1]->parent = static_cast < Cast * > ( this );
......@@ -410,6 +449,15 @@ public:
const_cast < VararyNode < Data, ConstData, Cast > & > ( node ).setChild ( std::move ( child ), index );
}
 
static void setChild ( const VararyNode < Data, ConstData, Cast > & node, Data child, typename std::vector < Data >::iterator it ) {
const_cast < VararyNode < Data, ConstData, Cast > & > ( node ).setChild ( std::move ( child ), it );
}
template < class InputIterator >
typename std::vector < Data >::iterator insert ( const VararyNode < Data, ConstData, Cast > & node, typename std::vector < Data >::iterator it, InputIterator first, InputIterator last ) {
const_cast < VararyNode < Data, ConstData, Cast > & > ( node ).insert ( it, first, last );
}
static void pushBackChild ( const VararyNode < Data, ConstData, Cast > & node, Data child ) {
const_cast < VararyNode < Data, ConstData, Cast > & > ( node ).pushBackChild ( std::move ( child ) );
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment