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