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 bool operator()(const C &obj) { return obj.*mem_ptr==value; }
114 template<typename Container, typename T>
115 inline typename Container::iterator find_member(Container &cont, const T &value, T Container::value_type::*mp)
117 return find_if(cont, MemberMatch<typename Container::value_type, T>{ value, mp });
120 template<typename Container, typename T>
121 inline typename Container::const_iterator find_member(const Container &cont, const T &value, T Container::value_type::*mp)
123 return find_if(cont, MemberMatch<typename Container::value_type, T>{ value, mp });
126 template<typename C, typename T, typename P=std::less<T>>
132 bool operator()(const C &obj, const T &v) { return pred(obj.*mem_ptr, v); }
133 bool operator()(const T &v, const C &obj) { return pred(v, obj.*mem_ptr); }
134 bool operator()(const C &obj1, const C &obj2) { return pred(obj1.*mem_ptr, obj2.*mem_ptr); }
137 template<typename Container, typename T>
138 inline typename Container::iterator lower_bound_member(Container &cont, const T &value, T Container::value_type::*mp)
140 return lower_bound(cont, value, MemberCompare<typename Container::value_type, T>{ mp });
143 template<typename Container, typename T>
144 inline typename Container::const_iterator lower_bound_member(const Container &cont, const T &value, T Container::value_type::*mp)
146 return lower_bound(cont, value, MemberCompare<typename Container::value_type, T>{ mp });
149 template<typename Container, typename T>
150 inline typename Container::iterator upper_bound_member(Container &cont, const T &value, T Container::value_type::*mp)
152 return upper_bound(cont, value, MemberCompare<typename Container::value_type, T>{ mp });
155 template<typename Container, typename T>
156 inline typename Container::const_iterator upper_bound_member(const Container &cont, const T &value, T Container::value_type::*mp)
158 return upper_bound(cont, value, MemberCompare<typename Container::value_type, T>{ mp });
161 template<typename Container, typename T>
162 inline void sort_member(Container &cont, T Container::value_type::*mp)
164 sort(cont, MemberCompare<typename Container::value_type, T>{ mp });
167 template<typename Container, typename T>
168 inline void stable_sort_member(Container &cont, T Container::value_type::*mp)
170 stable_sort(cont, MemberCompare<typename Container::value_type, T>{ mp });
173 template<typename Container, typename Predicate>
174 inline void transform(Container &cont, Predicate pred)
176 transform(cont.begin(), cont.end(), cont.begin(), pred);