/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying file Copyright.txt or https://cmake.org/licensing for details. */ #pragma once #include "cmConfigure.h" // IWYU pragma: keep #include <functional> #include <string> #include <unordered_map> #include <vector> #include <cm/string_view> #include "cmLinkedTree.h" #include "cmString.hxx" /** \class cmDefinitions * \brief Store a scope of variable definitions for CMake language. * * This stores the state of variable definitions (set or unset) for * one scope. Sets are always local. Gets search parent scopes * transitively and save results locally. */ class cmDefinitions { using StackIter = cmLinkedTree<cmDefinitions>::iterator; public: // -- Static member functions static const std::string* Get(const std::string& key, StackIter begin, StackIter end); static void Raise(const std::string& key, StackIter begin, StackIter end); static bool HasKey(const std::string& key, StackIter begin, StackIter end); static std::vector<std::string> 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); private: /** String with existence boolean. */ struct Def { public: Def() = default; Def(cm::string_view value) : Value(value) { } cm::String Value; }; static Def NoDef; std::unordered_map<cm::String, Def> Map; static Def const& GetInternal(const std::string& key, StackIter begin, StackIter end, bool raise); };