1 #ifndef MSP_CORE_ALGORITHM_H_
2 #define MSP_CORE_ALGORITHM_H_
9 template<typename Container, typename T>
10 inline typename Container::iterator find(Container &cont, const T &value)
12 return std::find(cont.begin(), cont.end(), value);
15 template<typename Container, typename T>
16 inline typename Container::const_iterator find(const Container &cont, const T &value)
18 return std::find(cont.begin(), cont.end(), value);
21 template<typename Container, typename Predicate>
22 inline typename Container::iterator find_if(Container &cont, Predicate pred)
24 return std::find_if(cont.begin(), cont.end(), pred);
27 template<typename Container, typename Predicate>
28 inline typename Container::const_iterator find_if(const Container &cont, Predicate pred)
30 return std::find_if(cont.begin(), cont.end(), pred);
33 template<typename Container, typename T>
34 inline typename Container::iterator lower_bound(Container &cont, const T &value)
36 return std::lower_bound(cont.begin(), cont.end(), value);
39 template<typename Container, typename T>
40 inline typename Container::const_iterator lower_bound(const Container &cont, const T &value)
42 return std::lower_bound(cont.begin(), cont.end(), value);
45 template<typename Container, typename T, typename Predicate>
46 inline typename Container::iterator lower_bound(Container &cont, const T &value, Predicate pred)
48 return std::lower_bound(cont.begin(), cont.end(), value, pred);
51 template<typename Container, typename T, typename Predicate>
52 inline typename Container::const_iterator lower_bound(const Container &cont, const T &value, Predicate pred)
54 return std::lower_bound(cont.begin(), cont.end(), value, pred);
57 template<typename Container, typename T>
58 inline typename Container::iterator upper_bound(Container &cont, const T &value)
60 return std::upper_bound(cont.begin(), cont.end(), value);
63 template<typename Container, typename T>
64 inline typename Container::const_iterator upper_bound(const Container &cont, const T &value)
66 return std::upper_bound(cont.begin(), cont.end(), value);
69 template<typename Container, typename T, typename Predicate>
70 inline typename Container::iterator upper_bound(Container &cont, const T &value, Predicate pred)
72 return std::upper_bound(cont.begin(), cont.end(), value, pred);
75 template<typename Container, typename T, typename Predicate>
76 inline typename Container::const_iterator upper_bound(const Container &cont, const T &value, Predicate pred)
78 return std::upper_bound(cont.begin(), cont.end(), value, pred);
81 template<typename Container>
82 inline void sort(Container &cont)
84 std::sort(cont.begin(), cont.end());
87 template<typename Container, typename Predicate>
88 inline void sort(Container &cont, Predicate pred)
90 std::sort(cont.begin(), cont.end(), pred);
93 template<typename Container>
94 inline void stable_sort(Container &cont)
96 std::stable_sort(cont.begin(), cont.end());
99 template<typename Container, typename Predicate>
100 inline void stable_sort(Container &cont, Predicate pred)
102 std::stable_sort(cont.begin(), cont.end(), pred);
105 template<typename C, typename T>
111 MemberMatch(const T &v, T C::*p): value(v), mem_ptr(p) { }
113 bool operator()(const C &obj) { return obj.*mem_ptr==value; }
116 template<typename Container, typename T>
117 inline typename Container::iterator find_member(Container &cont, const T &value, T Container::value_type::*mp)
119 return find_if(cont, MemberMatch<typename Container::value_type, T>(value, mp));
122 template<typename Container, typename T>
123 inline typename Container::const_iterator find_member(const Container &cont, const T &value, T Container::value_type::*mp)
125 return find_if(cont, MemberMatch<typename Container::value_type, T>(value, mp));
128 template<typename C, typename T, typename P=std::less<T>>
134 MemberCompare(T C::*p): mem_ptr(p) { }
136 bool operator()(const C &obj, const T &v) { return pred(obj.*mem_ptr, v); }
137 bool operator()(const T &v, const C &obj) { return pred(v, obj.*mem_ptr); }
138 bool operator()(const C &obj1, const C &obj2) { return pred(obj1.*mem_ptr, obj2.*mem_ptr); }
141 template<typename Container, typename T>
142 inline typename Container::iterator lower_bound_member(Container &cont, const T &value, T Container::value_type::*mp)
144 return lower_bound(cont, value, MemberCompare<typename Container::value_type, T>(mp));
147 template<typename Container, typename T>
148 inline typename Container::const_iterator lower_bound_member(const Container &cont, const T &value, T Container::value_type::*mp)
150 return lower_bound(cont, value, MemberCompare<typename Container::value_type, T>(mp));
153 template<typename Container, typename T>
154 inline typename Container::iterator upper_bound_member(Container &cont, const T &value, T Container::value_type::*mp)
156 return upper_bound(cont, value, MemberCompare<typename Container::value_type, T>(mp));
159 template<typename Container, typename T>
160 inline typename Container::const_iterator upper_bound_member(const Container &cont, const T &value, T Container::value_type::*mp)
162 return upper_bound(cont, value, MemberCompare<typename Container::value_type, T>(mp));
165 template<typename Container, typename T>
166 inline void sort_member(Container &cont, T Container::value_type::*mp)
168 sort(cont, MemberCompare<typename Container::value_type, T>(mp));
171 template<typename Container, typename T>
172 inline void stable_sort_member(Container &cont, T Container::value_type::*mp)
174 stable_sort(cont, MemberCompare<typename Container::value_type, T>(mp));
177 template<typename Container, typename Predicate>
178 inline void transform(Container &cont, Predicate pred)
180 transform(cont.begin(), cont.end(), cont.begin(), pred);