GN: Use std::unique_ptr for owning pointers in Scope::NamedScopeMap.

BUG=602726

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

Cr-Original-Commit-Position: refs/heads/master@{#388002}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: ac5bf2c0d550e62f6cc58862990e7c4a1017cdf7
diff --git a/tools/gn/scope.cc b/tools/gn/scope.cc
index d3d29d4..93ce966 100644
--- a/tools/gn/scope.cc
+++ b/tools/gn/scope.cc
@@ -5,7 +5,7 @@
 #include "tools/gn/scope.h"
 
 #include "base/logging.h"
-#include "base/stl_util.h"
+#include "base/memory/ptr_util.h"
 #include "tools/gn/parse_tree.h"
 #include "tools/gn/template.h"
 
@@ -64,8 +64,6 @@
 }
 
 Scope::~Scope() {
-  STLDeleteContainerPairSecondPointers(target_defaults_.begin(),
-                                       target_defaults_.end());
 }
 
 const Value* Scope::GetValue(const base::StringPiece& ident,
@@ -315,12 +313,9 @@
       }
     }
 
-    // Be careful to delete any pointer we're about to clobber.
-    Scope** dest_scope = &dest->target_defaults_[current_name];
-    if (*dest_scope)
-      delete *dest_scope;
-    *dest_scope = new Scope(settings_);
-    pair.second->NonRecursiveMergeTo(*dest_scope, options, node_for_err,
+    std::unique_ptr<Scope>& dest_scope = dest->target_defaults_[current_name];
+    dest_scope = base::WrapUnique(new Scope(settings_));
+    pair.second->NonRecursiveMergeTo(dest_scope.get(), options, node_for_err,
                                      "<SHOULDN'T HAPPEN>", err);
   }
 
@@ -412,19 +407,19 @@
   if (GetTargetDefaults(target_type))
     return nullptr;
 
-  Scope** dest = &target_defaults_[target_type];
-  if (*dest) {
+  std::unique_ptr<Scope>& dest = target_defaults_[target_type];
+  if (dest) {
     NOTREACHED();  // Already set.
-    return *dest;
+    return dest.get();
   }
-  *dest = new Scope(settings_);
-  return *dest;
+  dest = base::WrapUnique(new Scope(settings_));
+  return dest.get();
 }
 
 const Scope* Scope::GetTargetDefaults(const std::string& target_type) const {
   NamedScopeMap::const_iterator found = target_defaults_.find(target_type);
   if (found != target_defaults_.end())
-    return found->second;
+    return found->second.get();
   if (containing())
     return containing()->GetTargetDefaults(target_type);
   return nullptr;
diff --git a/tools/gn/scope.h b/tools/gn/scope.h
index 72aa0c3..e9bd139 100644
--- a/tools/gn/scope.h
+++ b/tools/gn/scope.h
@@ -333,10 +333,9 @@
       RecordMap;
   RecordMap values_;
 
-  // Owning pointers. Note that this can't use string pieces since the names
-  // are constructed from Values which might be deallocated before this goes
-  // out of scope.
-  typedef base::hash_map<std::string, Scope*> NamedScopeMap;
+  // Note that this can't use string pieces since the names are constructed from
+  // Values which might be deallocated before this goes out of scope.
+  typedef base::hash_map<std::string, std::unique_ptr<Scope>> NamedScopeMap;
   NamedScopeMap target_defaults_;
 
   // Null indicates not set and that we should fallback to the containing