cmExportSetMap: improve ownership of cmExportSet

- use `std::piecewise_construct` to fix gcc-4.8 build.
- can use `emplace(name, name)` gcc-6 onwards.
This commit is contained in:
Tushar Maheshwari
2019-09-19 19:20:29 +05:30
parent cca5897318
commit 9b8a1f7c28
5 changed files with 22 additions and 47 deletions
+5 -5
View File
@@ -121,7 +121,7 @@ bool cmExportCommand::InitialPass(std::vector<std::string> const& args,
cmGlobalGenerator* gg = this->Makefile->GetGlobalGenerator();
cmExportSet* ExportSet = nullptr;
cmExportSet* exportSet = nullptr;
if (args[0] == "EXPORT") {
cmExportSetMap& setMap = gg->GetExportSets();
auto const it = setMap.find(arguments.ExportSetName);
@@ -131,7 +131,7 @@ bool cmExportCommand::InitialPass(std::vector<std::string> const& args,
this->SetError(e.str());
return false;
}
ExportSet = it->second;
exportSet = &it->second;
} else if (!arguments.Targets.empty() ||
cmContains(keywordsMissingValue, "TARGETS")) {
for (std::string const& currentTarget : arguments.Targets) {
@@ -180,8 +180,8 @@ bool cmExportCommand::InitialPass(std::vector<std::string> const& args,
ebfg->SetExportFile(fname.c_str());
ebfg->SetNamespace(arguments.Namespace);
ebfg->SetAppendMode(arguments.Append);
if (ExportSet != nullptr) {
ebfg->SetExportSet(ExportSet);
if (exportSet != nullptr) {
ebfg->SetExportSet(exportSet);
} else {
ebfg->SetTargets(targets);
}
@@ -197,7 +197,7 @@ bool cmExportCommand::InitialPass(std::vector<std::string> const& args,
for (std::string const& ct : configurationTypes) {
ebfg->AddConfiguration(ct);
}
if (ExportSet != nullptr) {
if (exportSet != nullptr) {
gg->AddBuildExportExportSet(ebfg);
} else {
gg->AddBuildExportSet(ebfg);
+3 -4
View File
@@ -474,9 +474,8 @@ cmExportInstallFileGenerator::FindNamespaces(cmGlobalGenerator* gg,
const cmExportSetMap& exportSets = gg->GetExportSets();
for (auto const& expIt : exportSets) {
const cmExportSet* exportSet = expIt.second;
std::vector<cmTargetExport*> const* targets =
exportSet->GetTargetExports();
const cmExportSet& exportSet = expIt.second;
std::vector<cmTargetExport*> const* targets = exportSet.GetTargetExports();
bool containsTarget = false;
for (cmTargetExport* target : *targets) {
@@ -488,7 +487,7 @@ cmExportInstallFileGenerator::FindNamespaces(cmGlobalGenerator* gg,
if (containsTarget) {
std::vector<cmInstallExportGenerator const*> const* installs =
exportSet->GetInstallations();
exportSet.GetInstallations();
for (cmInstallExportGenerator const* install : *installs) {
exportFiles.push_back(install->GetDestinationFile());
ns = install->GetNamespace();
+4 -18
View File
@@ -2,30 +2,16 @@
file Copyright.txt or https://cmake.org/licensing for details. */
#include "cmExportSetMap.h"
#include "cmAlgorithms.h"
#include "cmExportSet.h"
#include <tuple>
#include <utility>
cmExportSet* cmExportSetMap::operator[](const std::string& name)
cmExportSet& cmExportSetMap::operator[](const std::string& name)
{
auto it = this->find(name);
if (it == this->end()) // Export set not found
{
it = this->insert(std::make_pair(name, new cmExportSet(name))).first;
auto tup_name = std::make_tuple(name);
it = this->emplace(std::piecewise_construct, tup_name, tup_name).first;
}
return it->second;
}
void cmExportSetMap::clear()
{
cmDeleteAll(*this);
this->derived::clear();
}
cmExportSetMap::cmExportSetMap() = default;
cmExportSetMap::~cmExportSetMap()
{
this->clear();
}
+4 -14
View File
@@ -8,12 +8,12 @@
#include <map>
#include <string>
class cmExportSet;
#include "cmExportSet.h"
/// A name -> cmExportSet map with overloaded operator[].
class cmExportSetMap : public std::map<std::string, cmExportSet*>
class cmExportSetMap : public std::map<std::string, cmExportSet>
{
using derived = std::map<std::string, cmExportSet*>;
using derived = std::map<std::string, cmExportSet>;
public:
/** \brief Overloaded operator[].
@@ -21,17 +21,7 @@ public:
* The operator is overloaded because cmExportSet has no default constructor:
* we do not want unnamed export sets.
*/
cmExportSet* operator[](const std::string& name);
void clear();
cmExportSetMap();
/// Overloaded destructor deletes all member export sets.
~cmExportSetMap();
cmExportSetMap(const cmExportSetMap&) = delete;
cmExportSetMap& operator=(const cmExportSetMap&) = delete;
cmExportSet& operator[](const std::string& name);
};
#endif
+6 -6
View File
@@ -755,7 +755,7 @@ bool cmInstallCommand::HandleTargetsMode(std::vector<std::string> const& args)
te->ObjectsGenerator = objectGenerator;
this->Makefile->GetGlobalGenerator()
->GetExportSets()[exports]
->AddTargetExport(te);
.AddTargetExport(te);
te->InterfaceIncludeDirectories =
cmJoin(includesArgs.GetIncludeDirs(), ";");
@@ -1333,7 +1333,7 @@ bool cmInstallCommand::HandleExportAndroidMKMode(
fname = "Android.mk";
}
cmExportSet* exportSet =
cmExportSet& exportSet =
this->Makefile->GetGlobalGenerator()->GetExportSets()[exp];
cmInstallGenerator::MessageLevel message =
@@ -1341,7 +1341,7 @@ bool cmInstallCommand::HandleExportAndroidMKMode(
// Create the export install generator.
cmInstallExportGenerator* exportGenerator = new cmInstallExportGenerator(
exportSet, ica.GetDestination().c_str(), ica.GetPermissions().c_str(),
&exportSet, ica.GetDestination().c_str(), ica.GetPermissions().c_str(),
ica.GetConfigurations(), ica.GetComponent().c_str(), message,
ica.GetExcludeFromAll(), fname.c_str(), name_space.c_str(), exportOld,
true);
@@ -1430,10 +1430,10 @@ bool cmInstallCommand::HandleExportMode(std::vector<std::string> const& args)
}
}
cmExportSet* exportSet =
cmExportSet& exportSet =
this->Makefile->GetGlobalGenerator()->GetExportSets()[exp];
if (exportOld) {
for (cmTargetExport* te : *exportSet->GetTargetExports()) {
for (cmTargetExport* te : *exportSet.GetTargetExports()) {
cmTarget* tgt =
this->Makefile->GetGlobalGenerator()->FindTarget(te->TargetName);
const bool newCMP0022Behavior =
@@ -1457,7 +1457,7 @@ bool cmInstallCommand::HandleExportMode(std::vector<std::string> const& args)
// Create the export install generator.
cmInstallExportGenerator* exportGenerator = new cmInstallExportGenerator(
exportSet, ica.GetDestination().c_str(), ica.GetPermissions().c_str(),
&exportSet, ica.GetDestination().c_str(), ica.GetPermissions().c_str(),
ica.GetConfigurations(), ica.GetComponent().c_str(), message,
ica.GetExcludeFromAll(), fname.c_str(), name_space.c_str(), exportOld,
false);