GN: Use std::unique_ptr for owning pointers in InputFileManager.

BUG=602726

Review URL: https://codereview.chromium.org/1877253003

Cr-Original-Commit-Position: refs/heads/master@{#388022}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 959ec4e4802a64b022d7101eafbc791a0339e971
diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc
index a3e6460..36c0bf3 100644
--- a/tools/gn/input_file_manager.cc
+++ b/tools/gn/input_file_manager.cc
@@ -94,9 +94,6 @@
 
 InputFileManager::~InputFileManager() {
   // Should be single-threaded by now.
-  STLDeleteContainerPairSecondPointers(input_files_.begin(),
-                                       input_files_.end());
-  STLDeleteContainerPointers(dynamic_inputs_.begin(), dynamic_inputs_.end());
 }
 
 bool InputFileManager::AsyncLoadFile(const LocationRange& origin,
@@ -114,18 +111,18 @@
     InputFileMap::const_iterator found = input_files_.find(file_name);
     if (found == input_files_.end()) {
       // New file, schedule load.
-      InputFileData* data = new InputFileData(file_name);
+      std::unique_ptr<InputFileData> data(new InputFileData(file_name));
       data->scheduled_callbacks.push_back(callback);
-      input_files_[file_name] = data;
-
       schedule_this = base::Bind(&InputFileManager::BackgroundLoadFile,
                                  this,
                                  origin,
                                  build_settings,
                                  file_name,
                                  &data->file);
+      input_files_[file_name] = std::move(data);
+
     } else {
-      InputFileData* data = found->second;
+      InputFileData* data = found->second.get();
 
       // Prevent mixing async and sync loads. See SyncLoadFile for discussion.
       if (data->sync_invocation) {
@@ -167,16 +164,17 @@
   InputFileMap::iterator found = input_files_.find(file_name);
   if (found == input_files_.end()) {
     // Haven't seen this file yet, start loading right now.
-    data = new InputFileData(file_name);
+    std::unique_ptr<InputFileData> new_data(new InputFileData(file_name));
+    data = new_data.get();
     data->sync_invocation = true;
-    input_files_[file_name] = data;
+    input_files_[file_name] = std::move(new_data);
 
     base::AutoUnlock unlock(lock_);
     if (!LoadFile(origin, build_settings, file_name, &data->file, err))
       return nullptr;
   } else {
     // This file has either been loaded or is pending loading.
-    data = found->second;
+    data = found->second.get();
 
     if (!data->sync_invocation) {
       // Don't allow mixing of sync and async loads. If an async load is
@@ -231,14 +229,14 @@
     InputFile** file,
     std::vector<Token>** tokens,
     std::unique_ptr<ParseNode>** parse_root) {
-  InputFileData* data = new InputFileData(name);
-  {
-    base::AutoLock lock(lock_);
-    dynamic_inputs_.push_back(data);
-  }
+  std::unique_ptr<InputFileData> data(new InputFileData(name));
   *file = &data->file;
   *tokens = &data->tokens;
   *parse_root = &data->parsed_root;
+  {
+    base::AutoLock lock(lock_);
+    dynamic_inputs_.push_back(std::move(data));
+  }
 }
 
 int InputFileManager::GetInputFileCount() const {
@@ -286,7 +284,7 @@
     base::AutoLock lock(lock_);
     DCHECK(input_files_.find(name) != input_files_.end());
 
-    InputFileData* data = input_files_[name];
+    InputFileData* data = input_files_[name].get();
     data->loaded = true;
     if (success) {
       data->tokens.swap(tokens);
diff --git a/tools/gn/input_file_manager.h b/tools/gn/input_file_manager.h
index ba055e2..dd16604 100644
--- a/tools/gn/input_file_manager.h
+++ b/tools/gn/input_file_manager.h
@@ -137,7 +137,8 @@
   mutable base::Lock lock_;
 
   // Maps repo-relative filenames to the corresponding owned pointer.
-  typedef base::hash_map<SourceFile, InputFileData*> InputFileMap;
+  typedef base::hash_map<SourceFile, std::unique_ptr<InputFileData>>
+      InputFileMap;
   InputFileMap input_files_;
 
   // Tracks all dynamic inputs. The data are holders for memory management
@@ -146,9 +147,7 @@
   // charge of the threadsafety requirements.
   //
   // See AddDynamicInput().
-  //
-  // Owning pointers.
-  std::vector<InputFileData*> dynamic_inputs_;
+  std::vector<std::unique_ptr<InputFileData>> dynamic_inputs_;
 
   DISALLOW_COPY_AND_ASSIGN(InputFileManager);
 };