CMake/Source/cmInstalledFile.cxx
Stephen Kelly fc1c7cf85d Genex: Store a backtrace, not a pointer to one.
The storage of a pointer means that the ownership and lifetime are
externally determined, which is harder to reason about. It also imposes
API constraints, requiring APIs to return references to backtraces.

This pointer storage was introduced in commit v3.1.0-rc1~425^2~3 (genex:
remove the need for backtraces, 2014-05-23).  As backtraces are now cheap
to copy around, just do that instead.
2015-07-17 22:14:37 +02:00

143 lines
4.0 KiB
C++

/*============================================================================
CMake - Cross Platform Makefile Generator
Copyright 2014 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.
============================================================================*/
#include "cmInstalledFile.h"
#include "cmSystemTools.h"
#include "cmMakefile.h"
#include "cmAlgorithms.h"
//----------------------------------------------------------------------------
cmInstalledFile::cmInstalledFile():
NameExpression(0)
{
}
//----------------------------------------------------------------------------
cmInstalledFile::~cmInstalledFile()
{
if(NameExpression)
{
delete NameExpression;
}
}
cmInstalledFile::Property::Property()
{
}
cmInstalledFile::Property::~Property()
{
cmDeleteAll(this->ValueExpressions);
}
//----------------------------------------------------------------------------
void cmInstalledFile::SetName(cmMakefile* mf, const std::string& name)
{
cmListFileBacktrace backtrace = mf->GetBacktrace();
cmGeneratorExpression ge(backtrace);
this->Name = name;
this->NameExpression = ge.Parse(name).release();
}
//----------------------------------------------------------------------------
std::string const& cmInstalledFile::GetName() const
{
return this->Name;
}
//----------------------------------------------------------------------------
cmCompiledGeneratorExpression const& cmInstalledFile::GetNameExpression() const
{
return *(this->NameExpression);
}
//----------------------------------------------------------------------------
void cmInstalledFile::RemoveProperty(const std::string& prop)
{
this->Properties.erase(prop);
}
//----------------------------------------------------------------------------
void cmInstalledFile::SetProperty(cmMakefile const* mf,
const std::string& prop, const char* value)
{
this->RemoveProperty(prop);
this->AppendProperty(mf, prop, value);
}
//----------------------------------------------------------------------------
void cmInstalledFile::AppendProperty(cmMakefile const* mf,
const std::string& prop, const char* value, bool /*asString*/)
{
cmListFileBacktrace backtrace = mf->GetBacktrace();
cmGeneratorExpression ge(backtrace);
Property& property = this->Properties[prop];
property.ValueExpressions.push_back(ge.Parse(value).release());
}
//----------------------------------------------------------------------------
bool cmInstalledFile::HasProperty(
const std::string& prop) const
{
return this->Properties.find(prop) != this->Properties.end();
}
//----------------------------------------------------------------------------
bool cmInstalledFile::GetProperty(
const std::string& prop, std::string& value) const
{
PropertyMapType::const_iterator i = this->Properties.find(prop);
if(i == this->Properties.end())
{
return false;
}
Property const& property = i->second;
std::string output;
std::string separator;
for(ExpressionVectorType::const_iterator
j = property.ValueExpressions.begin();
j != property.ValueExpressions.end(); ++j)
{
output += separator;
output += (*j)->GetInput();
separator = ";";
}
value = output;
return true;
}
//----------------------------------------------------------------------------
bool cmInstalledFile::GetPropertyAsBool(const std::string& prop) const
{
std::string value;
bool isSet = this->GetProperty(prop, value);
return isSet && cmSystemTools::IsOn(value.c_str());
}
//----------------------------------------------------------------------------
void cmInstalledFile::GetPropertyAsList(const std::string& prop,
std::vector<std::string>& list) const
{
std::string value;
this->GetProperty(prop, value);
list.clear();
cmSystemTools::ExpandListArgument(value, list);
}