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

Implement cast from PostfixRankedTree to RankedTree

parent b33728ee
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,7 @@
#include <set>
#include <tree>
#include <algorithm>
#include <stack>
#include <alphabet/ranked_symbol.hpp>
 
namespace tree {
......@@ -28,6 +29,8 @@ public:
template < class SymbolType, class RankType >
static std::tree < std::ranked_symbol < SymbolType, RankType > > toRankedTree ( const std::tree < SymbolType > & from );
template < class SymbolType, class RankType >
static std::tree < std::ranked_symbol < SymbolType, RankType > > toRankedTree (const std::vector < std::ranked_symbol < SymbolType, RankType > > & from);
template < class SymbolType, class RankType >
static std::tree < SymbolType > toUnrankedTree ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & from );
 
};
......@@ -58,6 +61,35 @@ std::tree < std::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::toRanke
return std::tree < std::ranked_symbol < SymbolType, RankType > > ( std::ranked_symbol < SymbolType, RankType > ( tree.getData ( ), size ), std::move ( children ) );
}
 
template < class SymbolType, class RankType >
std::tree < std::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::toRankedTree ( const std::vector < std::ranked_symbol < SymbolType, RankType > > & from ) {
std::stack < std::tree < std::ranked_symbol < SymbolType, RankType > > > tree_stack;
for ( auto x : from ) {
if ( ( unsigned ) x.getRank ( ) == 0 ) {
tree_stack.push ( std::tree < std::ranked_symbol < SymbolType, RankType > > ( std::ranked_symbol < SymbolType, RankType > ( x.getSymbol ( ), x.getRank ( ) ), std::vector < std::tree < std::ranked_symbol < SymbolType, RankType > > > ( ) ) );
} else {
unsigned children_size = ( unsigned ) x.getRank ( );
std::list < std::tree < std::ranked_symbol < SymbolType, RankType > > > childrenList;
for ( unsigned i = 0; i < children_size; ++i ) {
std::tree < std::ranked_symbol < SymbolType, RankType > > child = tree_stack.top ( );
tree_stack.pop ( );
childrenList.push_front ( child );
}
std::vector < std::tree < std::ranked_symbol < SymbolType, RankType > > > children {
std::begin ( childrenList ), std::end ( childrenList )
};
tree_stack.push ( std::tree < std::ranked_symbol < SymbolType, RankType > > ( std::ranked_symbol < SymbolType, RankType > ( x.getSymbol ( ), x.getRank ( ) ), std::move ( children ) ) );
}
}
return tree_stack.top ( );
}
template < class SymbolType, class RankType >
std::tree < SymbolType > TreeAuxiliary::toUnrankedTree ( const std::tree < std::ranked_symbol < SymbolType, RankType > > & tree ) {
std::vector < std::tree < SymbolType > > children;
......
......@@ -19,6 +19,7 @@ auto rankedTreeParserRegister2 = xmlApi < ::tree::RankedTreeWrapper >::ParserReg
auto rankedTreeParserRegister3 = xmlApi < alib::Object >::ParserRegister < ::tree::RankedTree < > > ();
 
auto RankedTreeFromUnrankedTree = castApi::CastRegister < ::tree::RankedTree < >, ::tree::UnrankedTree < > > ( );
auto RankedTreeFromPostfixRankedTree = castApi::CastRegister < ::tree::RankedTree < >, ::tree::PostfixRankedTree < > > ( );
auto RankedTreeCastBinder = castApi::CastPoolStringBinder < ::tree::RankedTree < > > ( ::tree::RankedTree < >::getXmlTagName() );
 
} /* namespace alib */
......@@ -59,6 +59,7 @@ public:
explicit RankedTree ( std::set < std::ranked_symbol < SymbolType, RankType > > alphabet, std::tree < std::ranked_symbol < SymbolType, RankType > > tree );
explicit RankedTree ( std::tree < std::ranked_symbol < SymbolType, RankType > > tree );
explicit RankedTree ( const UnrankedTree < SymbolType > & other );
explicit RankedTree ( const PostfixRankedTree < SymbolType, RankType > & other );
 
/**
* @return Root node of the regular expression tree
......@@ -124,6 +125,7 @@ public:
} /* namespace tree */
 
#include "../unranked/UnrankedTree.h"
#include "PostfixRankedTree.h"
 
namespace tree {
 
......@@ -141,6 +143,10 @@ template < class SymbolType, class RankType >
RankedTree < SymbolType, RankType >::RankedTree ( const UnrankedTree < SymbolType > & other ) : RankedTree ( TreeAuxiliary::toRankedTree < SymbolType, RankType > ( other.getContent ( ) ) ) {
}
 
template < class SymbolType, class RankType >
RankedTree < SymbolType, RankType >::RankedTree ( const PostfixRankedTree < SymbolType, RankType > & other) : RankedTree ( TreeAuxiliary::toRankedTree < SymbolType, RankType > ( other.getContent ( ) ) ) {
}
template < class SymbolType, class RankType >
RankedTreeBase * RankedTree < SymbolType, RankType >::clone ( ) const {
return new RankedTree ( * this );
......
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