Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(754)

Unified Diff: base/containers/scoped_ptr_hash_map.h

Issue 1099383002: Change ScopedPtrHashMap's 2nd template parameter (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « base/base.gyp ('k') | base/containers/scoped_ptr_hash_map_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: base/containers/scoped_ptr_hash_map.h
diff --git a/base/containers/scoped_ptr_hash_map.h b/base/containers/scoped_ptr_hash_map.h
index dedf21365bee5eea44d1a4522d777e05736df558..749e0c99270bfc8942e27df867f51746467e26dd 100644
--- a/base/containers/scoped_ptr_hash_map.h
+++ b/base/containers/scoped_ptr_hash_map.h
@@ -16,10 +16,12 @@
namespace base {
-// This type acts like a hash_map<K, scoped_ptr<V> >, based on top of
+// This type acts like a hash_map<K, scoped_ptr<V, D> >, based on top of
danakj 2015/04/23 20:36:22 I don't see this Deleter thing for hash_map, nor f
danakj 2015/04/23 20:37:10 Oh, never mind, I see this is an argument to scope
kcwu 2015/04/24 06:30:28 Acknowledged.
// base::hash_map. The ScopedPtrHashMap has ownership of all values in the data
// structure.
-template <typename Key, typename Value>
+template <typename Key,
+ typename Value,
danakj 2015/04/23 20:54:51 Maybe we can take this opportunity to make this mo
kcwu 2015/04/24 06:30:28 Done. Is my current change what you expected?
+ typename Deleter = base::DefaultDeleter<Value>>
class ScopedPtrHashMap {
typedef base::hash_map<Key, Value*> Container;
@@ -34,15 +36,15 @@ class ScopedPtrHashMap {
~ScopedPtrHashMap() { clear(); }
- void swap(ScopedPtrHashMap<Key, Value>& other) {
+ void swap(ScopedPtrHashMap<Key, Value, Deleter>& other) {
data_.swap(other.data_);
}
// Replaces value but not key if key is already present.
- iterator set(const Key& key, scoped_ptr<Value> data) {
+ iterator set(const Key& key, scoped_ptr<Value, Deleter> data) {
iterator it = find(key);
if (it != end()) {
- delete it->second;
+ Deleter()(it->second);
it->second = data.release();
return it;
}
@@ -51,7 +53,8 @@ class ScopedPtrHashMap {
}
// Does nothing if key is already present
- std::pair<iterator, bool> add(const Key& key, scoped_ptr<Value> data) {
+ std::pair<iterator, bool> add(const Key& key,
+ scoped_ptr<Value, Deleter> data) {
std::pair<iterator, bool> result =
data_.insert(std::make_pair(key, data.get()));
if (result.second)
@@ -60,7 +63,7 @@ class ScopedPtrHashMap {
}
void erase(iterator it) {
- delete it->second;
+ Deleter()(it->second);
data_.erase(it);
}
@@ -72,38 +75,38 @@ class ScopedPtrHashMap {
return 1;
}
- scoped_ptr<Value> take(iterator it) {
+ scoped_ptr<Value, Deleter> take(iterator it) {
DCHECK(it != data_.end());
if (it == data_.end())
- return scoped_ptr<Value>();
+ return scoped_ptr<Value, Deleter>();
- scoped_ptr<Value> ret(it->second);
+ scoped_ptr<Value, Deleter> ret(it->second);
it->second = NULL;
return ret.Pass();
}
- scoped_ptr<Value> take(const Key& k) {
+ scoped_ptr<Value, Deleter> take(const Key& k) {
iterator it = find(k);
if (it == data_.end())
- return scoped_ptr<Value>();
+ return scoped_ptr<Value, Deleter>();
return take(it);
}
- scoped_ptr<Value> take_and_erase(iterator it) {
+ scoped_ptr<Value, Deleter> take_and_erase(iterator it) {
DCHECK(it != data_.end());
if (it == data_.end())
- return scoped_ptr<Value>();
+ return scoped_ptr<Value, Deleter>();
- scoped_ptr<Value> ret(it->second);
+ scoped_ptr<Value, Deleter> ret(it->second);
data_.erase(it);
return ret.Pass();
}
- scoped_ptr<Value> take_and_erase(const Key& k) {
+ scoped_ptr<Value, Deleter> take_and_erase(const Key& k) {
iterator it = find(k);
if (it == data_.end())
- return scoped_ptr<Value>();
+ return scoped_ptr<Value, Deleter>();
return take_and_erase(it);
}
@@ -119,7 +122,18 @@ class ScopedPtrHashMap {
inline bool contains(const Key& k) const { return data_.count(k) > 0; }
- inline void clear() { STLDeleteValues(&data_); }
+ inline void clear() {
+ auto it = data_.begin();
+ while (it != data_.end()) {
+ // NOTE: Like STLDeleteContainerPointers, deleting behind the iterator.
+ // Deleting the value does not always invalidate the iterator, but it may
+ // do so if the key is a pointer into the value object.
+ auto temp = it;
+ ++it;
+ Deleter()(temp->second);
+ }
+ data_.clear();
+ }
inline const_iterator find(const Key& k) const { return data_.find(k); }
inline iterator find(const Key& k) { return data_.find(k); }
« no previous file with comments | « base/base.gyp ('k') | base/containers/scoped_ptr_hash_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698