From 1a47d368d8925c8c7e3a8afc75f9592058cce100 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Thu, 8 Aug 2019 13:50:47 +0200 Subject: cmDefinitions: Cleanups and optimizations In cmDefinitions: - sort methods in source code by static or not static - use `std::unordered_set` instead of `std::set` for duplications tests. --- Source/cmDefinitions.cxx | 61 +++++++++++++++++++++++++----------------------- Source/cmDefinitions.h | 16 ++++++++----- 2 files changed, 42 insertions(+), 35 deletions(-) diff --git a/Source/cmDefinitions.cxx b/Source/cmDefinitions.cxx index 42e70d6..cc38d84 100644 --- a/Source/cmDefinitions.cxx +++ b/Source/cmDefinitions.cxx @@ -2,8 +2,11 @@ file Copyright.txt or https://cmake.org/licensing for details. */ #include "cmDefinitions.h" +#include "cm_string_view.hxx" + #include -#include +#include +#include #include cmDefinitions::Def cmDefinitions::NoDef; @@ -14,7 +17,7 @@ cmDefinitions::Def const& cmDefinitions::GetInternal(const std::string& key, { assert(begin != end); { - MapType::iterator it = begin->Map.find(key); + auto it = begin->Map.find(key); if (it != begin->Map.end()) { it->second.Used = true; return it->second; @@ -56,33 +59,10 @@ bool cmDefinitions::HasKey(const std::string& key, StackIter begin, return false; } -void cmDefinitions::Set(const std::string& key, cm::string_view value) -{ - this->Map[key] = Def(value); -} - -void cmDefinitions::Unset(const std::string& key) -{ - this->Map[key] = Def(); -} - -std::vector cmDefinitions::UnusedKeys() const -{ - std::vector keys; - keys.reserve(this->Map.size()); - // Consider local definitions. - for (auto const& mi : this->Map) { - if (!mi.second.Used) { - keys.push_back(mi.first); - } - } - return keys; -} - cmDefinitions cmDefinitions::MakeClosure(StackIter begin, StackIter end) { cmDefinitions closure; - std::set undefined; + std::unordered_set undefined; for (StackIter it = begin; it != end; ++it) { // Consider local definitions. for (auto const& mi : it->Map) { @@ -92,7 +72,7 @@ cmDefinitions cmDefinitions::MakeClosure(StackIter begin, StackIter end) if (mi.second.Exists) { closure.Map.insert(mi); } else { - undefined.insert(mi.first); + undefined.emplace(mi.first); } } } @@ -104,13 +84,13 @@ std::vector cmDefinitions::ClosureKeys(StackIter begin, StackIter end) { std::vector defined; - std::set bound; + std::unordered_set bound; for (StackIter it = begin; it != end; ++it) { defined.reserve(defined.size() + it->Map.size()); for (auto const& mi : it->Map) { // Use this key if it is not already set or unset. - if (bound.insert(mi.first).second && mi.second.Exists) { + if (bound.emplace(mi.first).second && mi.second.Exists) { defined.push_back(mi.first); } } @@ -118,3 +98,26 @@ std::vector cmDefinitions::ClosureKeys(StackIter begin, return defined; } + +void cmDefinitions::Set(const std::string& key, cm::string_view value) +{ + this->Map[key] = Def(value); +} + +void cmDefinitions::Unset(const std::string& key) +{ + this->Map[key] = Def(); +} + +std::vector cmDefinitions::UnusedKeys() const +{ + std::vector keys; + keys.reserve(this->Map.size()); + // Consider local definitions. + for (auto const& mi : this->Map) { + if (!mi.second.Used) { + keys.push_back(mi.first); + } + } + return keys; +} diff --git a/Source/cmDefinitions.h b/Source/cmDefinitions.h index 4d8810a..787471a 100644 --- a/Source/cmDefinitions.h +++ b/Source/cmDefinitions.h @@ -25,6 +25,8 @@ class cmDefinitions typedef cmLinkedTree::iterator StackIter; public: + // -- Static member functions + static const std::string* Get(const std::string& key, StackIter begin, StackIter end); @@ -32,18 +34,21 @@ public: static bool HasKey(const std::string& key, StackIter begin, StackIter end); + static std::vector ClosureKeys(StackIter begin, StackIter end); + + static cmDefinitions MakeClosure(StackIter begin, StackIter end); + + // -- Member functions + /** Set a value associated with a key. */ void Set(const std::string& key, cm::string_view value); /** Unset a definition. */ void Unset(const std::string& key); + /** List of unused keys. */ std::vector UnusedKeys() const; - static std::vector ClosureKeys(StackIter begin, StackIter end); - - static cmDefinitions MakeClosure(StackIter begin, StackIter end); - private: /** String with existence boolean. */ struct Def @@ -61,8 +66,7 @@ private: }; static Def NoDef; - typedef std::unordered_map MapType; - MapType Map; + std::unordered_map Map; static Def const& GetInternal(const std::string& key, StackIter begin, StackIter end, bool raise); -- cgit v0.12