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

preserve alphabet while casting

parent 36f85886
No related branches found
No related tags found
No related merge requests found
...@@ -31,23 +31,29 @@ ...@@ -31,23 +31,29 @@
namespace tree { namespace tree {
   
PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
this->alphabet = std::move ( alphabet ); addSymbolsToAlphabet ( std::move ( alphabet ) );
setContent ( std::move ( data ) ); setContent ( std::move ( data ) );
} }
   
PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
arityChecksum ( data ); arityChecksum ( data );
   
alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ); addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
m_Data = std::move ( data ); m_Data = std::move ( data );
} }
   
PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) {
toPrefixRankedBar ( tree.getRoot ( ) ); toPrefixRankedBar ( tree.getRoot ( ) );
alphabet = std::set < alphabet::RankedSymbol > ( m_Data.begin ( ), m_Data.end ( ) );
for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
addSymbolToAlphabet ( symbol );
addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
}
addSymbolToAlphabet ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) );
} }
   
PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getContent ( ) ) { PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) {
} }
   
PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), tree ) { PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), tree ) {
......
...@@ -31,6 +31,8 @@ class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphab ...@@ -31,6 +31,8 @@ class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphab
alphabet::Symbol bar; alphabet::Symbol bar;
alphabet::Symbol variablesBar; alphabet::Symbol variablesBar;
   
void toPrefixRankedBar ( const RankedNode & node );
public: public:
explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data );
...@@ -38,8 +40,6 @@ public: ...@@ -38,8 +40,6 @@ public:
explicit PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ); explicit PrefixRankedBarPattern ( const PrefixRankedBarTree & tree );
explicit PrefixRankedBarPattern ( const RankedPattern & tree ); explicit PrefixRankedBarPattern ( const RankedPattern & tree );
   
void toPrefixRankedBar ( const RankedNode & node );
virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * clone ( ) const;
virtual RankedTreeBase * plunder ( ) &&; virtual RankedTreeBase * plunder ( ) &&;
   
......
...@@ -28,20 +28,24 @@ ...@@ -28,20 +28,24 @@
namespace tree { namespace tree {
   
PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) { PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
this->alphabet = std::move ( alphabet ); addSymbolsToAlphabet ( std::move ( alphabet ) );
setContent ( std::move ( data ) ); setContent ( std::move ( data ) );
} }
   
PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) { PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) {
arityChecksum ( data ); arityChecksum ( data );
   
alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ); addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
m_Data = std::move ( data ); m_Data = std::move ( data );
} }
   
PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : bar ( std::move ( bar ) ) { PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : bar ( std::move ( bar ) ) {
toPrefixRankedBar ( tree.getRoot ( ) ); toPrefixRankedBar ( tree.getRoot ( ) );
alphabet = std::set < alphabet::RankedSymbol > ( m_Data.begin ( ), m_Data.end ( ) );
for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) {
addSymbolToAlphabet ( symbol );
addSymbolToAlphabet ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), symbol.getRank ( ) ) );
}
} }
   
PrefixRankedBarTree::PrefixRankedBarTree ( const RankedTree & tree ) : PrefixRankedBarTree ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), tree ) { PrefixRankedBarTree::PrefixRankedBarTree ( const RankedTree & tree ) : PrefixRankedBarTree ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), tree ) {
......
...@@ -29,14 +29,14 @@ class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet { ...@@ -29,14 +29,14 @@ class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet {
   
alphabet::Symbol bar; alphabet::Symbol bar;
   
void toPrefixRankedBar ( const RankedNode & node );
public: public:
explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data );
explicit PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ); explicit PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree );
explicit PrefixRankedBarTree ( const RankedTree & tree ); explicit PrefixRankedBarTree ( const RankedTree & tree );
   
void toPrefixRankedBar ( const RankedNode & node );
virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * clone ( ) const;
virtual RankedTreeBase * plunder ( ) &&; virtual RankedTreeBase * plunder ( ) &&;
   
......
...@@ -26,31 +26,30 @@ ...@@ -26,31 +26,30 @@
namespace tree { namespace tree {
   
PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) { PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
this->alphabet = std::move ( alphabet ); addSymbolsToAlphabet ( std::move ( alphabet ) );
setContent ( std::move ( data ) ); setContent ( std::move ( data ) );
} }
   
PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) { PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) {
arityChecksum ( data ); arityChecksum ( data );
   
alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ); addSymbolsToAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
m_Data = std::move ( data ); m_Data = std::move ( data );
} }
   
PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) { PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) {
alphabet = tree.getAlphabet ( ); toPrefixRanked ( tree.getRoot ( ) );
std::deque < const RankedNode * > queue { addSymbolsToAlphabet ( tree.getAlphabet ( ) );
& tree.getRoot ( ) }
};
while ( !queue.empty ( ) ) {
const RankedNode * elem = queue.back ( );
queue.pop_back ( );
   
m_Data.push_back ( elem->getSymbol ( ) ); void PrefixRankedPattern::toPrefixRanked ( const RankedNode & node ) {
if ( node.getSymbol ( ) == subtreeWildcard ) {
m_Data.push_back ( node.getSymbol ( ) );
} else {
m_Data.push_back ( node.getSymbol ( ) );
   
for ( const RankedNode * child : elem->getChildren ( ) ) for ( const RankedNode * child : node.getChildren ( ) )
queue.push_back ( child ); toPrefixRanked ( * child );
} }
} }
   
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "../../alphabet/RankedSymbol.h" #include "../../alphabet/RankedSymbol.h"
#include "../RankedTreeBase.h" #include "../RankedTreeBase.h"
#include "../common/RankedPatternAlphabet.h" #include "../common/RankedPatternAlphabet.h"
#include "RankedNode.h"
   
namespace tree { namespace tree {
   
...@@ -26,6 +27,8 @@ class RankedPattern; ...@@ -26,6 +27,8 @@ class RankedPattern;
class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet { class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet {
std::vector < alphabet::RankedSymbol > m_Data; std::vector < alphabet::RankedSymbol > m_Data;
   
void toPrefixRanked ( const RankedNode & node );
public: public:
explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data );
......
...@@ -26,32 +26,27 @@ ...@@ -26,32 +26,27 @@
namespace tree { namespace tree {
   
PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) { PrefixRankedTree::PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) {
this->alphabet = std::move ( alphabet ); setAlphabet ( std::move ( alphabet ) );
setContent ( std::move ( data ) ); setContent ( std::move ( data ) );
} }
   
PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) { PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ) {
arityChecksum ( data ); arityChecksum ( data );
   
alphabet = std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ); setAlphabet ( std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) );
m_Data = std::move ( data ); m_Data = std::move ( data );
} }
   
PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) { PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) {
alphabet = tree.getAlphabet ( ); toPrefixRanked ( tree.getRoot ( ) );
std::deque < const RankedNode * > queue { setAlphabet ( tree.getAlphabet ( ) );
& tree.getRoot ( ) }
};
while ( !queue.empty ( ) ) {
const RankedNode * elem = queue.back ( );
queue.pop_back ( );
   
m_Data.push_back ( elem->getSymbol ( ) ); void PrefixRankedTree::toPrefixRanked ( const RankedNode & node ) {
m_Data.push_back ( node.getSymbol ( ) );
   
for ( const RankedNode * child : elem->getChildren ( ) ) for ( const RankedNode * child : node.getChildren ( ) )
queue.push_back ( child ); toPrefixRanked ( * child );
}
} }
   
RankedTreeBase * PrefixRankedTree::clone ( ) const { RankedTreeBase * PrefixRankedTree::clone ( ) const {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "../../alphabet/RankedSymbol.h" #include "../../alphabet/RankedSymbol.h"
#include "../RankedTreeBase.h" #include "../RankedTreeBase.h"
#include "../common/RankedAlphabet.h" #include "../common/RankedAlphabet.h"
#include "RankedNode.h"
   
namespace tree { namespace tree {
   
...@@ -26,6 +27,8 @@ class RankedTree; ...@@ -26,6 +27,8 @@ class RankedTree;
class PrefixRankedTree : public RankedTreeBase, public RankedAlphabet { class PrefixRankedTree : public RankedTreeBase, public RankedAlphabet {
std::vector < alphabet::RankedSymbol > m_Data; std::vector < alphabet::RankedSymbol > m_Data;
   
void toPrefixRanked ( const RankedNode & node );
public: public:
explicit PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data );
explicit PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data );
......
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