diff options
author | Stephen Kelly <steveire@gmail.com> | 2015-02-15 17:58:36 (GMT) |
---|---|---|
committer | Stephen Kelly <steveire@gmail.com> | 2015-02-15 18:56:08 (GMT) |
commit | 050958a3286f69c577fe5d03407800cbe0367898 (patch) | |
tree | f7a03c16b84a6848cbd2b5665c19d4f7b2bf7b65 /Source/cmAlgorithms.h | |
parent | a77af8f1301b6a9964c187ffff7a1893a80fbe90 (diff) | |
download | CMake-050958a3286f69c577fe5d03407800cbe0367898.zip CMake-050958a3286f69c577fe5d03407800cbe0367898.tar.gz CMake-050958a3286f69c577fe5d03407800cbe0367898.tar.bz2 |
cmAlgorithms: Add cmRemoveMatching algorithm.
Implement it in terms of std::remove_if with a binary search through
a matching range.
Diffstat (limited to 'Source/cmAlgorithms.h')
-rw-r--r-- | Source/cmAlgorithms.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Source/cmAlgorithms.h b/Source/cmAlgorithms.h index 70fdff6..0f162a2 100644 --- a/Source/cmAlgorithms.h +++ b/Source/cmAlgorithms.h @@ -154,6 +154,23 @@ Iter RemoveN(Iter i1, Iter i2, size_t n) return ContainerAlgorithms::Rotate(i1, i1 + n, i2); } +template<typename Range> +struct BinarySearcher +{ + typedef typename Range::value_type argument_type; + BinarySearcher(Range const& r) + : m_range(r) + { + } + + bool operator()(argument_type const& item) + { + return std::binary_search(m_range.begin(), m_range.end(), item); + } +private: + Range const& m_range; +}; + } template<typename Iter1, typename Iter2> @@ -226,4 +243,11 @@ typename Range::const_iterator cmRemoveIndices(Range& r, InputRange const& rem) return writer; } +template<typename Range, typename MatchRange> +typename Range::const_iterator cmRemoveMatching(Range &r, MatchRange const& m) +{ + return std::remove_if(r.begin(), r.end(), + ContainerAlgorithms::BinarySearcher<MatchRange>(m)); +} + #endif |