8#include <unordered_map>
18 is_empty(
const T &v) : v_(v) {}
19 operator bool()
const {
return !v_; }
23struct is_empty<
std::vector<T>> {
24 is_empty(
const std::vector<T> &v) : v_(v) {}
25 operator bool()
const {
return v_.empty(); }
26 const std::vector<T> &v_;
30template <
class Key,
class Value>
33 using GetterFn = std::function<Value(uint64_t,
const Key &)>;
34 using ValueMap = std::unordered_map<Key, Value>;
35 using DataMap = std::map<uint64_t, ValueMap>;
45 void append(uint64_t block_num,
const Key &key,
const Value &value)
const {
46 std::unique_lock lock(
mutex_);
52 blk_entry->second.emplace(key, value);
60 Value
get(uint64_t blk_num,
const Key &key)
const {
62 std::shared_lock lock(
mutex_);
65 auto e = blk_entry->second.find(key);
66 if (e != blk_entry->second.end()) {
73 if (is_empty(value)) {
78 if (last_num < kBlocksToKeep || blk_num >= last_num -
kBlocksToKeep) {
79 append(blk_num, key, value);
85 std::shared_lock lock(
mutex_);
101template <
class Value>
115 void append(uint64_t block_num, Value value)
const {
116 std::unique_lock lock(
mutex_);
126 std::shared_lock lock(
mutex_);
129 return blk_entry->second;
134 Value
get(uint64_t block_num)
const {
141 if (is_empty(value)) {
146 if (last_num < kBlocksToKeep || block_num >= last_num -
kBlocksToKeep) {
153 std::shared_lock lock(
mutex_);
161 std::shared_lock lock(
mutex_);
Value get(uint64_t blk_num, const Key &key) const
Definition cache.hpp:60
const uint64_t kBlocksToKeep
Definition cache.hpp:93
MapByBlockCache & operator=(MapByBlockCache &&)=delete
std::map< uint64_t, ValueMap > DataMap
Definition cache.hpp:35
DataMap data_by_block_
Definition cache.hpp:98
MapByBlockCache & operator=(const MapByBlockCache &)=delete
MapByBlockCache(uint64_t blocks_to_save, GetterFn &&getter_fn)
Definition cache.hpp:42
std::unordered_map< Key, Value > ValueMap
Definition cache.hpp:34
std::shared_mutex mutex_
Definition cache.hpp:97
std::function< Value(uint64_t, const Key &)> GetterFn
Definition cache.hpp:33
void append(uint64_t block_num, const Key &key, const Value &value) const
Definition cache.hpp:45
MapByBlockCache(MapByBlockCache &&)=delete
uint64_t lastBlockNum() const
Definition cache.hpp:84
GetterFn getter_fn_
Definition cache.hpp:94
MapByBlockCache(const MapByBlockCache &)=delete
Value get(uint64_t block_num) const
Definition cache.hpp:134
std::shared_mutex mutex_
Definition cache.hpp:173
ValueByBlockCache(uint64_t blocks_to_save, GetterFn &&getter_fn)
Definition cache.hpp:112
const uint64_t kBlocksToKeep
Definition cache.hpp:169
std::map< uint64_t, Value > DataMap
Definition cache.hpp:105
ValueByBlockCache(const ValueByBlockCache &)=delete
uint64_t lastBlockNum() const
Definition cache.hpp:160
void append(uint64_t block_num, Value value) const
Definition cache.hpp:115
Value last() const
Definition cache.hpp:152
std::function< Value(uint64_t)> GetterFn
Definition cache.hpp:104
ValueByBlockCache(ValueByBlockCache &&)=delete
ValueByBlockCache & operator=(const ValueByBlockCache &)=delete
GetterFn getter_fn_
Definition cache.hpp:170
std::optional< Value > getFromCache(uint64_t block_num) const
Definition cache.hpp:125
ValueByBlockCache & operator=(ValueByBlockCache &&)=delete
DataMap data_by_block_
Definition cache.hpp:174
std::hash for asio::adress
Definition FixedHash.h:483