From 526282799e804bf6a07cf4afb7ca67878642ca06 Mon Sep 17 00:00:00 2001
From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz>
Date: Thu, 28 Apr 2016 22:02:20 +0200
Subject: [PATCH] simplify compare method in trees

---
 .../tree/ranked/PrefixRankedBarPattern.cpp    |  4 ++--
 .../src/tree/ranked/PrefixRankedBarTree.cpp   |  4 ++--
 .../src/tree/ranked/PrefixRankedPattern.cpp   |  4 ++--
 alib2data/src/tree/ranked/RankedNode.h        | 12 +++++++++++
 .../tree/ranked/RankedNonlinearPattern.cpp    | 20 ++++---------------
 alib2data/src/tree/ranked/RankedPattern.cpp   | 15 ++++----------
 alib2data/src/tree/ranked/RankedTree.cpp      | 10 ++++------
 alib2data/src/tree/unranked/UnrankedNode.h    | 12 +++++++++++
 .../unranked/UnrankedNonlinearPattern.cpp     | 20 ++++---------------
 .../src/tree/unranked/UnrankedPattern.cpp     | 15 ++++----------
 alib2data/src/tree/unranked/UnrankedTree.cpp  | 10 ++++------
 alib2std/src/extensions/compare.hpp           |  4 +---
 12 files changed, 55 insertions(+), 75 deletions(-)

diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
index d66cf9eaec..1f17bbe9fa 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp
@@ -130,8 +130,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet() );
-	auto second = std::tie ( other.m_Data, other.getAlphabet() );
+	auto first = std::tie ( m_Data, getAlphabet(), getSubtreeWildcard(), bar, variablesBar );
+	auto second = std::tie ( other.m_Data, other.getAlphabet(), other.getSubtreeWildcard(), bar, variablesBar );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
index 4b10df8990..9c8fd9c4d7 100644
--- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp
@@ -108,8 +108,8 @@ bool PrefixRankedBarTree::isEmpty ( ) const {
 }
 
 int PrefixRankedBarTree::compare ( const PrefixRankedBarTree & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet() );
-	auto second = std::tie ( other.m_Data, other.getAlphabet() );
+	auto first = std::tie ( m_Data, getAlphabet(), bar );
+	auto second = std::tie ( other.m_Data, other.getAlphabet(), bar );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
index c500ddedb0..9601d6c962 100644
--- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
+++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp
@@ -94,8 +94,8 @@ bool PrefixRankedPattern::isEmpty ( ) const {
 }
 
 int PrefixRankedPattern::compare ( const PrefixRankedPattern & other ) const {
-	auto first = std::tie ( m_Data, getAlphabet ( ) );
-	auto second = std::tie ( other.m_Data, other.getAlphabet (  ) );
+	auto first = std::tie ( m_Data, getAlphabet ( ), getSubtreeWildcard ( ) );
+	auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getSubtreeWildcard ( ) );
 
 	std::compare < decltype ( first ) > comp;
 
diff --git a/alib2data/src/tree/ranked/RankedNode.h b/alib2data/src/tree/ranked/RankedNode.h
index 83146a9830..b389880358 100644
--- a/alib2data/src/tree/ranked/RankedNode.h
+++ b/alib2data/src/tree/ranked/RankedNode.h
@@ -133,4 +133,16 @@ struct xmlApi < const tree::RankedNode * > {
 
 } /* namespace alib */
 
+namespace std {
+
+template < >
+struct compare < tree::RankedNode > {
+	int operator ()( const tree::RankedNode & first, const tree::RankedNode & second ) const {
+		return first.compare ( second );
+	}
+
+};
+
+} /* namespace std */
+
 #endif /* RANKED_NODE_H_ */
diff --git a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
index b132197087..b579ad3ebf 100644
--- a/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedNonlinearPattern.cpp
@@ -101,24 +101,12 @@ void RankedNonlinearPattern::operator >>( std::ostream & out ) const {
 }
 
 int RankedNonlinearPattern::compare ( const RankedNonlinearPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard(), getNonlinearVariables() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard(), getNonlinearVariables() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::RankedSymbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getNonlinearVariables(), other.getNonlinearVariables() );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet(), other.getAlphabet() );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedNonlinearPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/ranked/RankedPattern.cpp b/alib2data/src/tree/ranked/RankedPattern.cpp
