OpenCBDC Transaction Processor
Loading...
Searching...
No Matches
cache_set.hpp
Go to the documentation of this file.
1// Copyright (c) 2021 MIT Digital Currency Initiative
2// Federal Reserve Bank of Boston
3// Distributed under the MIT software license, see the accompanying
4// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6#ifndef CACHE_SET_H_INC
7#define CACHE_SET_H_INC
8
9#include <cassert>
10#include <queue>
11#include <shared_mutex>
12#include <unordered_set>
13
14namespace cbdc {
20 template<typename K, typename H = std::hash<K>>
21 class cache_set {
22 public:
23 cache_set() = delete;
24
27 explicit cache_set(size_t max_size) : m_max_size(max_size) {
28 m_vals.max_load_factor(std::numeric_limits<float>::max());
29 static constexpr auto buckets_factor = 2;
30 m_vals.rehash(buckets_factor * max_size);
31 };
32
37 template<typename T>
38 auto add(T&& val) -> bool {
39 std::unique_lock<std::shared_mutex> l(m_mut);
40 auto added = m_vals.emplace(std::forward<T>(val));
41 if(added.second) {
42 m_eviction_queue.push(std::ref(*added.first));
43 if(m_eviction_queue.size() >= m_max_size) {
44 auto& v = m_eviction_queue.front();
45 m_vals.erase(v);
46 m_eviction_queue.pop();
47 }
48 }
49 assert(m_eviction_queue.size() <= m_max_size);
50 return added.second;
51 }
52
56 [[nodiscard]] auto contains(const K& val) const -> bool {
57 std::shared_lock<std::shared_mutex> l(m_mut);
58 return m_vals.find(val) != m_vals.end();
59 }
60
61 private:
62 std::unordered_set<K, H> m_vals;
63 std::queue<std::reference_wrapper<const K>> m_eviction_queue;
64 size_t m_max_size;
65 mutable std::shared_mutex m_mut;
66 };
67}
68
69#endif
Thread-safe set with a maximum size.
Definition cache_set.hpp:21
cache_set(size_t max_size)
Constructor.
Definition cache_set.hpp:27
cache_set()=delete
auto add(T &&val) -> bool
Adds a value to the set, evicting the oldest value if the set is full.
Definition cache_set.hpp:38
auto contains(const K &val) const -> bool
Determines whether a given value is present in the cache set.
Definition cache_set.hpp:56