From 8701a3f468a4fb684442a8a9c5d4c8d15c72eb7b Mon Sep 17 00:00:00 2001 From: Stephen Kelly Date: Sun, 8 Mar 2015 09:43:11 +0100 Subject: [PATCH] cmRemoveDuplicates: Partially specialize the API for pointer types. If de-duplicating a container of pointers, there is no need to store iterators to them, as that is just more 'pointer chasing'. Store the pointers themselves and use API which compares the pointers in the specialization. --- Source/cmAlgorithms.h | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Source/cmAlgorithms.h b/Source/cmAlgorithms.h index 5504fee71..0cf770140 100644 --- a/Source/cmAlgorithms.h +++ b/Source/cmAlgorithms.h @@ -263,7 +263,7 @@ typename Range::const_iterator cmRemoveMatching(Range &r, MatchRange const& m) namespace ContainerAlgorithms { -template +template struct RemoveDuplicatesAPI { typedef typename Range::const_iterator const_iterator; @@ -275,6 +275,18 @@ struct RemoveDuplicatesAPI static bool valueCompare(It it, const_iterator it2) { return **it != *it2; } }; +template +struct RemoveDuplicatesAPI +{ + typedef typename Range::const_iterator const_iterator; + typedef T* value_type; + + static bool lessThan(value_type a, value_type b) { return a < b; } + static value_type uniqueValue(const_iterator a) { return *a; } + template + static bool valueCompare(It it, const_iterator it2) { return *it != *it2; } +}; + } template