index 3733ff6c5c..9cc23a6c63 100644
--- a/alib2data/src/tree/ranked/RankedPattern.cpp
+++ b/alib2data/src/tree/ranked/RankedPattern.cpp
@@ -101,19 +101,12 @@ void RankedPattern::operator >>( std::ostream & out ) const {
 }
 
 int RankedPattern::compare ( const RankedPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::RankedSymbol > comp;
-		res = comp ( getSubtreeWildcard(), other.getSubtreeWildcard() );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet(), other.getAlphabet() );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/ranked/RankedTree.cpp b/alib2data/src/tree/ranked/RankedTree.cpp
index 3efe5e8154..cc010d3183 100644
--- a/alib2data/src/tree/ranked/RankedTree.cpp
+++ b/alib2data/src/tree/ranked/RankedTree.cpp
@@ -100,14 +100,12 @@ void RankedTree::operator >>( std::ostream & out ) const {
 }
 
 int RankedTree::compare ( const RankedTree & other ) const {
-	int res = tree->compare ( * other.tree );
+	auto first = std::tie ( * tree, getAlphabet() );
+	auto second = std::tie ( * other.tree, other.getAlphabet() );
 
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::RankedSymbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void RankedTree::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedNode.h b/alib2data/src/tree/unranked/UnrankedNode.h
index ac97498db2..e38ec80a02 100644
--- a/alib2data/src/tree/unranked/UnrankedNode.h
+++ b/alib2data/src/tree/unranked/UnrankedNode.h
@@ -136,4 +136,16 @@ struct xmlApi < const tree::UnrankedNode * > {
 
 } /* namespace alib */
 
+namespace std {
+
+template < >
+struct compare < tree::UnrankedNode > {
+	int operator ()( const tree::UnrankedNode & first, const tree::UnrankedNode & second ) const {
+		return first.compare ( second );
+	}
+
+};
+
+} /* namespace std */
+
 #endif /* UNRANKED_NODE_H_ */
diff --git a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
index 1bdc0049d9..5b33fe98ec 100644
--- a/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedNonlinearPattern.cpp
@@ -101,24 +101,12 @@ void UnrankedNonlinearPattern::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedNonlinearPattern::compare ( const UnrankedNonlinearPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard(), getNonlinearVariables() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard(), getNonlinearVariables() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::Symbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getNonlinearVariables ( ), other.getNonlinearVariables ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedNonlinearPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedPattern.cpp b/alib2data/src/tree/unranked/UnrankedPattern.cpp
index 8ff896508e..6c16330fd0 100644
--- a/alib2data/src/tree/unranked/UnrankedPattern.cpp
+++ b/alib2data/src/tree/unranked/UnrankedPattern.cpp
@@ -103,19 +103,12 @@ void UnrankedPattern::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedPattern::compare ( const UnrankedPattern & other ) const {
-	int res = pattern->compare ( * other.pattern );
+	auto first = std::tie ( * pattern, getAlphabet(), getSubtreeWildcard() );
+	auto second = std::tie ( * other.pattern, other.getAlphabet(), other.getSubtreeWildcard() );
 
-	if ( res == 0 ) {
-		std::compare < alphabet::Symbol > comp;
-		res = comp ( getSubtreeWildcard ( ), other.getSubtreeWildcard ( ) );
-	}
-
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedPattern::nicePrint ( std::ostream & os ) const {
diff --git a/alib2data/src/tree/unranked/UnrankedTree.cpp b/alib2data/src/tree/unranked/UnrankedTree.cpp
index 06497e42cb..7febf5f9ad 100644
--- a/alib2data/src/tree/unranked/UnrankedTree.cpp
+++ b/alib2data/src/tree/unranked/UnrankedTree.cpp
@@ -102,14 +102,12 @@ void UnrankedTree::operator >>( std::ostream & out ) const {
 }
 
 int UnrankedTree::compare ( const UnrankedTree & other ) const {
-	int res = tree->compare ( * other.tree );
+	auto first = std::tie ( * tree, getAlphabet() );
+	auto second = std::tie ( * other.tree, other.getAlphabet() );
 
-	if ( res == 0 ) {
-		std::compare < std::set < alphabet::Symbol > > comp;
-		res = comp ( getAlphabet ( ), other.getAlphabet ( ) );
-	}
+	std::compare < decltype ( first ) > comp;
 
-	return res;
+	return comp ( first, second );
 }
 
 void UnrankedTree::nicePrint ( std::ostream & os ) const {
diff --git a/alib2std/src/extensions/compare.hpp b/alib2std/src/extensions/compare.hpp
index 08f4869e56..c027efc02e 100644
--- a/alib2std/src/extensions/compare.hpp
+++ b/alib2std/src/extensions/compare.hpp
@@ -11,9 +11,7 @@
 namespace std {
 
 template<class T>
-struct compare {
-	int operator()(T first, T second) const;
-};
+struct compare;
 
 template<>
 struct compare<bool> {
-- 
GitLab