summaryrefslogtreecommitdiff
path: root/chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h')
-rw-r--r--chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h74
1 files changed, 74 insertions, 0 deletions
diff --git a/chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h b/chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h
new file mode 100644
index 00000000000..b8c78c6fd58
--- /dev/null
+++ b/chromium/net/third_party/quiche/src/quic/core/quic_lru_cache.h
@@ -0,0 +1,74 @@
+// Copyright (c) 2018 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 QUICHE_QUIC_CORE_QUIC_LRU_CACHE_H_
+#define QUICHE_QUIC_CORE_QUIC_LRU_CACHE_H_
+
+#include <memory>
+
+#include "net/third_party/quiche/src/quic/platform/api/quic_containers.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
+
+namespace quic {
+
+// A LRU cache that maps from type Key to Value* in QUIC.
+// This cache CANNOT be shared by multiple threads (even with locks) because
+// Value* returned by Lookup() can be invalid if the entry is evicted by other
+// threads.
+template <class K, class V>
+class QuicLRUCache {
+ public:
+ explicit QuicLRUCache(size_t capacity) : capacity_(capacity) {}
+ QuicLRUCache(const QuicLRUCache&) = delete;
+ QuicLRUCache& operator=(const QuicLRUCache&) = delete;
+
+ // Inserts one unit of |key|, |value| pair to the cache. Cache takes ownership
+ // of inserted |value|.
+ void Insert(const K& key, std::unique_ptr<V> value) {
+ auto it = cache_.find(key);
+ if (it != cache_.end()) {
+ cache_.erase(it);
+ }
+ cache_.emplace(key, std::move(value));
+
+ if (cache_.size() > capacity_) {
+ cache_.pop_front();
+ }
+ DCHECK_LE(cache_.size(), capacity_);
+ }
+
+ // If cache contains an entry for |key|, return a pointer to it. This returned
+ // value is guaranteed to be valid until Insert or Clear.
+ // Else return nullptr.
+ V* Lookup(const K& key) {
+ auto it = cache_.find(key);
+ if (it == cache_.end()) {
+ return nullptr;
+ }
+
+ std::unique_ptr<V> value = std::move(it->second);
+ cache_.erase(it);
+ auto result = cache_.emplace(key, std::move(value));
+ DCHECK(result.second);
+ return result.first->second.get();
+ }
+
+ // Removes all entries from the cache.
+ void Clear() { cache_.clear(); }
+
+ // Returns maximum size of the cache.
+ size_t MaxSize() const { return capacity_; }
+
+ // Returns current size of the cache.
+ size_t Size() const { return cache_.size(); }
+
+ private:
+ QuicLinkedHashMap<K, std::unique_ptr<V>> cache_;
+ const size_t capacity_;
+};
+
+} // namespace quic
+
+#endif // QUICHE_QUIC_CORE_QUIC_LRU_CACHE_H_