Index: net/base/expiring_cache.h |
diff --git a/net/base/expiring_cache.h b/net/base/expiring_cache.h |
deleted file mode 100644 |
index 3fbde6594ff24c42557875552718a9425236c498..0000000000000000000000000000000000000000 |
--- a/net/base/expiring_cache.h |
+++ /dev/null |
@@ -1,218 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#ifndef NET_BASE_EXPIRING_CACHE_H_ |
-#define NET_BASE_EXPIRING_CACHE_H_ |
- |
-#include <map> |
-#include <utility> |
- |
-#include "base/basictypes.h" |
-#include "base/gtest_prod_util.h" |
-#include "base/time/time.h" |
- |
-namespace net { |
- |
-template <typename KeyType, |
- typename ValueType, |
- typename ExpirationType> |
-class NoopEvictionHandler { |
- public: |
- void Handle(const KeyType& key, |
- const ValueType& value, |
- const ExpirationType& expiration, |
- const ExpirationType& now, |
- bool onGet) const { |
- } |
-}; |
- |
-// Cache implementation where all entries have an explicit expiration policy. As |
-// new items are added, expired items will be removed first. |
-// The template types have the following requirements: |
-// KeyType must be LessThanComparable, Assignable, and CopyConstructible. |
-// ValueType must be CopyConstructible and Assignable. |
-// ExpirationType must be CopyConstructible and Assignable. |
-// ExpirationCompare is a function class that takes two arguments of the |
-// type ExpirationType and returns a bool. If |comp| is an instance of |
-// ExpirationCompare, then the expression |comp(current, expiration)| shall |
-// return true iff |current| is still valid within |expiration|. |
-// |
-// A simple use of this class may use base::TimeTicks, which provides a |
-// monotonically increasing clock, for the expiration type. Because it's always |
-// increasing, std::less<> can be used, which will simply ensure that |now| is |
-// sorted before |expiration|: |
-// |
-// ExpiringCache<std::string, std::string, base::TimeTicks, |
-// std::less<base::TimeTicks> > cache(0); |
-// // Add a value that expires in 5 minutes |
-// cache.Put("key1", "value1", base::TimeTicks::Now(), |
-// base::TimeTicks::Now() + base::TimeDelta::FromMinutes(5)); |
-// // Add another value that expires in 10 minutes. |
-// cache.Put("key2", "value2", base::TimeTicks::Now(), |
-// base::TimeTicks::Now() + base::TimeDelta::FromMinutes(10)); |
-// |
-// Alternatively, there may be some more complex expiration criteria, at which |
-// point a custom functor may be used: |
-// |
-// struct ComplexExpirationFunctor { |
-// bool operator()(const ComplexExpiration& now, |
-// const ComplexExpiration& expiration) const; |
-// }; |
-// ExpiringCache<std::string, std::string, ComplexExpiration, |
-// ComplexExpirationFunctor> cache(15); |
-// // Add a value that expires once the 'sprocket' has 'cog'-ified. |
-// cache.Put("key1", "value1", ComplexExpiration("sprocket"), |
-// ComplexExpiration("cog")); |
-template <typename KeyType, |
- typename ValueType, |
- typename ExpirationType, |
- typename ExpirationCompare, |
- typename EvictionHandler = NoopEvictionHandler<KeyType, |
- ValueType, |
- ExpirationType> > |
-class ExpiringCache { |
- private: |
- // Intentionally violate the C++ Style Guide so that EntryMap is known to be |
- // a dependent type. Without this, Clang's two-phase lookup complains when |
- // using EntryMap::const_iterator, while GCC and MSVC happily resolve the |
- // typename. |
- |
- // Tuple to represent the value and when it expires. |
- typedef std::pair<ValueType, ExpirationType> Entry; |
- typedef std::map<KeyType, Entry> EntryMap; |
- |
- public: |
- typedef KeyType key_type; |
- typedef ValueType value_type; |
- typedef ExpirationType expiration_type; |
- |
- // This class provides a read-only iterator over items in the ExpiringCache |
- class Iterator { |
- public: |
- explicit Iterator(const ExpiringCache& cache) |
- : cache_(cache), |
- it_(cache_.entries_.begin()) { |
- } |
- ~Iterator() {} |
- |
- bool HasNext() const { return it_ != cache_.entries_.end(); } |
- void Advance() { ++it_; } |
- |
- const KeyType& key() const { return it_->first; } |
- const ValueType& value() const { return it_->second.first; } |
- const ExpirationType& expiration() const { return it_->second.second; } |
- |
- private: |
- const ExpiringCache& cache_; |
- |
- // Use a second layer of type indirection, as both EntryMap and |
- // EntryMap::const_iterator are dependent types. |
- typedef typename ExpiringCache::EntryMap EntryMap; |
- typename EntryMap::const_iterator it_; |
- }; |
- |
- |
- // Constructs an ExpiringCache that stores up to |max_entries|. |
- explicit ExpiringCache(size_t max_entries) : max_entries_(max_entries) {} |
- ~ExpiringCache() {} |
- |
- // Returns the value matching |key|, which must be valid at the time |now|. |
- // Returns NULL if the item is not found or has expired. If the item has |
- // expired, it is immediately removed from the cache. |
- // Note: The returned pointer remains owned by the ExpiringCache and is |
- // invalidated by a call to a non-const method. |
- const ValueType* Get(const KeyType& key, const ExpirationType& now) { |
- typename EntryMap::iterator it = entries_.find(key); |
- if (it == entries_.end()) |
- return NULL; |
- |
- // Immediately remove expired entries. |
- if (!expiration_comp_(now, it->second.second)) { |
- Evict(it, now, true); |
- return NULL; |
- } |
- |
- return &it->second.first; |
- } |
- |
- // Updates or replaces the value associated with |key|. |
- void Put(const KeyType& key, |
- const ValueType& value, |
- const ExpirationType& now, |
- const ExpirationType& expiration) { |
- typename EntryMap::iterator it = entries_.find(key); |
- if (it == entries_.end()) { |
- // Compact the cache if it grew beyond the limit. |
- if (entries_.size() == max_entries_ ) |
- Compact(now); |
- |
- // No existing entry. Creating a new one. |
- entries_.insert(std::make_pair(key, Entry(value, expiration))); |
- } else { |
- // Update an existing cache entry. |
- it->second.first = value; |
- it->second.second = expiration; |
- } |
- } |
- |
- // Empties the cache. |
- void Clear() { |
- entries_.clear(); |
- } |
- |
- // Returns the number of entries in the cache. |
- size_t size() const { return entries_.size(); } |
- |
- // Returns the maximum number of entries in the cache. |
- size_t max_entries() const { return max_entries_; } |
- |
- bool empty() const { return entries_.empty(); } |
- |
- private: |
- FRIEND_TEST_ALL_PREFIXES(ExpiringCacheTest, Compact); |
- FRIEND_TEST_ALL_PREFIXES(ExpiringCacheTest, CustomFunctor); |
- |
- // Prunes entries from the cache to bring it below |max_entries()|. |
- void Compact(const ExpirationType& now) { |
- // Clear out expired entries. |
- typename EntryMap::iterator it; |
- for (it = entries_.begin(); it != entries_.end(); ) { |
- if (!expiration_comp_(now, it->second.second)) { |
- Evict(it++, now, false); |
- } else { |
- ++it; |
- } |
- } |
- |
- if (entries_.size() < max_entries_) |
- return; |
- |
- // If the cache is still too full, start deleting items 'randomly'. |
- for (it = entries_.begin(); |
- it != entries_.end() && entries_.size() >= max_entries_;) { |
- Evict(it++, now, false); |
- } |
- } |
- |
- void Evict(typename EntryMap::iterator it, |
- const ExpirationType& now, |
- bool on_get) { |
- eviction_handler_.Handle(it->first, it->second.first, it->second.second, |
- now, on_get); |
- entries_.erase(it); |
- } |
- |
- // Bound on total size of the cache. |
- size_t max_entries_; |
- |
- EntryMap entries_; |
- ExpirationCompare expiration_comp_; |
- EvictionHandler eviction_handler_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ExpiringCache); |
-}; |
- |
-} // namespace net |
- |
-#endif // NET_BASE_EXPIRING_CACHE_H_ |