From 696081cb06f006c53afcd5c6a70fab35403dc745 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Fri, 9 Oct 2015 15:39:06 +0200 Subject: [PATCH] preserve alphabet while casting --- .../tree/ranked/PrefixRankedBarPattern.cpp | 14 ++++++++--- .../src/tree/ranked/PrefixRankedBarPattern.h | 4 +-- .../src/tree/ranked/PrefixRankedBarTree.cpp | 10 +++++--- .../src/tree/ranked/PrefixRankedBarTree.h | 4 +-- .../src/tree/ranked/PrefixRankedPattern.cpp | 25 +++++++++---------- .../src/tree/ranked/PrefixRankedPattern.h | 3 +++ .../src/tree/ranked/PrefixRankedTree.cpp | 23 +++++++---------- alib2data/src/tree/ranked/PrefixRankedTree.h | 3 +++ 8 files changed, 48 insertions(+), 38 deletions(-) diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index 91310085ab..d4e53e0769 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 aa06c60caa..d44afefe1a 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 cd81c36e43..33aa89a5e9 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 a0118e9c54..25e2e6bae3 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 9158c35850..bfbe168ad2 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 c1f14402d0..d3dfddd3e6 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 37bcb2e91c..3dc8a0d46c 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 63dc05218d..e9b7ba3101 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 ); -- GitLab