diff --git a/alib2data/src/tree/common/TreeAuxiliary.h b/alib2data/src/tree/common/TreeAuxiliary.h index ed61d4115ebf238592cf13e4e232d8dc645d22ac..c9b7ae16f6edb4b3459b3df3268ffa043b474080 100644 --- a/alib2data/src/tree/common/TreeAuxiliary.h +++ b/alib2data/src/tree/common/TreeAuxiliary.h @@ -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; diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp index 6ae1ae25a5b3960815d340c631cf091ac0d1c96c..2da2063c6da2bc9e6d356a2008cf2ea7da5e3147 100644 --- a/alib2data/src/tree/ranked/RankedTree.cpp +++ b/alib2data/src/tree/ranked/RankedTree.cpp @@ -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 */ diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h index dfe20350070b9dd459d95257a16201d7086daf64..df92d6a98513c4ae7acda8616c7181ef8284ada5 100644 --- a/alib2data/src/tree/ranked/RankedTree.h +++ b/alib2data/src/tree/ranked/RankedTree.h @@ -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 );