diff --git a/alib2data/src/tree/common/TreeAuxiliary.h b/alib2data/src/tree/common/TreeAuxiliary.h index 34d219277c6dc8bc204e131bb00234303d3d83ea..b2a900fd0dc6f9b65b9d0b8bedcbd9a2329bb891 100644 --- a/alib2data/src/tree/common/TreeAuxiliary.h +++ b/alib2data/src/tree/common/TreeAuxiliary.h @@ -24,6 +24,8 @@ class TreeAuxiliary { template < class SymbolType, class RankType > static void postfixToPrefixInt ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & src, ext::vector < common::ranked_symbol < SymbolType, RankType > > & dest, unsigned & readIndex ); + template < class SymbolType, class RankType > + static ext::tree < common::ranked_symbol < SymbolType, RankType > > prefixToTreeInt ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from, unsigned & index ); public: template < class SymbolType, class RankType > static ext::set < SymbolType > unrankSymbols ( const ext::set < common::ranked_symbol < SymbolType, RankType > > & alphabet ); @@ -37,6 +39,8 @@ public: template < class SymbolType, class RankType > static ext::tree < common::ranked_symbol < SymbolType, RankType > > postfixToTree (const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from); + template < class SymbolType, class RankType > + static ext::tree < common::ranked_symbol < SymbolType, RankType > > prefixToTree (const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from); template < class SymbolType, class RankType > static ext::vector < common::ranked_symbol < SymbolType, RankType > > postfixToPrefix ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & src ); @@ -106,6 +110,24 @@ ext::tree < common::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::post return tree_stack.top ( ); } +template < class SymbolType, class RankType > +ext::tree < common::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::prefixToTreeInt ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from, unsigned & index ) { + const common::ranked_symbol < SymbolType, RankType > & x = from [ index ++ ]; + + ext::vector < ext::tree < common::ranked_symbol < SymbolType, RankType > > > children; + + for ( unsigned i = 0; i < ( unsigned ) x.getRank ( ); ++i ) { + children.push_back ( prefixToTreeInt ( from, index ) ); + } + + return ext::tree < common::ranked_symbol < SymbolType, RankType > > ( x, std::move ( children ) ); +} + +template < class SymbolType, class RankType > +ext::tree < common::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::prefixToTree ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from ) { + unsigned index = 0; + return prefixToTreeInt ( from, index ); +} template < class SymbolType, class RankType > ext::tree < SymbolType > TreeAuxiliary::rankedToUnranked ( const ext::tree < common::ranked_symbol < SymbolType, RankType > > & tree ) { diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp index 0d48b48f161a222d73895368bbee3474a71fbf00..cadc5d86add13dd94eaa2ed533db346e9eeb8993 100644 --- a/alib2data/src/tree/ranked/RankedTree.cpp +++ b/alib2data/src/tree/ranked/RankedTree.cpp @@ -21,5 +21,6 @@ static auto valuePrinter = registration::ValuePrinterRegister < tree::RankedTree static auto RankedTreeFromUnrankedTree = registration::CastRegister < tree::RankedTree < >, tree::UnrankedTree < > > ( ); static auto RankedTreeFromPostfixRankedTree = registration::CastRegister < tree::RankedTree < >, tree::PostfixRankedTree < > > ( ); +static auto RankedTreeFromPrefixRankedTree = registration::CastRegister < tree::RankedTree < >, tree::PrefixRankedTree < > > ( ); } /* namespace */ diff --git a/alib2data/src/tree/ranked/RankedTree.h b/alib2data/src/tree/ranked/RankedTree.h index 3e211ba48fccce5d689d70f1fc040e06a452e738..5c2af8af41a2a72f9470d7a0473788d06f4d2a1f 100644 --- a/alib2data/src/tree/ranked/RankedTree.h +++ b/alib2data/src/tree/ranked/RankedTree.h @@ -54,6 +54,7 @@ class RankedTree; #include "../unranked/UnrankedTree.h" #include "PostfixRankedTree.h" +#include "PrefixRankedTree.h" namespace tree { @@ -122,10 +123,17 @@ public: /** * \brief Creates a new instance of the tree based on the PostfixRankedTree. The natural representation is recreated from postfix representation. * - * \param other RankedTree representation of a tree. + * \param other PostfixRankedTree representation of a tree. */ explicit RankedTree ( const PostfixRankedTree < SymbolType, RankType > & other ); + /** + * \brief Creates a new instance of the tree based on the PrefixRankedTree. The natural representation is recreated from prefix representation. + * + * \param other PrefixRankedTree representation of a tree. + */ + explicit RankedTree ( const PrefixRankedTree < SymbolType, RankType > & other ); + /** * @copydoc tree::TreeBase::clone ( ) const & */ @@ -245,6 +253,10 @@ template < class SymbolType, class RankType > RankedTree < SymbolType, RankType >::RankedTree ( const PostfixRankedTree < SymbolType, RankType > & other) : RankedTree ( TreeAuxiliary::postfixToTree < SymbolType, RankType > ( other.getContent ( ) ) ) { } +template < class SymbolType, class RankType > +RankedTree < SymbolType, RankType >::RankedTree ( const PrefixRankedTree < SymbolType, RankType > & other) : RankedTree ( TreeAuxiliary::prefixToTree < SymbolType, RankType > ( other.getContent ( ) ) ) { +} + template < class SymbolType, class RankType > TreeBase * RankedTree < SymbolType, RankType >::clone ( ) const & { return new RankedTree ( * this );