X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Falgorithm.h;h=251a81ef1113b7f63cc849d1e78302bf5c941449;hb=39da82b967c70282973025e4b12186625e29fe26;hp=804db7b9d146905ae77cef973c8feae0233511fb;hpb=fa87d901ba9fa075e51637608902b7fbdd71f896;p=libs%2Fcore.git diff --git a/source/core/algorithm.h b/source/core/algorithm.h index 804db7b..251a81e 100644 --- a/source/core/algorithm.h +++ b/source/core/algorithm.h @@ -2,6 +2,7 @@ #define MSP_CORE_ALGORITHM_H_ #include +#include namespace Msp { @@ -101,6 +102,80 @@ inline void stable_sort(Container &cont, Predicate pred) std::stable_sort(cont.begin(), cont.end(), pred); } +template +struct MemberMatch +{ + const T &value; + T C::*mem_ptr; + + bool operator()(const C &obj) { return obj.*mem_ptr==value; } +}; + +template +inline typename Container::iterator find_member(Container &cont, const T &value, T Container::value_type::*mp) +{ + return find_if(cont, MemberMatch{ value, mp }); +} + +template +inline typename Container::const_iterator find_member(const Container &cont, const T &value, T Container::value_type::*mp) +{ + return find_if(cont, MemberMatch{ value, mp }); +} + +template> +struct MemberCompare +{ + T C::*mem_ptr; + P pred; + + 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 +inline typename Container::iterator lower_bound_member(Container &cont, const T &value, T Container::value_type::*mp) +{ + return lower_bound(cont, value, MemberCompare{ mp }); +} + +template +inline typename Container::const_iterator lower_bound_member(const Container &cont, const T &value, T Container::value_type::*mp) +{ + return lower_bound(cont, value, MemberCompare{ mp }); +} + +template +inline typename Container::iterator upper_bound_member(Container &cont, const T &value, T Container::value_type::*mp) +{ + return upper_bound(cont, value, MemberCompare{ mp }); +} + +template +inline typename Container::const_iterator upper_bound_member(const Container &cont, const T &value, T Container::value_type::*mp) +{ + return upper_bound(cont, value, MemberCompare{ mp }); +} + +template +inline void sort_member(Container &cont, T Container::value_type::*mp) +{ + sort(cont, MemberCompare{ mp }); +} + +template +inline void stable_sort_member(Container &cont, T Container::value_type::*mp) +{ + stable_sort(cont, MemberCompare{ mp }); +} + +template +inline void transform(Container &cont, Predicate pred) +{ + transform(cont.begin(), cont.end(), cont.begin(), pred); +} + } // namespace Msp #endif