29 : capacity_(budget.resident_limit(budget.bytes(), algorithm_state_bytes)) {}
33 [[nodiscard]] std::size_t
capacity_bytes() const noexcept {
return capacity_; }
35 [[nodiscard]] std::size_t
size() const noexcept {
return entries_.size(); }
45 return entries_.find(
id) != entries_.end();
49 auto it = entries_.find(
id);
50 if (it == entries_.end()) {
56 return &it->second.payload;
60 if (bytes > capacity_) {
61 throw std::length_error(
"partition exceeds cache capacity");
64 auto existing = entries_.find(
id);
65 if (existing != entries_.end()) {
67 lru_.erase(existing->second.lru_it);
68 entries_.erase(existing);
71 while (stats_.
resident_bytes + bytes > capacity_ && !lru_.empty()) {
76 entries_.emplace(
id, Entry{std::move(payload), bytes, lru_.begin()});
81 auto it = entries_.find(
id);
82 if (it == entries_.end())
return false;
84 lru_.erase(it->second.lru_it);
93 typename std::list<PartitionId>::iterator lru_it;
96 using Map = std::unordered_map<PartitionId, Entry>;
98 void touch(
typename Map::iterator it) {
99 lru_.erase(it->second.lru_it);
100 lru_.push_front(it->first);
101 it->second.lru_it = lru_.begin();
105 const auto victim = lru_.back();
107 auto it = entries_.find(victim);
108 if (it != entries_.end()) {
115 std::size_t capacity_{0};
116 std::list<PartitionId> lru_;
118 PartitionCacheStats stats_;