diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index 91310085abb774a23fff32ce7d1ca7113aedceef..d4e53e0769b4c46ee7bb0e12b24bc7922d960720 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp @@ -31,23 +31,29 @@ 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 ) ) { - this->alphabet = std::move ( alphabet ); + addSymbolsToAlphabet ( std::move ( alphabet ) ); 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 ) ) { 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 ); } 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 ( ) ); - 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 ) { diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h index aa06c60caa9b52513fcd35fd18380b91e55e4f69..d44afefe1ac4f4b62056bbd6ad2fbb44ef525f1d 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h @@ -31,6 +31,8 @@ class PrefixRankedBarPattern : public RankedTreeBase, public RankedPatternAlphab alphabet::Symbol bar; alphabet::Symbol variablesBar; + void toPrefixRankedBar ( const RankedNode & node ); + 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::vector < alphabet::RankedSymbol > data ); @@ -38,8 +40,6 @@ public: explicit PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ); explicit PrefixRankedBarPattern ( const RankedPattern & tree ); - void toPrefixRankedBar ( const RankedNode & node ); - virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * plunder ( ) &&; diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp index cd81c36e436b83ebb7e112e85e317e62ecef3a10..33aa89a5e9d9fd7c494b7aaeb0b017b030602a95 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp @@ -28,20 +28,24 @@ namespace tree { 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 ) ); } PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : bar ( std::move ( bar ) ) { 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 ); } PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : bar ( std::move ( bar ) ) { 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 ) { diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h index a0118e9c54d31bc820678b458d0a5f84bd2466a7..25e2e6bae3bcdceaa9c9404853af3e900845f837 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h @@ -29,14 +29,14 @@ class PrefixRankedBarTree : public RankedTreeBase, public RankedAlphabet { alphabet::Symbol bar; + void toPrefixRankedBar ( const RankedNode & node ); + public: 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, const RankedTree & tree ); explicit PrefixRankedBarTree ( const RankedTree & tree ); - void toPrefixRankedBar ( const RankedNode & node ); - virtual RankedTreeBase * clone ( ) const; virtual RankedTreeBase * plunder ( ) &&; diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp index 9158c35850310a7f28695b152d2ef64a3909ed62..bfbe168ad2fded7a126afdfb0f967e3c8f55919c 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp @@ -26,31 +26,30 @@ namespace tree { 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 ) ); } PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : RankedPatternAlphabet ( std::move ( subtreeWildcard ) ) { 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 ); } PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : RankedPatternAlphabet ( tree.getSubtreeWildcard ( ) ) { - alphabet = tree.getAlphabet ( ); - std::deque < const RankedNode * > queue { - & tree.getRoot ( ) - }; - - while ( !queue.empty ( ) ) { - const RankedNode * elem = queue.back ( ); - queue.pop_back ( ); + toPrefixRanked ( tree.getRoot ( ) ); + addSymbolsToAlphabet ( tree.getAlphabet ( ) ); +} - 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 ( ) ) - queue.push_back ( child ); + for ( const RankedNode * child : node.getChildren ( ) ) + toPrefixRanked ( * child ); } } diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h index c1f14402d0953ff4b273498a42d0f1756a8aa637..d3dfddd3e6dc1e03815b30283753b9e63c71867f 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h @@ -14,6 +14,7 @@ #include "../../alphabet/RankedSymbol.h" #include "../RankedTreeBase.h" #include "../common/RankedPatternAlphabet.h" +#include "RankedNode.h" namespace tree { @@ -26,6 +27,8 @@ class RankedPattern; class PrefixRankedPattern : public RankedTreeBase, public RankedPatternAlphabet { std::vector < alphabet::RankedSymbol > m_Data; + void toPrefixRanked ( const RankedNode & node ); + public: 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 ); diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.cpp b/alib2data/src/tree/ranked/PrefixRankedTree.cpp index 37bcb2e91c4e5d2a79c650c8cd1e2d5891c8e892..3dc8a0d46c492e9bc7af103464419e8ee92c9121 100644 --- a/alib2data/src/tree/ranked/PrefixRankedTree.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedTree.cpp @@ -26,32 +26,27 @@ namespace tree { 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 ) ); } PrefixRankedTree::PrefixRankedTree ( std::vector < alphabet::RankedSymbol > 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 ); } PrefixRankedTree::PrefixRankedTree ( const RankedTree & tree ) { - alphabet = tree.getAlphabet ( ); - std::deque < const RankedNode * > queue { - & tree.getRoot ( ) - }; - - while ( !queue.empty ( ) ) { - const RankedNode * elem = queue.back ( ); - queue.pop_back ( ); + toPrefixRanked ( tree.getRoot ( ) ); + setAlphabet ( tree.getAlphabet ( ) ); +} - m_Data.push_back ( elem->getSymbol ( ) ); +void PrefixRankedTree::toPrefixRanked ( const RankedNode & node ) { + m_Data.push_back ( node.getSymbol ( ) ); - for ( const RankedNode * child : elem->getChildren ( ) ) - queue.push_back ( child ); - } + for ( const RankedNode * child : node.getChildren ( ) ) + toPrefixRanked ( * child ); } RankedTreeBase * PrefixRankedTree::clone ( ) const { diff --git a/alib2data/src/tree/ranked/PrefixRankedTree.h b/alib2data/src/tree/ranked/PrefixRankedTree.h index 63dc05218deb3fde1ba12820a1b1a79b834b23a0..e9b7ba31010037e0f0b295f5bb080a03a8f836c8 100644 --- a/alib2data/src/tree/ranked/PrefixRankedTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedTree.h @@ -14,6 +14,7 @@ #include "../../alphabet/RankedSymbol.h" #include "../RankedTreeBase.h" #include "../common/RankedAlphabet.h" +#include "RankedNode.h" namespace tree { @@ -26,6 +27,8 @@ class RankedTree; class PrefixRankedTree : public RankedTreeBase, public RankedAlphabet { std::vector < alphabet::RankedSymbol > m_Data; + void toPrefixRanked ( const RankedNode & node ); + public: explicit PrefixRankedTree ( std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); explicit PrefixRankedTree ( std::vector < alphabet::RankedSymbol > data );