/*============================================================================ 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) #include "cmsys/hash_map.hxx" #endif /** \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 { public: /** Construct with the given parent scope. */ cmDefinitions(cmDefinitions* parent = 0); /** Reset object as if newly constructed. */ void Reset(cmDefinitions* parent = 0); /** Returns the parent scope, if any. */ cmDefinitions* GetParent() const { return this->Up; } /** Get the value associated with a key; null if none. Store the result locally if it came from a parent. */ const char* Get(const std::string& key); /** Set (or unset if null) a value associated with a key. */ const char* Set(const std::string& key, const char* value); /** Get the set of all local keys. */ std::set LocalKeys() const; /** Compute the closure of all defined keys with values. This flattens the scope. The result has no parent. */ cmDefinitions Closure() const; /** Compute the set of all defined keys. */ std::set ClosureKeys() const; private: // String with existence boolean. struct Def: public std::string { private: typedef std::string std_string; public: Def(): std_string(), Exists(false) {} Def(const char* v): std_string(v?v:""), Exists(v?true:false) {} Def(const std_string& v): std_string(v), Exists(true) {} Def(Def const& d): std_string(d), Exists(d.Exists) {} bool Exists; }; static Def NoDef; // Parent scope, if any. cmDefinitions* Up; // Local definitions, set or unset. #if defined(CMAKE_BUILD_WITH_CMAKE) typedef cmsys::hash_map MapType; #else typedef std::map MapType; #endif MapType Map; // Internal query and update methods. Def const& GetInternal(const std::string& key); Def const& SetInternal(const std::string& key, Def const& def); // Implementation of Closure() method. struct ClosureTag {}; cmDefinitions(ClosureTag const&, cmDefinitions const* root); void ClosureImpl(std::set& undefined, cmDefinitions const* defs); // Implementation of ClosureKeys() method. void ClosureKeys(std::set& defined, std::set& undefined) const; }; #endif