X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Fsupport%2Flyxalgo.h;h=7f4fda7281f9c23cd8cd7449e0a3fc7228c3ec7a;hb=5e7275dabc36e1acb396c45ba27aecf8d8a0171e;hp=79799011060d5443ed897867fda58e5b3d7eeae0;hpb=fa492d6bf09db7f1c278687e0000ad1c4833af3d;p=lyx.git diff --git a/src/support/lyxalgo.h b/src/support/lyxalgo.h index 7979901106..7f4fda7281 100644 --- a/src/support/lyxalgo.h +++ b/src/support/lyxalgo.h @@ -1,12 +1,23 @@ // -*- C++ -*- +/** + * \file lyxalgo.h + * Copyright 1995-2002 the LyX Team + * Read the file COPYING + * + * A variety of useful templates. + * + * \author unknown + */ #ifndef LYX_ALGO_H #define LYX_ALGO_H -// Both these functions should ideally be placed into namespace lyx. -// Also the using std::less should not be used. +#include +#include +#include + +namespace lyx { -//namespace lyx { /// Returns true if the sequence first,last is sorted, false if not. template @@ -20,6 +31,7 @@ bool sorted(For first, For last) return true; } + /// Cmp is the same Cmp as you would pass to std::sort. template bool sorted(For first, For last, Cmp cmp) @@ -32,5 +44,56 @@ bool sorted(For first, For last, Cmp cmp) return true; } -// } // end of namespace lyx + +struct firster { + template + P1 operator()(std::pair const & p) { + return p.first; + } +}; + + +/** + * copy elements in the given range to the output iterator + * if the predicate evaluates as true + */ +template +OutputIter copy_if(InputIter first, InputIter last, + OutputIter result, Func func) +{ + for (; first != last; ++first) { + if (func(*first)) { + *result++ = *first; + } + } + return result; +} + + +/// A slot in replacement for std::count for systems where it is broken. +template +typename std::iterator_traits::difference_type +count (Iterator first, Iterator last, T const & value) +{ +#ifdef HAVE_STD_COUNT + return std::count(first, last, value); +#else + std::iterator_traits::difference_type n = 0; + while (first != last) + if (*first++ == value) ++n; + return n; #endif +} + +/// Remove all duplicate entries in c. +template +void eliminate_duplicates(C & c) +{ + std::sort(c.begin(), c.end()); + typename C::iterator p = std::unique(c.begin(), c.end()); + c.erase(p, c.end()); +} + +} // namespace lyx + +#endif // LYX_ALGO_H