]> git.lyx.org Git - lyx.git/blob - src/support/lyxalgo.h
ws cleanup
[lyx.git] / src / support / lyxalgo.h
1 // -*- C++ -*-
2
3 #ifndef LYX_ALGO_H
4 #define LYX_ALGO_H
5
6 #include <utility>
7 #include <iterator>
8 #include <algorithm>
9
10 namespace lyx {
11
12
13 /// Returns true if the sequence first,last is sorted, false if not.
14 template <class For>
15 bool sorted(For first, For last)
16 {
17         if (first == last) return true;
18         For tmp = first;
19         while (++tmp != last) {
20                 if (*tmp < *first++) return false;
21         }
22         return true;
23 }
24
25
26 /// Cmp is the same Cmp as you would pass to std::sort.
27 template <class For, class Cmp>
28 bool sorted(For first, For last, Cmp cmp)
29 {
30         if (first == last) return true;
31         For tmp = first;
32         while (++tmp != last) {
33                 if (cmp(*tmp, *first++)) return false;
34         }
35         return true;
36 }
37
38
39 struct firster {
40         template <class P1, class P2>
41         P1 operator()(std::pair<P1, P2> const & p) {
42                 return p.first;
43         }
44 };
45
46
47 template <class InputIter, class OutputIter, class Func>
48 OutputIter copy_if(InputIter first, InputIter last,
49                OutputIter result, Func func)
50 {
51         for (; first != last; ++first) {
52                 if (func(*first)) {
53                         *result++ = *first;
54                 }
55         }
56         return result;
57 }
58
59
60 /// A slot in replacement for std::count for systems where it is broken.
61 template <class Iterator, class T>
62 typename std::iterator_traits<Iterator>::difference_type
63 count (Iterator first, Iterator last, T const & value)
64 {
65 #ifdef HAVE_STD_COUNT
66         return std::count(first, last, value);
67 #else
68         std::iterator_traits<Iterator>::difference_type n = 0;
69         while (first != last)
70                 if (*first++ == value) ++n;
71         return n;
72 #endif
73 }
74
75 } // namespace lyx
76
77 #endif