Commit c1580ecc authored by Brad King's avatar Brad King Committed by Kitware Robot

Merge topic 'cmPropertyMap_unordered_map'

00d265e3 cmPropertyMap: Use std::unordered_map as container instead of std::map
1b945f95 cmPropertyMap: Add RemoveProperty method
e0a8ff31 cmPropertyMap: Use std::string as value container class
8d934d86 cmPropertyMap: Make std::map container private
026f65d2 cmPropertyMap: Add GetList method
9e64e617 cmPropertyMap: Rename GetPropertyList method to GetKeys
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !3435
parents 1af08229 00d265e3
......@@ -364,7 +364,6 @@ set(SRCS
cmProcessOutput.h
cmProcessTools.cxx
cmProcessTools.h
cmProperty.cxx
cmProperty.h
cmPropertyDefinition.cxx
cmPropertyDefinition.h
......
......@@ -620,7 +620,7 @@ bool cmCacheManager::CacheIterator::GetValueAsBool() const
std::vector<std::string> cmCacheManager::CacheEntry::GetPropertyList() const
{
return this->Properties.GetPropertyList();
return this->Properties.GetKeys();
}
const char* cmCacheManager::CacheEntry::GetProperty(
......
......@@ -12,7 +12,6 @@
#include "cmMessageType.h"
#include "cmOutputConverter.h"
#include "cmPolicies.h"
#include "cmProperty.h"
#include "cmPropertyMap.h"
#include "cmStateTypes.h"
#include "cmSystemTools.h"
......@@ -1205,12 +1204,9 @@ bool cmExportFileGenerator::PopulateExportProperties(
std::string& errorMessage)
{
auto& targetProperties = gte->Target->GetProperties();
const auto& exportProperties = targetProperties.find("EXPORT_PROPERTIES");
if (exportProperties != targetProperties.end()) {
std::vector<std::string> propsToExport;
cmSystemTools::ExpandListArgument(exportProperties->second.GetValue(),
propsToExport);
for (auto& prop : propsToExport) {
if (const char* exportProperties =
targetProperties.GetPropertyValue("EXPORT_PROPERTIES")) {
for (auto& prop : cmSystemTools::ExpandedListArgument(exportProperties)) {
/* Black list reserved properties */
if (cmSystemTools::StringStartsWith(prop, "IMPORTED_") ||
cmSystemTools::StringStartsWith(prop, "INTERFACE_")) {
......
......@@ -5032,13 +5032,7 @@ void cmGeneratorTarget::ComputeVersionedName(std::string& vName,
std::vector<std::string> cmGeneratorTarget::GetPropertyKeys() const
{
cmPropertyMap const& propsObject = this->Target->GetProperties();
std::vector<std::string> props;
props.reserve(propsObject.size());
for (auto const& it : propsObject) {
props.push_back(it.first);
}
return props;
return this->Target->GetProperties().GetKeys();
}
void cmGeneratorTarget::ReportPropertyOrigin(
......
......@@ -14,7 +14,6 @@
#include "cmLinkLineComputer.h"
#include "cmLocalGenerator.h"
#include "cmMakefile.h"
#include "cmProperty.h"
#include "cmPropertyMap.h"
#include "cmSourceFile.h"
#include "cmState.h"
......@@ -363,12 +362,12 @@ static Json::Value DumpCTestInfo(cmLocalGenerator* lg, cmTest* testInfo,
// Build up the list of properties that may have been specified
Json::Value properties = Json::arrayValue;
for (auto& prop : testInfo->GetProperties()) {
for (auto& prop : testInfo->GetProperties().GetList()) {
Json::Value entry = Json::objectValue;
entry[kKEY_KEY] = prop.first;
// Remove config variables from the value too.
auto cge_value = ge.Parse(prop.second.GetValue());
auto cge_value = ge.Parse(prop.second);
const std::string& processed_value = cge_value->Evaluate(lg, config);
entry[kVALUE_KEY] = processed_value;
properties.append(entry);
......
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmProperty.h"
void cmProperty::Set(const char* value)
{
this->Value = value;
this->ValueHasBeenSet = true;
}
void cmProperty::Append(const char* value, bool asString)
{
if (!this->Value.empty() && *value && !asString) {
this->Value += ";";
}
this->Value += value;
this->ValueHasBeenSet = true;
}
const char* cmProperty::GetValue() const
{
if (this->ValueHasBeenSet) {
return this->Value.c_str();
}
return nullptr;
}
......@@ -5,8 +5,6 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include <string>
class cmProperty
{
public:
......@@ -22,22 +20,6 @@ public:
CACHED_VARIABLE,
INSTALL
};
// set this property
void Set(const char* value);
// append to this property
void Append(const char* value, bool asString = false);
// get the value
const char* GetValue() const;
// construct with the value not set
cmProperty() { this->ValueHasBeenSet = false; }
protected:
std::string Value;
bool ValueHasBeenSet;
};
#endif
......@@ -3,40 +3,21 @@
#include "cmPropertyMap.h"
#include <algorithm>
#include <assert.h>
#include <utility>
cmProperty* cmPropertyMap::GetOrCreateProperty(const std::string& name)
void cmPropertyMap::Clear()
{
cmPropertyMap::iterator it = this->find(name);
cmProperty* prop;
if (it == this->end()) {
prop = &(*this)[name];
} else {
prop = &(it->second);
}
return prop;
}
std::vector<std::string> cmPropertyMap::GetPropertyList() const
{
std::vector<std::string> keyList;
for (auto const& i : *this) {
keyList.push_back(i.first);
}
std::sort(keyList.begin(), keyList.end());
return keyList;
Map_.clear();
}
void cmPropertyMap::SetProperty(const std::string& name, const char* value)
{
if (!value) {
this->erase(name);
Map_.erase(name);
return;
}
cmProperty* prop = this->GetOrCreateProperty(name);
prop->Set(value);
Map_[name] = value;
}
void cmPropertyMap::AppendProperty(const std::string& name, const char* value,
......@@ -47,17 +28,53 @@ void cmPropertyMap::AppendProperty(const std::string& name, const char* value,
return;
}
cmProperty* prop = this->GetOrCreateProperty(name);
prop->Append(value, asString);
{
std::string& pVal = Map_[name];
if (!pVal.empty() && !asString) {
pVal += ';';
}
pVal += value;
}
}
void cmPropertyMap::RemoveProperty(const std::string& name)
{
Map_.erase(name);
}
const char* cmPropertyMap::GetPropertyValue(const std::string& name) const
{
assert(!name.empty());
{
auto it = Map_.find(name);
if (it != Map_.end()) {
return it->second.c_str();
}
}
return nullptr;
}
cmPropertyMap::const_iterator it = this->find(name);
if (it == this->end()) {
return nullptr;
std::vector<std::string> cmPropertyMap::GetKeys() const
{
std::vector<std::string> keyList;
keyList.reserve(Map_.size());
for (auto const& item : Map_) {
keyList.push_back(item.first);
}
std::sort(keyList.begin(), keyList.end());
return keyList;
}
std::vector<std::pair<std::string, std::string>> cmPropertyMap::GetList() const
{
typedef std::pair<std::string, std::string> StringPair;
std::vector<StringPair> kvList;
kvList.reserve(Map_.size());
for (auto const& item : Map_) {
kvList.emplace_back(item.first, item.second);
}
return it->second.GetValue();
std::sort(kvList.begin(), kvList.end(),
[](StringPair const& a, StringPair const& b) {
return a.first < b.first;
});
return kvList;
}
......@@ -5,25 +5,47 @@
#include "cmConfigure.h" // IWYU pragma: keep
#include "cmProperty.h"
#include <map>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
class cmPropertyMap : public std::map<std::string, cmProperty>
/** \class cmPropertyMap
* \brief String property map.
*/
class cmPropertyMap
{
public:
cmProperty* GetOrCreateProperty(const std::string& name);
// -- General
//! Clear property list
void Clear();
std::vector<std::string> GetPropertyList() const;
// -- Properties
//! Set the property value
void SetProperty(const std::string& name, const char* value);
//! Append to the property value
void AppendProperty(const std::string& name, const char* value,
bool asString = false);
//! Get the property value
const char* GetPropertyValue(const std::string& name) const;
//! Remove the property @a name from the map
void RemoveProperty(const std::string& name);
// -- Lists
//! Get a sorted list of property keys
std::vector<std::string> GetKeys() const;
//! Get a sorted by key list of property key,value pairs
std::vector<std::pair<std::string, std::string>> GetList() const;
private:
std::unordered_map<std::string, std::string> Map_;
};
#endif
......@@ -267,7 +267,7 @@ void cmState::RemoveCacheEntryProperty(std::string const& key,
cmStateSnapshot cmState::Reset()
{
this->GlobalProperties.clear();
this->GlobalProperties.Clear();
this->PropertyDefinitions.clear();
this->GlobVerificationManager->Reset();
......@@ -289,7 +289,7 @@ cmStateSnapshot cmState::Reset()
it->LinkDirectoriesBacktraces.clear();
it->DirectoryEnd = pos;
it->NormalTargetNames.clear();
it->Properties.clear();
it->Properties.Clear();
it->Children.clear();
}
......
......@@ -6,7 +6,6 @@
#include <algorithm>
#include <assert.h>
#include <iterator>
#include <utility>
#include "cmAlgorithms.h"
#include "cmProperty.h"
......@@ -667,12 +666,7 @@ bool cmStateDirectory::GetPropertyAsBool(const std::string& prop) const
std::vector<std::string> cmStateDirectory::GetPropertyKeys() const
{
std::vector<std::string> keys;
keys.reserve(this->DirectoryState->Properties.size());
for (auto const& it : this->DirectoryState->Properties) {
keys.push_back(it.first);
}
return keys;
return this->DirectoryState->Properties.GetKeys();
}
void cmStateDirectory::AddNormalTargetName(std::string const& name)
......
......@@ -10,7 +10,6 @@
#include "cmListFileCache.h"
#include "cmLocalGenerator.h"
#include "cmOutputConverter.h"
#include "cmProperty.h"
#include "cmPropertyMap.h"
#include "cmRange.h"
#include "cmStateTypes.h"
......@@ -117,13 +116,12 @@ void cmTestGenerator::GenerateScriptForConfig(std::ostream& os,
os << ")\n";
// Output properties for the test.
cmPropertyMap& pm = this->Test->GetProperties();
os << indent << "set_tests_properties(" << this->Test->GetName()
<< " PROPERTIES ";
for (auto const& i : pm) {
for (auto const& i : this->Test->GetProperties().GetList()) {
os << " " << i.first << " "
<< cmOutputConverter::EscapeForCMake(
ge.Parse(i.second.GetValue())->Evaluate(this->LG, config));
ge.Parse(i.second)->Evaluate(this->LG, config));
}
this->GenerateInternalProperties(os);
os << ")" << std::endl;
......@@ -173,12 +171,11 @@ void cmTestGenerator::GenerateOldStyle(std::ostream& fout, Indent indent)
fout << ")" << std::endl;
// Output properties for the test.
cmPropertyMap& pm = this->Test->GetProperties();
fout << indent << "set_tests_properties(" << this->Test->GetName()
<< " PROPERTIES ";
for (auto const& i : pm) {
for (auto const& i : this->Test->GetProperties().GetList()) {
fout << " " << i.first << " "
<< cmOutputConverter::EscapeForCMake(i.second.GetValue());
<< cmOutputConverter::EscapeForCMake(i.second);
}
this->GenerateInternalProperties(fout);
fout << ")" << std::endl;
......
......@@ -774,11 +774,11 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferences(Elem& e0)
cmSystemTools::ExpandListArgument(vsDotNetReferences, references);
}
cmPropertyMap const& props = this->GeneratorTarget->Target->GetProperties();
for (auto const& i : props) {
for (auto const& i : props.GetList()) {
if (i.first.find("VS_DOTNET_REFERENCE_") == 0) {
std::string name = i.first.substr(20);
if (!name.empty()) {
std::string path = i.second.GetValue();
std::string path = i.second;
if (!cmsys::SystemTools::FileIsFullPath(path)) {
path = this->Makefile->GetCurrentSourceDirectory() + "/" + path;
}
......@@ -870,10 +870,10 @@ void cmVisualStudio10TargetGenerator::WriteDotNetReferenceCustomTags(
typedef std::map<std::string, std::string> CustomTags;
CustomTags tags;
cmPropertyMap const& props = this->GeneratorTarget->Target->GetProperties();
for (const auto& i : props) {
for (const auto& i : props.GetList()) {
if (i.first.find(refPropFullPrefix) == 0) {
std::string refTag = i.first.substr(refPropFullPrefix.length());
std::string refVal = i.second.GetValue();
std::string refVal = i.second;
if (!refTag.empty() && !refVal.empty()) {
tags[refTag] = refVal;
}
......@@ -967,12 +967,12 @@ void cmVisualStudio10TargetGenerator::WriteEmbeddedResourceGroup(Elem& e0)
}
}
const cmPropertyMap& props = oi->GetProperties();
for (const auto& p : props) {
for (const std::string& p : props.GetKeys()) {
static const std::string propNamePrefix = "VS_CSHARP_";
if (p.first.find(propNamePrefix) == 0) {
std::string tagName = p.first.substr(propNamePrefix.length());
if (p.find(propNamePrefix) == 0) {
std::string tagName = p.substr(propNamePrefix.length());
if (!tagName.empty()) {
std::string value = props.GetPropertyValue(p.first);
std::string value = props.GetPropertyValue(p);
if (!value.empty()) {
e2.Element(tagName.c_str(), value);
}
......@@ -4681,12 +4681,12 @@ void cmVisualStudio10TargetGenerator::GetCSharpSourceProperties(
{
if (this->ProjectType == csproj) {
const cmPropertyMap& props = sf->GetProperties();
for (auto const& p : props) {
for (const std::string& p : props.GetKeys()) {
static const std::string propNamePrefix = "VS_CSHARP_";
if (p.first.find(propNamePrefix) == 0) {
std::string tagName = p.first.substr(propNamePrefix.length());
if (p.find(propNamePrefix) == 0) {
std::string tagName = p.substr(propNamePrefix.length());
if (!tagName.empty()) {
const std::string val = props.GetPropertyValue(p.first);
const std::string val = props.GetPropertyValue(p);
if (!val.empty()) {
tags[tagName] = val;
} else {
......
......@@ -401,7 +401,6 @@ CMAKE_CXX_SOURCES="\
cmPolicies \
cmProcessOutput \
cmProjectCommand \
cmProperty \
cmPropertyDefinition \
cmPropertyDefinitionMap \
cmPropertyMap \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment