aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2019-02-19 14:13:36 +0100
committerIvan Donchevskii <ivan.donchevskii@qt.io>2019-02-19 13:36:15 +0000
commitcaf675542613c3d8cd2a749a76a3fa2fa2395aee (patch)
treec90593326bed08ef9d51504b24d68903af348cfc
parentbfee82fa2c3509214332f97cfcc1d8a776fb4f8e (diff)
ClangPchManager: Optimize UsedMacroFilter
We need only run one time over all elements. Change-Id: I98061014380874549b1976fe6d6a32af43fedfea Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
-rw-r--r--src/tools/clangpchmanagerbackend/source/usedmacrofilter.h42
1 files changed, 27 insertions, 15 deletions
diff --git a/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h b/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
index fe08cf71ac..6042895325 100644
--- a/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
+++ b/src/tools/clangpchmanagerbackend/source/usedmacrofilter.h
@@ -53,6 +53,29 @@ inline OutputIterator set_greedy_intersection(InputIterator1 first1,
return result;
}
+template<typename InputIterator1, typename InputIterator2, typename OutputIterator, typename Compare>
+inline OutputIterator fill_with_second_values(InputIterator1 first1,
+ InputIterator1 last1,
+ InputIterator2 first2,
+ InputIterator2 last2,
+ OutputIterator result,
+ Compare comp)
+{
+ while (first1 != last1 && first2 != last2)
+ if (comp(*first1, *first2)) {
+ *result = *first1;
+ ++first1;
+ ++result;
+ } else if (comp(*first2, *first1))
+ ++first2;
+ else {
+ *result = *first2;
+ ++first1;
+ ++result;
+ }
+ return result;
+}
+
class UsedMacroFilter
{
public:
@@ -160,7 +183,7 @@ private:
const Utils::SmallStringVector &usedMacros)
{
CompilerMacros filtertedCompilerMacros;
- filtertedCompilerMacros.reserve(indexedCompilerMacro.size() + usedMacros.size());
+ filtertedCompilerMacros.reserve(usedMacros.size());
struct Compare
{
@@ -175,24 +198,13 @@ private:
}
};
- set_greedy_intersection(indexedCompilerMacro.begin(),
- indexedCompilerMacro.end(),
- usedMacros.begin(),
+ fill_with_second_values(usedMacros.begin(),
usedMacros.end(),
+ indexedCompilerMacro.begin(),
+ indexedCompilerMacro.end(),
std::back_inserter(filtertedCompilerMacros),
Compare{});
- auto split = filtertedCompilerMacros.end();
-
- std::set_difference(usedMacros.begin(),
- usedMacros.end(),
- filtertedCompilerMacros.begin(),
- filtertedCompilerMacros.end(),
- std::back_inserter(filtertedCompilerMacros),
- Compare{});
-
- std::inplace_merge(filtertedCompilerMacros.begin(), split, filtertedCompilerMacros.end());
-
return filtertedCompilerMacros;
}