mirror of
https://github.com/reactos/CMake.git
synced 2024-12-05 02:06:34 +00:00
25e04ddffe
Store the definitions in a cmLinkedTree in the cmMakefile. This can be moved to cmState and then the tree will provide snapshotting possibilities. It will also make the Closure copy created at the start of each cmMakefile unnecesarry.
95 lines
2.7 KiB
C++
95 lines
2.7 KiB
C++
/*============================================================================
|
|
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
|