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

add prefix to tree transformation

parent 1f3860aa
No related branches found
No related tags found
No related merge requests found
...@@ -24,6 +24,8 @@ class TreeAuxiliary { ...@@ -24,6 +24,8 @@ class TreeAuxiliary {
template < class SymbolType, class RankType > 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 ); 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: public:
template < class SymbolType, class RankType > template < class SymbolType, class RankType >
static ext::set < SymbolType > unrankSymbols ( const ext::set < common::ranked_symbol < SymbolType, RankType > > & alphabet ); static ext::set < SymbolType > unrankSymbols ( const ext::set < common::ranked_symbol < SymbolType, RankType > > & alphabet );
...@@ -37,6 +39,8 @@ public: ...@@ -37,6 +39,8 @@ public:
   
template < class SymbolType, class RankType > template < class SymbolType, class RankType >
static ext::tree < common::ranked_symbol < SymbolType, RankType > > postfixToTree (const ext::vector < common::ranked_symbol < SymbolType, RankType > > & from); 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 > template < class SymbolType, class RankType >
static ext::vector < common::ranked_symbol < SymbolType, RankType > > postfixToPrefix ( const ext::vector < common::ranked_symbol < SymbolType, RankType > > & src ); 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 ...@@ -106,6 +110,24 @@ ext::tree < common::ranked_symbol < SymbolType, RankType > > TreeAuxiliary::post
return tree_stack.top ( ); 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 > template < class SymbolType, class RankType >
ext::tree < SymbolType > TreeAuxiliary::rankedToUnranked ( const ext::tree < common::ranked_symbol < SymbolType, RankType > > & tree ) { ext::tree < SymbolType > TreeAuxiliary::rankedToUnranked ( const ext::tree < common::ranked_symbol < SymbolType, RankType > > & tree ) {
......
...@@ -21,5 +21,6 @@ static auto valuePrinter = registration::ValuePrinterRegister < tree::RankedTree ...@@ -21,5 +21,6 @@ static auto valuePrinter = registration::ValuePrinterRegister < tree::RankedTree
   
static auto RankedTreeFromUnrankedTree = registration::CastRegister < tree::RankedTree < >, tree::UnrankedTree < > > ( ); static auto RankedTreeFromUnrankedTree = registration::CastRegister < tree::RankedTree < >, tree::UnrankedTree < > > ( );
static auto RankedTreeFromPostfixRankedTree = registration::CastRegister < tree::RankedTree < >, tree::PostfixRankedTree < > > ( ); static auto RankedTreeFromPostfixRankedTree = registration::CastRegister < tree::RankedTree < >, tree::PostfixRankedTree < > > ( );
static auto RankedTreeFromPrefixRankedTree = registration::CastRegister < tree::RankedTree < >, tree::PrefixRankedTree < > > ( );
   
} /* namespace */ } /* namespace */
...@@ -54,6 +54,7 @@ class RankedTree; ...@@ -54,6 +54,7 @@ class RankedTree;
   
#include "../unranked/UnrankedTree.h" #include "../unranked/UnrankedTree.h"
#include "PostfixRankedTree.h" #include "PostfixRankedTree.h"
#include "PrefixRankedTree.h"
   
namespace tree { namespace tree {
   
...@@ -122,10 +123,17 @@ public: ...@@ -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. * \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 ); 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 & * @copydoc tree::TreeBase::clone ( ) const &
*/ */
...@@ -245,6 +253,10 @@ template < class SymbolType, class RankType > ...@@ -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 ( ) ) ) { 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 > template < class SymbolType, class RankType >
TreeBase * RankedTree < SymbolType, RankType >::clone ( ) const & { TreeBase * RankedTree < SymbolType, RankType >::clone ( ) const & {
return new RankedTree ( * this ); 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