15#ifndef ACTIONENGINE_DISTRIBUTED_LRU_H_ 
   16#define ACTIONENGINE_DISTRIBUTED_LRU_H_ 
   24#include <absl/container/flat_hash_map.h> 
   25#include <absl/functional/any_invocable.h> 
   26#include <absl/log/log.h> 
   27#include <absl/status/status.h> 
   28#include <absl/status/statusor.h> 
   30#include "actionengine/util/status_macros.h" 
   32namespace act::distributed {
 
   35    absl::AnyInvocable<void(std::string_view key, std::any value) 
const>;
 
   39  explicit LruCache(
size_t max_entries = 0, EvictCallback on_evicted = 
nullptr);
 
   41  void Add(std::string_view key, std::any value);
 
   44  void Add(std::string_view key, T&& value) {
 
   45    Add(key, std::any(std::forward<T>(value)));
 
   48  std::any* absl_nullable Get(std::string_view key);
 
   51  const T* absl_nullable Get(std::string_view key) {
 
   52    const std::any* value = Get(key);
 
   53    auto typed_ptr = std::any_cast<const T>(value);
 
   54    if (typed_ptr == 
nullptr && value != 
nullptr) {
 
   56      LOG(FATAL) << 
"Type mismatch for key '" << key << 
"' in LRU cache.";
 
   62  void Remove(std::string_view key);
 
   66  [[nodiscard]] 
size_t Size()
 const { 
return map_.size(); }
 
   70  size_t max_entries_ = 0;
 
   73  EvictCallback on_evicted_ = 
nullptr;
 
   77  std::list<std::pair<std::string, std::any>> list_;
 
   78  absl::flat_hash_map<std::string,
 
   79                      std::list<std::pair<std::string, std::any>>::iterator>