diff options
Diffstat (limited to 'Source/cmDefinitions.h')
-rw-r--r-- | Source/cmDefinitions.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/Source/cmDefinitions.h b/Source/cmDefinitions.h new file mode 100644 index 0000000..411867c --- /dev/null +++ b/Source/cmDefinitions.h @@ -0,0 +1,94 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmDefinitions_h +#define cmDefinitions_h + +#include "cmStandardIncludes.h" + +#include "cmLinkedTree.h" + +#if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP +#include <unordered_map> +#else +#include "cmsys/hash_map.hxx" +#endif +#endif + +#include <list> + +/** \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 +{ + typedef cmLinkedTree<cmDefinitions>::iterator StackIter; +public: + static const char* 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); + + /** Set (or unset if null) a value associated with a key. */ + void Set(const std::string& key, const char* value); + + std::vector<std::string> UnusedKeys() const; + + static std::vector<std::string> ClosureKeys(StackIter begin, + StackIter end); + + static cmDefinitions MakeClosure(StackIter begin, StackIter end); + +private: + // String with existence boolean. + struct Def: public std::string + { + private: + typedef std::string std_string; + public: + Def(): std_string(), Exists(false), Used(false) {} + Def(const char* v) + : std_string(v ? v : ""), + Exists(v ? true : false), + Used(false) + {} + Def(const std_string& v): std_string(v), Exists(true), Used(false) {} + Def(Def const& d): std_string(d), Exists(d.Exists), Used(d.Used) {} + bool Exists; + bool Used; + }; + static Def NoDef; + +#if defined(CMAKE_BUILD_WITH_CMAKE) +#ifdef CMake_HAVE_CXX11_UNORDERED_MAP + typedef std::unordered_map<std::string, Def> MapType; +#else + typedef cmsys::hash_map<std::string, Def> MapType; +#endif +#else + typedef std::map<std::string, Def> MapType; +#endif + MapType Map; + + static Def const& GetInternal(const std::string& key, + StackIter begin, StackIter end, bool raise); +}; + +#endif |