]> git.tdb.fi Git - libs/core.git/commitdiff
Use std::less as predicate in algorithms
authorMikko Rasa <tdb@tdb.fi>
Wed, 26 Oct 2022 08:52:12 +0000 (11:52 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 26 Oct 2022 08:52:12 +0000 (11:52 +0300)
It guarantees a consistent ordering of pointers, unlike the < operator.

source/core/algorithm.h

index 51c2369d623b58790f4ca556018d0162cb96a185..d295d00ab844c02e943f8795904ee8f35367dfd4 100644 (file)
@@ -2,6 +2,7 @@
 #define MSP_CORE_ALGORITHM_H_
 
 #include <algorithm>
+#include <functional>
 
 namespace Msp {
 
@@ -124,16 +125,17 @@ inline typename Container::const_iterator find_member(const Container &cont, con
        return find_if(cont, MemberMatch<typename Container::value_type, T>(value, mp));
 }
 
-template<typename C, typename T>
+template<typename C, typename T, typename P=std::less<T>>
 struct MemberCompare
 {
        T C::*mem_ptr;
+       P pred;
 
        MemberCompare(T C::*p): mem_ptr(p) { }
 
-       bool operator()(const C &obj, const T &v) { return obj.*mem_ptr<v; }
-       bool operator()(const T &v, const C &obj) { return v<obj.*mem_ptr; }
-       bool operator()(const C &obj1, const C &obj2) { return obj1.*mem_ptr<obj2.*mem_ptr; }
+       bool operator()(const C &obj, const T &v) { return pred(obj.*mem_ptr, v); }
+       bool operator()(const T &v, const C &obj) { return pred(v, obj.*mem_ptr); }
+       bool operator()(const C &obj1, const C &obj2) { return pred(obj1.*mem_ptr, obj2.*mem_ptr); }
 };
 
 template<typename Container, typename T>