From 8551d39764133782ce807c2846d988628fcf6645 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 28 Jun 2018 10:23:08 +0200 Subject: [PATCH] add prefix to tree transformation --- alib2data/src/tree/common/TreeAuxiliary.h | 22 ++++++++++++++++++++++ alib2data/src/tree/ranked/RankedTree.cpp | 1 + alib2data/src/tree/ranked/RankedTree.h | 14 +++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/alib2data/src/tree/common/TreeAuxiliary.h b/alib2data/src/tree/common/TreeAuxiliary.h index 34d219277c..b2a900fd0d 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 0d48b48f16..cadc5d86ad 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 3e211ba48f..5c2af8af41 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 ); -- GitLab