summaryrefslogtreecommitdiff
path: root/Source/cmAlgorithms.h
diff options
context:
space:
mode:
authorStephen Kelly <steveire@gmail.com>2015-03-01 21:57:16 +0100
committerStephen Kelly <steveire@gmail.com>2015-03-11 00:17:55 +0100
commiteec7091d76fc3db6535eec3f78fd2585b9c0c38a (patch)
tree63f856198795392bbd0d4eadc47773bcbf94715b /Source/cmAlgorithms.h
parent7cbafa8c65751d2eda7a17753c384da1fc91f695 (diff)
downloadcmake-eec7091d76fc3db6535eec3f78fd2585b9c0c38a.tar.gz
cmRemoveDuplicates: Type-parameterize all uniq-operations
Diffstat (limited to 'Source/cmAlgorithms.h')
-rw-r--r--Source/cmAlgorithms.h33
1 files changed, 22 insertions, 11 deletions
diff --git a/Source/cmAlgorithms.h b/Source/cmAlgorithms.h
index 1b7029bebd..5504fee71f 100644
--- a/Source/cmAlgorithms.h
+++ b/Source/cmAlgorithms.h
@@ -176,12 +176,6 @@ private:
Range const& m_range;
};
-struct IterLess
-{
- template<typename It>
- bool operator()(It const& a, It const& b) const { return *a < *b; }
-};
-
}
template<typename Iter1, typename Iter2>
@@ -267,10 +261,27 @@ typename Range::const_iterator cmRemoveMatching(Range &r, MatchRange const& m)
ContainerAlgorithms::BinarySearcher<MatchRange>(m));
}
+namespace ContainerAlgorithms {
+
+template<typename Range>
+struct RemoveDuplicatesAPI
+{
+ typedef typename Range::const_iterator const_iterator;
+ typedef typename Range::const_iterator value_type;
+
+ static bool lessThan(value_type a, value_type b) { return *a < *b; }
+ static value_type uniqueValue(const_iterator a) { return a; }
+ template<typename It>
+ static bool valueCompare(It it, const_iterator it2) { return **it != *it2; }
+};
+
+}
+
template<typename Range>
typename Range::const_iterator cmRemoveDuplicates(Range& r)
{
- typedef typename Range::const_iterator T;
+ typedef typename ContainerAlgorithms::RemoveDuplicatesAPI<Range> API;
+ typedef typename API::value_type T;
std::vector<T> unique;
unique.reserve(r.size());
std::vector<size_t> indices;
@@ -280,11 +291,11 @@ typename Range::const_iterator cmRemoveDuplicates(Range& r)
it != end; ++it, ++count)
{
const typename std::vector<T>::iterator low =
- std::lower_bound(unique.begin(), unique.end(), it,
- ContainerAlgorithms::IterLess());
- if (low == unique.end() || **low != *it)
+ std::lower_bound(unique.begin(), unique.end(),
+ API::uniqueValue(it), API::lessThan);
+ if (low == unique.end() || API::valueCompare(low, it))
{
- unique.insert(low, it);
+ unique.insert(low, API::uniqueValue(it));
}
else
{