diff --git a/alib2std/src/extensions/compare.hpp b/alib2std/src/extensions/compare.hpp index 071b7a757824897a14150d4b0ca2d1b387592934..f92be80ef7241f9807e724fce426a5f727709b58 100644 --- a/alib2std/src/extensions/compare.hpp +++ b/alib2std/src/extensions/compare.hpp @@ -8,6 +8,8 @@ #ifndef COMPARE_HPP_ #define COMPARE_HPP_ +#include <utility> + namespace std { template < typename T, typename Enable = void > @@ -34,6 +36,14 @@ struct compare<double> { } }; +template<class T> +struct compare<T*> { + int operator()( T * const & first, T * const & second) const { + compare<typename std::decay < T >::type > comp; + return comp(*first, *second); + } +}; + } /* namespace std */ #endif /* COMPARE_HPP_ */ diff --git a/alib2std/src/extensions/deque.hpp b/alib2std/src/extensions/deque.hpp index 87fe60a448b2b922365a5beaf31291498e8d1e82..c2ac58f5b7f6a76e914243c906a4564d8f1ccc37 100644 --- a/alib2std/src/extensions/deque.hpp +++ b/alib2std/src/extensions/deque.hpp @@ -10,8 +10,8 @@ namespace std { -template < class T > -std::ostream & operator <<( std::ostream & out, const std::deque < T > & list ) { +template < class T, class ... Ts > +std::ostream & operator <<( std::ostream & out, const std::deque < T, Ts ... > & list ) { out << "["; bool first = true; @@ -27,14 +27,14 @@ std::ostream & operator <<( std::ostream & out, const std::deque < T > & list ) return out; } -template < class T > -struct compare < deque < T > > { - int operator ()( const deque < T > & first, const deque < T > & second ) const { +template < class T, class ... Ts > +struct compare < deque < T, Ts ... > > { + int operator ()( const deque < T, Ts ... > & first, const deque < T, Ts ... > & second ) const { if ( first.size ( ) < second.size ( ) ) return -1; if ( first.size ( ) > second.size ( ) ) return 1; - compare < T > comp; + compare < typename std::decay < T >::type > comp; for ( auto iterF = first.begin ( ), iterS = second.begin ( ); iterF != first.end ( ); ++iterF, ++iterS ) { int res = comp ( * iterF, * iterS ); diff --git a/alib2std/src/extensions/list.hpp b/alib2std/src/extensions/list.hpp index 65fe68e730380aceee5e6125f79c59a29bc7370d..6dc9a317f92b194c6c721d8b913ca9c771c00d66 100644 --- a/alib2std/src/extensions/list.hpp +++ b/alib2std/src/extensions/list.hpp @@ -10,8 +10,8 @@ namespace std { -template< class T > -std::ostream& operator<<(std::ostream& out, const std::list<T>& list) { +template< class T, class ... Ts > +std::ostream& operator<<(std::ostream& out, const std::list<T, Ts ... >& list) { out << "["; bool first = true; @@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::list<T>& list) { return out; } -template<class T> -struct compare<list<T>> { - int operator()(const list<T>& first, const list<T>& second) const { +template<class T, class ... Ts > +struct compare<list<T, Ts ... >> { + int operator()(const list<T, Ts ... >& first, const list<T, Ts ... >& second) const { if(first.size() < second.size()) return -1; if(first.size() > second.size()) return 1; - compare<T> comp; + compare<typename std::decay < T >::type > comp; for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) { int res = comp(*iterF, *iterS); if(res != 0) return res; diff --git a/alib2std/src/extensions/map.hpp b/alib2std/src/extensions/map.hpp index 1d8bb3219e4f28c8eddef764775961925b0150f0..b2d0f167399f984956a7bf7193f1683cffd419be 100644 --- a/alib2std/src/extensions/map.hpp +++ b/alib2std/src/extensions/map.hpp @@ -12,8 +12,8 @@ namespace std { -template< class T, class R > -std::ostream& operator<<(std::ostream& out, const std::map<T, R>& map) { +template< class T, class R, class ... Ts > +std::ostream& operator<<(std::ostream& out, const std::map<T, R, Ts ... >& map) { out << "{"; bool first = true; @@ -27,13 +27,13 @@ std::ostream& operator<<(std::ostream& out, const std::map<T, R>& map) { return out; } -template<class T, class R> -struct compare<map<T, R>> { - int operator()(const map<T, R>& first, const map<T, R>& second) const { +template<class T, class R, class ... Ts> +struct compare<map<T, R, Ts ...>> { + int operator()(const map<T, R, Ts ...>& first, const map<T, R, Ts ...>& second) const { if(first.size() < second.size()) return -1; if(first.size() > second.size()) return 1; - compare<std::pair<T, R>> comp; + compare<std::pair<typename std::decay < T >::type, typename std::decay < R >::type >> comp; for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) { int res = comp(*iterF, *iterS); if(res != 0) return res; diff --git a/alib2std/src/extensions/pair.hpp b/alib2std/src/extensions/pair.hpp index a6dae535266b5eda896fe8bfedd50a1e2656820f..dcf11667e5cc20c6e9758610ceaa7b8f598ba4dc 100644 --- a/alib2std/src/extensions/pair.hpp +++ b/alib2std/src/extensions/pair.hpp @@ -19,8 +19,8 @@ std::ostream& operator<<(std::ostream& out, const std::pair<T, R>& pair) { template<class T, class R> struct compare<pair<T, R>> { int operator()(const pair<T, R>& first, const pair<T, R>& second) const { - compare<T> compT; - compare<R> compR; + compare<typename std::decay < T >::type > compT; + compare<typename std::decay < R >::type > compR; int res = compT(first.first, second.first); if(res == 0) res = compR(first.second, second.second); diff --git a/alib2std/src/extensions/set.hpp b/alib2std/src/extensions/set.hpp index 3d1f639e96804979e2ed78fa6a383da08314cb4f..ab34e6d25ea08a36a817125e3ec10952cdb858bb 100644 --- a/alib2std/src/extensions/set.hpp +++ b/alib2std/src/extensions/set.hpp @@ -10,8 +10,8 @@ namespace std { -template< class T > -std::ostream& operator<<(std::ostream& out, const std::set<T>& list) { +template< class T, class ... Ts > +std::ostream& operator<<(std::ostream& out, const std::set<T, Ts ...>& list) { out << "{"; bool first = true; @@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::set<T>& list) { return out; } -template<class T> -struct compare<set<T>> { - int operator()(const set<T>& first, const set<T>& second) const { +template<class T, class ... Ts> +struct compare<set<T, Ts ...>> { + int operator()(const set<T, Ts ...>& first, const set<T, Ts ...>& second) const { if(first.size() < second.size()) return -1; if(first.size() > second.size()) return 1; - compare<T> comp; + compare<typename std::decay < T >::type > comp; for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) { int res = comp(*iterF, *iterS); if(res != 0) return res; diff --git a/alib2std/src/extensions/unordered_map.hpp b/alib2std/src/extensions/unordered_map.hpp index 9c075beb57675225b9547ba9822ffc0a244170c6..97d722dee48342d526f34148920d9d4d8815a914 100644 --- a/alib2std/src/extensions/unordered_map.hpp +++ b/alib2std/src/extensions/unordered_map.hpp @@ -10,8 +10,8 @@ namespace std { -template< class T, class R > -std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R>& map) { +template< class T, class R, class ... Ts > +std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R, Ts ... >& map) { out << "{"; bool first = true; @@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::unordered_map<T, R>& map) return out; } -template<class T, class R> -struct compare<unordered_map<T, R>> { - int operator()(const unordered_map<T, R>& first, const unordered_map<T, R>& second) const { +template<class T, class R, class ... Ts> +struct compare<unordered_map<T, R, Ts ...>> { + int operator()(const unordered_map<T, R, Ts ...>& first, const unordered_map<T, R, Ts ...>& second) const { if(first.size() < second.size()) return -1; if(first.size() > second.size()) return 1; - compare<R> comp; + compare<typename std::decay < R >::type > comp; for(auto iter = first.begin(); iter != first.end(); ++iter) { auto search = second.find(iter->first); if(search == second.end()) return -1; diff --git a/alib2std/src/extensions/variant.hpp b/alib2std/src/extensions/variant.hpp index 7d5dc25a29851a776dfadce2c8e7935870385dc8..052d79b506b398752795b99f7a60295ff664f76f 100644 --- a/alib2std/src/extensions/variant.hpp +++ b/alib2std/src/extensions/variant.hpp @@ -83,7 +83,7 @@ struct variant_helper<F, Ts...> { if (this_t != typeid(F).hash_code() && other_t == typeid(F).hash_code()) return 1; if (this_t == typeid(F).hash_code() && other_t == typeid(F).hash_code()) { - compare<F> comp; + compare<typename std::decay < F >::type > comp; return comp( *(reinterpret_cast<const F*>(this_v)), *(reinterpret_cast<const F*>(other_v))); } else return variant_helper<Ts...>::compareHelper(this_t, this_v, other_t, other_v); diff --git a/alib2std/src/extensions/vector.hpp b/alib2std/src/extensions/vector.hpp index 7efeaba3f70431b6418c407d220e1f0bc3c18fa9..db96b7888624cd9630e188d2a7ece30fa92e9867 100644 --- a/alib2std/src/extensions/vector.hpp +++ b/alib2std/src/extensions/vector.hpp @@ -10,8 +10,8 @@ namespace std { -template< class T , class Allocator > -std::ostream& operator<<(std::ostream& out, const std::vector<T, Allocator>& vector) { +template< class T , class ... Ts > +std::ostream& operator<<(std::ostream& out, const std::vector<T, Ts ...>& vector) { out << "["; bool first = true; @@ -25,13 +25,13 @@ std::ostream& operator<<(std::ostream& out, const std::vector<T, Allocator>& vec return out; } -template<class T, class Allocator> -struct compare<vector<T, Allocator>> { - int operator()(const vector<T, Allocator>& first, const vector<T, Allocator>& second) const { +template<class T, class ... Ts> +struct compare<vector<T, Ts ...>> { + int operator()(const vector<T, Ts...>& first, const vector<T, Ts...>& second) const { if(first.size() < second.size()) return -1; if(first.size() > second.size()) return 1; - compare<T> comp; + compare<typename std::decay < T >::type > comp; for(auto iterF = first.begin(), iterS = second.begin(); iterF != first.end(); ++iterF, ++iterS) { int res = comp(*iterF, *iterS); if(res != 0) return res; diff --git a/alib2std/test-src/extensions/CompareTest.cpp b/alib2std/test-src/extensions/CompareTest.cpp index 014405b436d836606e020c21bc03ad2d28d9c429..7f91019f86d940c6064ebcb7e2588d7149be45d2 100644 --- a/alib2std/test-src/extensions/CompareTest.cpp +++ b/alib2std/test-src/extensions/CompareTest.cpp @@ -2,6 +2,7 @@ #include <set> #include <vector> #include <pair> +#include <map> CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( CompareTest, "bits" ); @@ -31,5 +32,21 @@ void CompareTest::testCompare() { std::compare<std::pair<std::set<std::vector<int>>, std::set<std::vector<int>>>> comp3; CPPUNIT_ASSERT(comp3(pair1, pair2) < 0); + + int two = 2; + int three = 3; + int four = 4; + + std::map<int, const int*> map1 = { {1, &two}, {2, &three} }; + std::map<int, const int*> map2 = { {2, &three}, {3, &four} }; + + std::compare<std::map<int, const int*>> comp4; + CPPUNIT_ASSERT(comp4(map1, map2) < 0); + + auto first = std::tie(vector1, set1, pair1, map1); + auto second = std::tie(vector2, set2, pair2, map2); + + std::compare<decltype ( first ) > comp5; + CPPUNIT_ASSERT(comp5(first, second) < 0); }