| 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
|
| // base::hash_map. The ScopedPtrHashMap has ownership of all values in the data
|
| // structure.
|
| -template <typename Key, typename Value>
|
| +template <typename Key,
|
| + typename Value,
|
| + 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); }
|
|
|