diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index d66cf9eaec02fc1169db02280a919ea57eb04561..1f17bbe9fa68d62c3a1537dc0678c8e891bc40c3 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 4b10df899052bfbd8825f2a57c28b2adbf1533b5..9c8fd9c4d77237b9ad1ec86149f457703f887812 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 c500ddedb03aecf8e89cc7b25739174e79425973..9601d6c9625c495a49ca3ddb18e2e2a5f8aea098 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 83146a983028ebe0f569bca80d2ca9f4a2ef0f97..b389880358d1c6c5a075d9391388ad7f841dd838 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 b132197087b9493515c0fd3e917367b146fbd038..b579ad3ebf30e4d8a73e2bc7448c51662de08268 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 3733ff6c5cd763c37283c6f17d5b7344bb4a559c..9cc23a6c635939103dffece5df93b73f8b043722 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 3efe5e8154fc552c4cda0ffd983d584f811fdc5e..cc010d31836b15ae99ea85c733365730b1e9243c 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 ac97498db2e13776f77eac94c3ea1d675501f5ab..e38ec80a02a39fba40007b7ea8e63c63dc1b28d3 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 1bdc0049d95b9393f6283d2ae4458344ee9e5b69..5b33fe98ecc7502b26dff56f2a7eb550636d6f08 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 8ff896508e65cfbb6c3bc82f11f64e69ec59fe30..6c16330fd098c85cb8797c4ad9b16954831a4591 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 06497e42cbb9cb72bc798430337514aed49fbe81..7febf5f9ade51d8d0116880bc1df762963e0a289 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 08f4869e56b4845268f0348525aa31dbb3fe4246..c027efc02ecb2201559d04d9f6f0af5d6acdc0b8 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> {