Add wrappers for lower_bound and upper_bound
[libs/core.git] / source / core / algorithm.h
1 #ifndef MSP_CORE_ALGORITHM_H_
2 #define MSP_CORE_ALGORITHM_H_
3
4 #include <algorithm>
5
6 namespace Msp {
7
8 template<typename Container, typename T>
9 inline typename Container::iterator find(Container &cont, const T &value)
10 {
11         return std::find(cont.begin(), cont.end(), value);
12 }
13
14 template<typename Container, typename T>
15 inline typename Container::const_iterator find(const Container &cont, const T &value)
16 {
17         return std::find(cont.begin(), cont.end(), value);
18 }
19
20 template<typename Container, typename Predicate>
21 inline typename Container::iterator find_if(Container &cont, Predicate pred)
22 {
23         return std::find_if(cont.begin(), cont.end(), pred);
24 }
25
26 template<typename Container, typename Predicate>
27 inline typename Container::const_iterator find_if(const Container &cont, Predicate pred)
28 {
29         return std::find_if(cont.begin(), cont.end(), pred);
30 }
31
32 template<typename Container, typename T>
33 inline typename Container::iterator lower_bound(Container &cont, const T &value)
34 {
35         return std::lower_bound(cont.begin(), cont.end(), value);
36 }
37
38 template<typename Container, typename T>
39 inline typename Container::const_iterator lower_bound(const Container &cont, const T &value)
40 {
41         return std::lower_bound(cont.begin(), cont.end(), value);
42 }
43
44 template<typename Container, typename T, typename Predicate>
45 inline typename Container::iterator lower_bound(Container &cont, const T &value, Predicate pred)
46 {
47         return std::lower_bound(cont.begin(), cont.end(), value, pred);
48 }
49
50 template<typename Container, typename T, typename Predicate>
51 inline typename Container::const_iterator lower_bound(const Container &cont, const T &value, Predicate pred)
52 {
53         return std::lower_bound(cont.begin(), cont.end(), value, pred);
54 }
55
56 template<typename Container, typename T>
57 inline typename Container::iterator upper_bound(Container &cont, const T &value)
58 {
59         return std::upper_bound(cont.begin(), cont.end(), value);
60 }
61
62 template<typename Container, typename T>
63 inline typename Container::const_iterator upper_bound(const Container &cont, const T &value)
64 {
65         return std::upper_bound(cont.begin(), cont.end(), value);
66 }
67
68 template<typename Container, typename T, typename Predicate>
69 inline typename Container::iterator upper_bound(Container &cont, const T &value, Predicate pred)
70 {
71         return std::upper_bound(cont.begin(), cont.end(), value, pred);
72 }
73
74 template<typename Container, typename T, typename Predicate>
75 inline typename Container::const_iterator upper_bound(const Container &cont, const T &value, Predicate pred)
76 {
77         return std::upper_bound(cont.begin(), cont.end(), value, pred);
78 }
79
80 template<typename Container>
81 inline void sort(Container &cont)
82 {
83         std::sort(cont.begin(), cont.end());
84 }
85
86 template<typename Container, typename Predicate>
87 inline void sort(Container &cont, Predicate pred)
88 {
89         std::sort(cont.begin(), cont.end(), pred);
90 }
91
92 template<typename Container>
93 inline void stable_sort(Container &cont)
94 {
95         std::stable_sort(cont.begin(), cont.end());
96 }
97
98 template<typename Container, typename Predicate>
99 inline void stable_sort(Container &cont, Predicate pred)
100 {
101         std::stable_sort(cont.begin(), cont.end(), pred);
102 }
103
104 } // namespace Msp
105
106 #endif