| Index: base/containers/mru_cache.h
|
| diff --git a/base/containers/mru_cache.h b/base/containers/mru_cache.h
|
| index d9e648728f679aba68b46db65b2c66a40c9db9cd..6c1d6260f55b26168a736b5d09a72e34f0644a16 100644
|
| --- a/base/containers/mru_cache.h
|
| +++ b/base/containers/mru_cache.h
|
| @@ -41,12 +41,9 @@ struct MRUCacheStandardMap {
|
| };
|
|
|
| // Base class for the MRU cache specializations defined below.
|
| -// The deletor will get called on all payloads that are being removed or
|
| -// replaced.
|
| template <class KeyType,
|
| class PayloadType,
|
| class HashOrCompareType,
|
| - class DeletorType,
|
| template <typename, typename, typename> class MapType =
|
| MRUCacheStandardMap>
|
| class MRUCacheBase {
|
| @@ -75,18 +72,9 @@ class MRUCacheBase {
|
| // a new item is inserted. If the caller wants to manager this itself (for
|
| // example, maybe it has special work to do when something is evicted), it
|
| // can pass NO_AUTO_EVICT to not restrict the cache size.
|
| - explicit MRUCacheBase(size_type max_size) : max_size_(max_size) {
|
| - }
|
| -
|
| - MRUCacheBase(size_type max_size, const DeletorType& deletor)
|
| - : max_size_(max_size), deletor_(deletor) {
|
| - }
|
| + explicit MRUCacheBase(size_type max_size) : max_size_(max_size) {}
|
|
|
| - virtual ~MRUCacheBase() {
|
| - iterator i = begin();
|
| - while (i != end())
|
| - i = Erase(i);
|
| - }
|
| + virtual ~MRUCacheBase() {}
|
|
|
| size_type max_size() const { return max_size_; }
|
|
|
| @@ -94,14 +82,14 @@ class MRUCacheBase {
|
| // the same key, it is removed prior to insertion. An iterator indicating the
|
| // inserted item will be returned (this will always be the front of the list).
|
| //
|
| - // The payload will be copied. In the case of an OwningMRUCache, this function
|
| - // will take ownership of the pointer.
|
| - iterator Put(const KeyType& key, const PayloadType& payload) {
|
| + // The payload will be forwarded.
|
| + template <typename Payload>
|
| + iterator Put(const KeyType& key, Payload&& payload) {
|
| // Remove any existing payload with that key.
|
| typename KeyIndex::iterator index_iter = index_.find(key);
|
| if (index_iter != index_.end()) {
|
| - // Erase the reference to it. This will call the deletor on the removed
|
| - // element. The index reference will be replaced in the code below.
|
| + // Erase the reference to it. The index reference will be replaced in the
|
| + // code below.
|
| Erase(index_iter->second);
|
| } else if (max_size_ != NO_AUTO_EVICT) {
|
| // New item is being inserted which might make it larger than the maximum
|
| @@ -109,7 +97,7 @@ class MRUCacheBase {
|
| ShrinkToSize(max_size_ - 1);
|
| }
|
|
|
| - ordering_.push_front(value_type(key, payload));
|
| + ordering_.push_front(value_type(key, std::forward<Payload>(payload)));
|
| index_.insert(std::make_pair(key, ordering_.begin()));
|
| return ordering_.begin();
|
| }
|
| @@ -150,14 +138,12 @@ class MRUCacheBase {
|
| void Swap(MRUCacheBase& other) {
|
| ordering_.swap(other.ordering_);
|
| index_.swap(other.index_);
|
| - std::swap(deletor_, other.deletor_);
|
| std::swap(max_size_, other.max_size_);
|
| }
|
|
|
| // Erases the item referenced by the given iterator. An iterator to the item
|
| // following it will be returned. The iterator must be valid.
|
| iterator Erase(iterator pos) {
|
| - deletor_(pos->second);
|
| index_.erase(pos->first);
|
| return ordering_.erase(pos);
|
| }
|
| @@ -180,9 +166,6 @@ class MRUCacheBase {
|
|
|
| // Deletes everything from the cache.
|
| void Clear() {
|
| - for (typename PayloadList::iterator i(ordering_.begin());
|
| - i != ordering_.end(); ++i)
|
| - deletor_(i->second);
|
| index_.clear();
|
| ordering_.clear();
|
| }
|
| @@ -219,83 +202,28 @@ class MRUCacheBase {
|
|
|
| size_type max_size_;
|
|
|
| - DeletorType deletor_;
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(MRUCacheBase);
|
| };
|
|
|
| // MRUCache --------------------------------------------------------------------
|
|
|
| -// A functor that does nothing. Used by the MRUCache.
|
| -template<class PayloadType>
|
| -class MRUCacheNullDeletor {
|
| - public:
|
| - void operator()(const PayloadType& payload) {}
|
| -};
|
| -
|
| // A container that does not do anything to free its data. Use this when storing
|
| // value types (as opposed to pointers) in the list.
|
| template <class KeyType, class PayloadType>
|
| -class MRUCache : public MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - std::less<KeyType>,
|
| - MRUCacheNullDeletor<PayloadType>> {
|
| +class MRUCache : public MRUCacheBase<KeyType, PayloadType, std::less<KeyType>> {
|
| private:
|
| - typedef MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - std::less<KeyType>,
|
| - MRUCacheNullDeletor<PayloadType>>
|
| - ParentType;
|
| + using ParentType = MRUCacheBase<KeyType, PayloadType, std::less<KeyType>>;
|
|
|
| public:
|
| // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT.
|
| explicit MRUCache(typename ParentType::size_type max_size)
|
| - : ParentType(max_size) {
|
| - }
|
| - virtual ~MRUCache() {
|
| - }
|
| + : ParentType(max_size) {}
|
| + virtual ~MRUCache() {}
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(MRUCache);
|
| };
|
|
|
| -// OwningMRUCache --------------------------------------------------------------
|
| -
|
| -template<class PayloadType>
|
| -class MRUCachePointerDeletor {
|
| - public:
|
| - void operator()(const PayloadType& payload) { delete payload; }
|
| -};
|
| -
|
| -// A cache that owns the payload type, which must be a non-const pointer type.
|
| -// The pointers will be deleted when they are removed, replaced, or when the
|
| -// cache is destroyed.
|
| -// TODO(vmpstr): This should probably go away in favor of storing scoped_ptrs.
|
| -template <class KeyType, class PayloadType>
|
| -class OwningMRUCache
|
| - : public MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - std::less<KeyType>,
|
| - MRUCachePointerDeletor<PayloadType>> {
|
| - private:
|
| - typedef MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - std::less<KeyType>,
|
| - MRUCachePointerDeletor<PayloadType>>
|
| - ParentType;
|
| -
|
| - public:
|
| - // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT.
|
| - explicit OwningMRUCache(typename ParentType::size_type max_size)
|
| - : ParentType(max_size) {
|
| - }
|
| - virtual ~OwningMRUCache() {
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(OwningMRUCache);
|
| -};
|
| -
|
| // HashingMRUCache ------------------------------------------------------------
|
|
|
| template <class KeyType, class ValueType, class HashType>
|
| @@ -307,26 +235,17 @@ struct MRUCacheHashMap {
|
| // the map type instead of std::map. Note that your KeyType must be hashable to
|
| // use this cache or you need to provide a hashing class.
|
| template <class KeyType, class PayloadType, class HashType = std::hash<KeyType>>
|
| -class HashingMRUCache : public MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - HashType,
|
| - MRUCacheNullDeletor<PayloadType>,
|
| - MRUCacheHashMap> {
|
| +class HashingMRUCache
|
| + : public MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap> {
|
| private:
|
| - typedef MRUCacheBase<KeyType,
|
| - PayloadType,
|
| - HashType,
|
| - MRUCacheNullDeletor<PayloadType>,
|
| - MRUCacheHashMap>
|
| - ParentType;
|
| + using ParentType =
|
| + MRUCacheBase<KeyType, PayloadType, HashType, MRUCacheHashMap>;
|
|
|
| public:
|
| // See MRUCacheBase, noting the possibility of using NO_AUTO_EVICT.
|
| explicit HashingMRUCache(typename ParentType::size_type max_size)
|
| - : ParentType(max_size) {
|
| - }
|
| - virtual ~HashingMRUCache() {
|
| - }
|
| + : ParentType(max_size) {}
|
| + virtual ~HashingMRUCache() {}
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(HashingMRUCache);
|
|
|