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