mirror of
https://github.com/reactos/CMake.git
synced 2025-01-10 13:41:20 +00:00
b9f9915516
Store usage information in the cmDefintions value instead. We already pay for the memory as padding in the Def struct, so we might as well use it.
92 lines
2.8 KiB
C++
92 lines
2.8 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"
|
|
#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 std::list<cmDefinitions>::reverse_iterator StackIter;
|
|
typedef std::list<cmDefinitions>::const_reverse_iterator StackConstIter;
|
|
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,
|
|
StackConstIter begin, StackConstIter 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(StackConstIter begin,
|
|
StackConstIter end);
|
|
|
|
static cmDefinitions MakeClosure(StackConstIter begin, StackConstIter 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
|