ENH: Added cmData and corresponding DataMap in cmMakefile to allow commands to register arbitrary extra data with the makefile without modifying the cmMakefile class definition.
This commit is contained in:
parent
a12448c19b
commit
a5480276d5
|
@ -0,0 +1,67 @@
|
|||
/*=========================================================================
|
||||
|
||||
Program: Insight Segmentation & Registration Toolkit
|
||||
Module: $RCSfile$
|
||||
Language: C++
|
||||
Date: $Date$
|
||||
Version: $Revision$
|
||||
|
||||
Copyright (c) 2001 Insight Consortium
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
* The name of the Insight Consortium, nor the names of any consortium members,
|
||||
nor of any contributors, may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
* Modified source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
=========================================================================*/
|
||||
#ifndef cmData_h
|
||||
#define cmData_h
|
||||
|
||||
#include "cmStandardIncludes.h"
|
||||
|
||||
/** \class cmData
|
||||
* \brief Hold extra data on a cmMakefile instance for a command.
|
||||
*
|
||||
* When CMake commands need to store extra information in a cmMakefile
|
||||
* instance, but the information is not needed by the makefile generators,
|
||||
* it can be held in a subclass of cmData. The cmMakefile class has a map
|
||||
* from std::string to cmData*. On its destruction, it destroys all the
|
||||
* extra data through the virtual destructor of cmData.
|
||||
*/
|
||||
class cmData
|
||||
{
|
||||
public:
|
||||
cmData(const char* name): m_Name(name) {}
|
||||
virtual ~cmData() {}
|
||||
|
||||
const std::string& GetName() const
|
||||
{ return m_Name; }
|
||||
protected:
|
||||
std::string m_Name;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -98,6 +98,14 @@ cmMakefile::~cmMakefile()
|
|||
{
|
||||
delete (*j).second;
|
||||
}
|
||||
for(DataMap::const_iterator d = m_DataMap.begin();
|
||||
d != m_DataMap.end(); ++d)
|
||||
{
|
||||
if(d->second)
|
||||
{
|
||||
delete d->second;
|
||||
}
|
||||
}
|
||||
delete m_MakefileGenerator;
|
||||
}
|
||||
|
||||
|
@ -863,3 +871,52 @@ void cmMakefile::SetHomeOutputDirectory(const char* lib)
|
|||
this->ReadListFile(NULL,fpath.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register the given cmData instance with its own name.
|
||||
*/
|
||||
void cmMakefile::RegisterData(cmData* data)
|
||||
{
|
||||
std::string name = data->GetName();
|
||||
DataMap::const_iterator d = m_DataMap.find(name);
|
||||
if((d != m_DataMap.end()) && (d->second != NULL) && (d->second != data))
|
||||
{
|
||||
delete d->second;
|
||||
}
|
||||
m_DataMap[name] = data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Register the given cmData instance with the given name. This can be used
|
||||
* to register a NULL pointer.
|
||||
*/
|
||||
void cmMakefile::RegisterData(const char* name, cmData* data)
|
||||
{
|
||||
DataMap::const_iterator d = m_DataMap.find(name);
|
||||
if((d != m_DataMap.end()) && (d->second != NULL) && (d->second != data))
|
||||
{
|
||||
delete d->second;
|
||||
}
|
||||
m_DataMap[name] = data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Lookup a cmData instance previously registered with the given name. If
|
||||
* the instance cannot be found, return NULL.
|
||||
*/
|
||||
cmData* cmMakefile::LookupData(const char* name) const
|
||||
{
|
||||
DataMap::const_iterator d = m_DataMap.find(name);
|
||||
if(d != m_DataMap.end())
|
||||
{
|
||||
return d->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -42,6 +42,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||
#define cmMakefile_h
|
||||
|
||||
#include "cmStandardIncludes.h"
|
||||
#include "cmData.h"
|
||||
#include "cmSourceFile.h"
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmSourceGroup.h"
|
||||
|
@ -475,6 +476,10 @@ public:
|
|||
cmSourceGroup& FindSourceGroup(const char* source,
|
||||
std::vector<cmSourceGroup> &groups);
|
||||
|
||||
void RegisterData(cmData*);
|
||||
void RegisterData(const char*, cmData*);
|
||||
cmData* LookupData(const char*) const;
|
||||
|
||||
protected:
|
||||
std::string m_Prefix;
|
||||
std::vector<std::string> m_AuxSourceDirectories; //
|
||||
|
@ -528,6 +533,9 @@ private:
|
|||
void AddDefaultCommands();
|
||||
void AddDefaultDefinitions();
|
||||
std::set<cmFunctionBlocker *> m_FunctionBlockers;
|
||||
|
||||
typedef std::map<std::string, cmData*> DataMap;
|
||||
DataMap m_DataMap;
|
||||
};
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue