From caf675542613c3d8cd2a749a76a3fa2fa2395aee Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 19 Feb 2019 14:13:36 +0100 Subject: ClangPchManager: Optimize UsedMacroFilter We need only run one time over all elements. Change-Id: I98061014380874549b1976fe6d6a32af43fedfea Reviewed-by: Ivan Donchevskii --- .../source/usedmacrofilter.h | 42 ++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to 'src/tools/clangpchmanagerbackend') 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 +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; } -- cgit v1.2.1