summaryrefslogtreecommitdiffstats
path: root/Source/cmDefinitions.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/cmDefinitions.h')
-rw-r--r--Source/cmDefinitions.h94
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