diff options
author | Marco Bubke <marco.bubke@qt.io> | 2019-02-19 14:13:36 +0100 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2019-02-19 13:36:15 +0000 |
commit | caf675542613c3d8cd2a749a76a3fa2fa2395aee (patch) | |
tree | c90593326bed08ef9d51504b24d68903af348cfc /src/tools/clangpchmanagerbackend | |
parent | bfee82fa2c3509214332f97cfcc1d8a776fb4f8e (diff) | |
download | qt-creator-caf675542613c3d8cd2a749a76a3fa2fa2395aee.tar.gz |
ClangPchManager: Optimize UsedMacroFilter
We need only run one time over all elements.
Change-Id: I98061014380874549b1976fe6d6a32af43fedfea
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/tools/clangpchmanagerbackend')
-rw-r--r-- | src/tools/clangpchmanagerbackend/source/usedmacrofilter.h | 42 |
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; } |