GN: Use std::unique_ptr for owned pointers in VisualStudioWriter.
BUG=602726
Review URL: https://codereview.chromium.org/1883593004
Cr-Original-Commit-Position: refs/heads/master@{#388031}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 31500019dff1f12beb9731da14db3820cba2b991
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index e048346..4f92344 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -5,6 +5,7 @@
#include "tools/gn/visual_studio_writer.h"
#include <algorithm>
+#include <iterator>
#include <map>
#include <memory>
#include <set>
@@ -211,8 +212,6 @@
}
VisualStudioWriter::~VisualStudioWriter() {
- STLDeleteContainerPointers(projects_.begin(), projects_.end());
- STLDeleteContainerPointers(folders_.begin(), folders_.end());
}
// static
@@ -281,7 +280,8 @@
// Sort projects so they appear always in the same order in solution file.
// Otherwise solution file is rewritten and reloaded by Visual Studio.
std::sort(writer.projects_.begin(), writer.projects_.end(),
- [](const SolutionEntry* a, const SolutionEntry* b) {
+ [](const std::unique_ptr<SolutionProject>& a,
+ const std::unique_ptr<SolutionProject>& b) {
return a->path < b->path;
});
@@ -310,7 +310,7 @@
base::FilePath vcxproj_path = build_settings_->GetFullPath(target_file);
std::string vcxproj_path_str = FilePathToUTF8(vcxproj_path);
- projects_.push_back(new SolutionProject(
+ projects_.emplace_back(new SolutionProject(
project_name, vcxproj_path_str,
MakeGuid(vcxproj_path_str, kGuidSeedProject),
FilePathToUTF8(build_settings_->GetFullPath(target->label().dir())),
@@ -648,14 +648,14 @@
out << "# " << version_string_ << std::endl;
SourceDir solution_dir(FilePathToUTF8(solution_dir_path));
- for (const SolutionEntry* folder : folders_) {
+ for (const std::unique_ptr<SolutionEntry>& folder : folders_) {
out << "Project(\"" << kGuidTypeFolder << "\") = \"(" << folder->name
<< ")\", \"" << RebasePath(folder->path, solution_dir) << "\", \""
<< folder->guid << "\"" << std::endl;
out << "EndProject" << std::endl;
}
- for (const SolutionEntry* project : projects_) {
+ for (const std::unique_ptr<SolutionProject>& project : projects_) {
out << "Project(\"" << kGuidTypeProject << "\") = \"" << project->name
<< "\", \"" << RebasePath(project->path, solution_dir) << "\", \""
<< project->guid << "\"" << std::endl;
@@ -673,7 +673,7 @@
out << "\tGlobalSection(ProjectConfigurationPlatforms) = postSolution"
<< std::endl;
- for (const SolutionProject* project : projects_) {
+ for (const std::unique_ptr<SolutionProject>& project : projects_) {
const std::string project_config_mode =
config_mode_prefix + project->config_platform;
out << "\t\t" << project->guid << '.' << config_mode
@@ -688,13 +688,13 @@
out << "\tEndGlobalSection" << std::endl;
out << "\tGlobalSection(NestedProjects) = preSolution" << std::endl;
- for (const SolutionEntry* folder : folders_) {
+ for (const std::unique_ptr<SolutionEntry>& folder : folders_) {
if (folder->parent_folder) {
out << "\t\t" << folder->guid << " = " << folder->parent_folder->guid
<< std::endl;
}
}
- for (const SolutionEntry* project : projects_) {
+ for (const std::unique_ptr<SolutionProject>& project : projects_) {
out << "\t\t" << project->guid << " = " << project->parent_folder->guid
<< std::endl;
}
@@ -708,7 +708,7 @@
// Get all project directories. Create solution folder for each directory.
std::map<base::StringPiece, SolutionEntry*> processed_paths;
- for (SolutionProject* project : projects_) {
+ for (const std::unique_ptr<SolutionProject>& project : projects_) {
base::StringPiece folder_path = project->label_dir_path;
if (IsSlash(folder_path[folder_path.size() - 1]))
folder_path = folder_path.substr(0, folder_path.size() - 1);
@@ -717,12 +717,12 @@
project->parent_folder = it->second;
} else {
std::string folder_path_str = folder_path.as_string();
- SolutionEntry* folder = new SolutionEntry(
+ std::unique_ptr<SolutionEntry> folder(new SolutionEntry(
FindLastDirComponent(SourceDir(folder_path)).as_string(),
- folder_path_str, MakeGuid(folder_path_str, kGuidSeedFolder));
- folders_.push_back(folder);
- project->parent_folder = folder;
- processed_paths[folder_path] = folder;
+ folder_path_str, MakeGuid(folder_path_str, kGuidSeedFolder)));
+ project->parent_folder = folder.get();
+ processed_paths[folder_path] = folder.get();
+ folders_.push_back(std::move(folder));
if (root_folder_path_.empty()) {
root_folder_path_ = folder_path_str;
@@ -751,38 +751,42 @@
// Create also all parent folders up to |root_folder_path_|.
SolutionFolders additional_folders;
- for (SolutionEntry* folder : folders_) {
- if (folder->path == root_folder_path_)
+ for (const std::unique_ptr<SolutionEntry>& solution_folder : folders_) {
+ if (solution_folder->path == root_folder_path_)
continue;
+ SolutionEntry* folder = solution_folder.get();
base::StringPiece parent_path;
while ((parent_path = FindParentDir(&folder->path)) != root_folder_path_) {
auto it = processed_paths.find(parent_path);
if (it != processed_paths.end()) {
folder = it->second;
} else {
- folder = new SolutionEntry(
+ std::unique_ptr<SolutionEntry> new_folder(new SolutionEntry(
FindLastDirComponent(SourceDir(parent_path)).as_string(),
parent_path.as_string(),
- MakeGuid(parent_path.as_string(), kGuidSeedFolder));
- additional_folders.push_back(folder);
- processed_paths[parent_path] = folder;
+ MakeGuid(parent_path.as_string(), kGuidSeedFolder)));
+ processed_paths[parent_path] = new_folder.get();
+ folder = new_folder.get();
+ additional_folders.push_back(std::move(new_folder));
}
}
}
- folders_.insert(folders_.end(), additional_folders.begin(),
- additional_folders.end());
+ folders_.insert(folders_.end(),
+ std::make_move_iterator(additional_folders.begin()),
+ std::make_move_iterator(additional_folders.end()));
// Sort folders by path.
std::sort(folders_.begin(), folders_.end(),
- [](const SolutionEntry* a, const SolutionEntry* b) {
+ [](const std::unique_ptr<SolutionEntry>& a,
+ const std::unique_ptr<SolutionEntry>& b) {
return a->path < b->path;
});
// Match subfolders with their parents. Since |folders_| are sorted by path we
// know that parent folder always precedes its children in vector.
- SolutionFolders parents;
- for (SolutionEntry* folder : folders_) {
+ std::vector<SolutionEntry*> parents;
+ for (const std::unique_ptr<SolutionEntry>& folder : folders_) {
while (!parents.empty()) {
if (base::StartsWith(folder->path, parents.back()->path,
base::CompareCase::SENSITIVE)) {
@@ -792,7 +796,7 @@
parents.pop_back();
}
}
- parents.push_back(folder);
+ parents.push_back(folder.get());
}
}
diff --git a/tools/gn/visual_studio_writer.h b/tools/gn/visual_studio_writer.h
index 5b578ed..2971896 100644
--- a/tools/gn/visual_studio_writer.h
+++ b/tools/gn/visual_studio_writer.h
@@ -6,6 +6,7 @@
#define TOOLS_GN_VISUAL_STUDIO_WRITER_H_
#include <iosfwd>
+#include <memory>
#include <string>
#include <vector>
@@ -77,8 +78,8 @@
std::string config_platform;
};
- using SolutionProjects = std::vector<SolutionProject*>;
- using SolutionFolders = std::vector<SolutionEntry*>;
+ using SolutionProjects = std::vector<std::unique_ptr<SolutionProject>>;
+ using SolutionFolders = std::vector<std::unique_ptr<SolutionEntry>>;
VisualStudioWriter(const BuildSettings* build_settings,
const char* config_platform,
diff --git a/tools/gn/visual_studio_writer_unittest.cc b/tools/gn/visual_studio_writer_unittest.cc
index d70117f..16e327b 100644
--- a/tools/gn/visual_studio_writer_unittest.cc
+++ b/tools/gn/visual_studio_writer_unittest.cc
@@ -31,22 +31,22 @@
std::string path =
MakeTestPath("/foo/chromium/src/out/Debug/obj/base/base.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"base", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/base"), "Win32"));
path = MakeTestPath("/foo/chromium/src/out/Debug/obj/tools/gn/gn.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"gn", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/tools/gn"), "Win32"));
path = MakeTestPath("/foo/chromium/src/out/Debug/obj/chrome/chrome.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"chrome", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/chrome"), "Win32"));
path = MakeTestPath("/foo/chromium/src/out/Debug/obj/base/bar.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"bar", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/base"), "Win32"));
@@ -71,12 +71,12 @@
ASSERT_EQ("gn", writer.folders_[3]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium/src/tools/gn"),
writer.folders_[3]->path);
- ASSERT_EQ(writer.folders_[2], writer.folders_[3]->parent_folder);
+ ASSERT_EQ(writer.folders_[2].get(), writer.folders_[3]->parent_folder);
- ASSERT_EQ(writer.folders_[0], writer.projects_[0]->parent_folder);
- ASSERT_EQ(writer.folders_[3], writer.projects_[1]->parent_folder);
- ASSERT_EQ(writer.folders_[1], writer.projects_[2]->parent_folder);
- ASSERT_EQ(writer.folders_[0], writer.projects_[3]->parent_folder);
+ ASSERT_EQ(writer.folders_[0].get(), writer.projects_[0]->parent_folder);
+ ASSERT_EQ(writer.folders_[3].get(), writer.projects_[1]->parent_folder);
+ ASSERT_EQ(writer.folders_[1].get(), writer.projects_[2]->parent_folder);
+ ASSERT_EQ(writer.folders_[0].get(), writer.projects_[3]->parent_folder);
}
TEST_F(VisualStudioWriterTest, ResolveSolutionFolders_AbsPath) {
@@ -85,24 +85,24 @@
std::string path =
MakeTestPath("/foo/chromium/src/out/Debug/obj/base/base.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"base", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/base"), "Win32"));
path = MakeTestPath("/foo/chromium/src/out/Debug/obj/tools/gn/gn.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"gn", path, MakeGuid(path, "project"),
MakeTestPath("/foo/chromium/src/tools/gn"), "Win32"));
path = MakeTestPath(
"/foo/chromium/src/out/Debug/obj/ABS_PATH/C/foo/bar/bar.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"bar", path, MakeGuid(path, "project"), MakeTestPath("/foo/bar"),
"Win32"));
path = MakeTestPath(
"/foo/chromium/src/out/Debug/obj/ABS_PATH/C/foo/bar/baz/baz.vcxproj");
- writer.projects_.push_back(new VisualStudioWriter::SolutionProject(
+ writer.projects_.emplace_back(new VisualStudioWriter::SolutionProject(
"baz", path, MakeGuid(path, "project"), MakeTestPath("/foo/bar/baz"),
"Win32"));
@@ -118,7 +118,7 @@
ASSERT_EQ("baz", writer.folders_[1]->name);
ASSERT_EQ(MakeTestPath("/foo/bar/baz"), writer.folders_[1]->path);
- ASSERT_EQ(writer.folders_[0], writer.folders_[1]->parent_folder);
+ ASSERT_EQ(writer.folders_[0].get(), writer.folders_[1]->parent_folder);
ASSERT_EQ("chromium", writer.folders_[2]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium"), writer.folders_[2]->path);
@@ -126,23 +126,23 @@
ASSERT_EQ("src", writer.folders_[3]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium/src"), writer.folders_[3]->path);
- ASSERT_EQ(writer.folders_[2], writer.folders_[3]->parent_folder);
+ ASSERT_EQ(writer.folders_[2].get(), writer.folders_[3]->parent_folder);
ASSERT_EQ("base", writer.folders_[4]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium/src/base"), writer.folders_[4]->path);
- ASSERT_EQ(writer.folders_[3], writer.folders_[4]->parent_folder);
+ ASSERT_EQ(writer.folders_[3].get(), writer.folders_[4]->parent_folder);
ASSERT_EQ("tools", writer.folders_[5]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium/src/tools"), writer.folders_[5]->path);
- ASSERT_EQ(writer.folders_[3], writer.folders_[5]->parent_folder);
+ ASSERT_EQ(writer.folders_[3].get(), writer.folders_[5]->parent_folder);
ASSERT_EQ("gn", writer.folders_[6]->name);
ASSERT_EQ(MakeTestPath("/foo/chromium/src/tools/gn"),
writer.folders_[6]->path);
- ASSERT_EQ(writer.folders_[5], writer.folders_[6]->parent_folder);
+ ASSERT_EQ(writer.folders_[5].get(), writer.folders_[6]->parent_folder);
- ASSERT_EQ(writer.folders_[4], writer.projects_[0]->parent_folder);
- ASSERT_EQ(writer.folders_[6], writer.projects_[1]->parent_folder);
- ASSERT_EQ(writer.folders_[0], writer.projects_[2]->parent_folder);
- ASSERT_EQ(writer.folders_[1], writer.projects_[3]->parent_folder);
+ ASSERT_EQ(writer.folders_[4].get(), writer.projects_[0]->parent_folder);
+ ASSERT_EQ(writer.folders_[6].get(), writer.projects_[1]->parent_folder);
+ ASSERT_EQ(writer.folders_[0].get(), writer.projects_[2]->parent_folder);
+ ASSERT_EQ(writer.folders_[1].get(), writer.projects_[3]->parent_folder);
}