Index: tools/gn/visual_studio_writer.cc |
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc |
index e0483465f2f072fbb12b856c96d5b25138529e4e..4f923440872ddbc6077ed70b14f1ec3f30efe844 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(const BuildSettings* build_settings, |
} |
VisualStudioWriter::~VisualStudioWriter() { |
- STLDeleteContainerPointers(projects_.begin(), projects_.end()); |
- STLDeleteContainerPointers(folders_.begin(), folders_.end()); |
} |
// static |
@@ -281,7 +280,8 @@ bool VisualStudioWriter::RunAndWriteFiles(const BuildSettings* build_settings, |
// 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 @@ bool VisualStudioWriter::WriteProjectFiles(const Target* target, Err* err) { |
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 @@ void VisualStudioWriter::WriteSolutionFileContents( |
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 @@ void VisualStudioWriter::WriteSolutionFileContents( |
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 @@ void VisualStudioWriter::WriteSolutionFileContents( |
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 @@ void VisualStudioWriter::ResolveSolutionFolders() { |
// 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 @@ void VisualStudioWriter::ResolveSolutionFolders() { |
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 @@ void VisualStudioWriter::ResolveSolutionFolders() { |
// 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 @@ void VisualStudioWriter::ResolveSolutionFolders() { |
parents.pop_back(); |
} |
} |
- parents.push_back(folder); |
+ parents.push_back(folder.get()); |
} |
} |