X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fcore%2Falgorithm.h;h=b79114e9d7a8de906b7be40e4c684e1a9758280a;hp=5d75763d2617697fcf3b009e587ce84a4b327a42;hb=6bb431a4fdd6b6437c25890a89627d206a9e52ac;hpb=8ac74c1f54ccedb86b4cd1544e2251682c0e95c8 diff --git a/source/core/algorithm.h b/source/core/algorithm.h index 5d75763..b79114e 100644 --- a/source/core/algorithm.h +++ b/source/core/algorithm.h @@ -6,29 +6,171 @@ namespace Msp { template -typename Container::iterator find(Container &cont, const T &value) +inline typename Container::iterator find(Container &cont, const T &value) { return std::find(cont.begin(), cont.end(), value); } template -typename Container::const_iterator find(const Container &cont, const T &value) +inline typename Container::const_iterator find(const Container &cont, const T &value) { return std::find(cont.begin(), cont.end(), value); } template -typename Container::iterator find_if(Container &cont, Predicate pred) +inline typename Container::iterator find_if(Container &cont, Predicate pred) { return std::find_if(cont.begin(), cont.end(), pred); } template -typename Container::const_iterator find_if(const Container &cont, Predicate pred) +inline typename Container::const_iterator find_if(const Container &cont, Predicate pred) { return std::find_if(cont.begin(), cont.end(), pred); } +template +inline typename Container::iterator lower_bound(Container &cont, const T &value) +{ + return std::lower_bound(cont.begin(), cont.end(), value); +} + +template +inline typename Container::const_iterator lower_bound(const Container &cont, const T &value) +{ + return std::lower_bound(cont.begin(), cont.end(), value); +} + +template +inline typename Container::iterator lower_bound(Container &cont, const T &value, Predicate pred) +{ + return std::lower_bound(cont.begin(), cont.end(), value, pred); +} + +template +inline typename Container::const_iterator lower_bound(const Container &cont, const T &value, Predicate pred) +{ + return std::lower_bound(cont.begin(), cont.end(), value, pred); +} + +template +inline typename Container::iterator upper_bound(Container &cont, const T &value) +{ + return std::upper_bound(cont.begin(), cont.end(), value); +} + +template +inline typename Container::const_iterator upper_bound(const Container &cont, const T &value) +{ + return std::upper_bound(cont.begin(), cont.end(), value); +} + +template +inline typename Container::iterator upper_bound(Container &cont, const T &value, Predicate pred) +{ + return std::upper_bound(cont.begin(), cont.end(), value, pred); +} + +template +inline typename Container::const_iterator upper_bound(const Container &cont, const T &value, Predicate pred) +{ + return std::upper_bound(cont.begin(), cont.end(), value, pred); +} + +template +inline void sort(Container &cont) +{ + std::sort(cont.begin(), cont.end()); +} + +template +inline void sort(Container &cont, Predicate pred) +{ + std::sort(cont.begin(), cont.end(), pred); +} + +template +inline void stable_sort(Container &cont) +{ + std::stable_sort(cont.begin(), cont.end()); +} + +template +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; + + MemberMatch(const T &v, T C::*p): value(v), mem_ptr(p) { } + + 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; + + MemberCompare(T C::*p): mem_ptr(p) { } + + bool operator()(const C &obj, const T &v) { return obj.*mem_ptr +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)); +} + } // namespace Msp #endif