From e268840c0a5db59f97c0fbc77aaae621520b83a3 Mon Sep 17 00:00:00 2001 From: Sebastian Holtermann Date: Fri, 19 Jul 2019 10:14:59 +0200 Subject: cmDefinitions: Add Unset and cm::string_view based Set methods - The `cmDefinitions::Def` struct is simplified by removing an unused constructor and the `std_string` type definition. The std::string value becomes a member variable instead of being derived from. - The `cmDefinitions::Unset` method is added that unsets a definition. It has the same functionality as calling `cmDefinitions::Set` with a `nullptr` value argument, - The `cmDefinitions::Set` method gets an overloaded version that takes a `cm::string_view` as value argument. - The originl `cmDefinitions::Set` method with `const char*` argument is refactored to either call the `cm::string_view` based `cmDefinitions::Set` overload or `cmDefinitions::Unset`, depending on whether the value `const char*` is a nullptr (`Unset`) or not (`Set`). --- Source/cmDefinitions.cxx | 9 +++++++-- Source/cmDefinitions.h | 38 +++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/Source/cmDefinitions.cxx b/Source/cmDefinitions.cxx index 35cdc5a..42e70d6 100644 --- a/Source/cmDefinitions.cxx +++ b/Source/cmDefinitions.cxx @@ -36,7 +36,7 @@ const std::string* cmDefinitions::Get(const std::string& key, StackIter begin, StackIter end) { Def const& def = cmDefinitions::GetInternal(key, begin, end, false); - return def.Exists ? &def : nullptr; + return def.Exists ? &def.Value : nullptr; } void cmDefinitions::Raise(const std::string& key, StackIter begin, @@ -56,11 +56,16 @@ bool cmDefinitions::HasKey(const std::string& key, StackIter begin, return false; } -void cmDefinitions::Set(const std::string& key, const char* value) +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; diff --git a/Source/cmDefinitions.h b/Source/cmDefinitions.h index 6c252be..b6a08bc 100644 --- a/Source/cmDefinitions.h +++ b/Source/cmDefinitions.h @@ -5,12 +5,14 @@ #include "cmConfigure.h" // IWYU pragma: keep +#include "cm_string_view.hxx" + +#include "cmLinkedTree.h" + #include #include #include -#include "cmLinkedTree.h" - /** \class cmDefinitions * \brief Store a scope of variable definitions for CMake language. * @@ -31,7 +33,20 @@ public: static bool HasKey(const std::string& key, StackIter begin, StackIter end); /** Set (or unset if null) a value associated with a key. */ - void Set(const std::string& key, const char* value); + void Set(const std::string& key, const char* value) + { + if (value) { + this->Set(key, cm::string_view(value)); + } else { + this->Unset(key); + } + } + + /** 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); std::vector UnusedKeys() const; @@ -40,24 +55,17 @@ public: static cmDefinitions MakeClosure(StackIter begin, StackIter end); private: - // String with existence boolean. - struct Def : public std::string + /** String with existence boolean. */ + struct Def { - private: - typedef std::string std_string; - public: Def() = default; - Def(const char* v) - : std_string(v ? v : "") - , Exists(v ? true : false) - { - } - Def(const std_string& v) - : std_string(v) + Def(cm::string_view value) + : Value(value) , Exists(true) { } + std::string Value; bool Exists = false; bool Used = false; }; -- cgit v0.12