#pragma once #include #include #include #include #include #include #include namespace xrpl { namespace detail { /** Remembers which tree keys have all descendants resident. This optimizes the process of acquiring a complete tree. */ class BasicFullBelowCache { private: using CacheType = KeyCache; public: static constexpr auto kDefaultCacheTargetSize = 0; using key_type = uint256; using clock_type = typename CacheType::clock_type; /** Construct the cache. @param name A label for diagnostics and stats reporting. @param collector The collector to use for reporting stats. @param targetSize The cache target size. @param targetExpirationSeconds The expiration time for items. */ BasicFullBelowCache( std::string const& name, clock_type& clock, beast::Journal j, beast::insight::Collector::ptr const& collector = beast::insight::NullCollector::make(), std::size_t targetSize = kDefaultCacheTargetSize, std::chrono::seconds expiration = std::chrono::minutes{2}) : cache_(name, targetSize, expiration, clock, j, collector), gen_(1) { } /** Return the clock associated with the cache. */ clock_type& clock() { return cache_.clock(); } /** Return the number of elements in the cache. Thread safety: Safe to call from any thread. */ std::size_t size() const { return cache_.size(); } /** Remove expired cache items. Thread safety: Safe to call from any thread. */ void sweep() { cache_.sweep(); } /** Refresh the last access time of an item, if it exists. Thread safety: Safe to call from any thread. @param key The key to refresh. @return `true` If the key exists. */ bool touchIfExists(key_type const& key) { return cache_.touchIfExists(key); } /** Insert a key into the cache. If the key already exists, the last access time will still be refreshed. Thread safety: Safe to call from any thread. @param key The key to insert. */ void insert(key_type const& key) { cache_.insert(key); } /** generation determines whether cached entry is valid */ std::uint32_t getGeneration(void) const { return gen_; } void clear() { cache_.clear(); ++gen_; } void reset() { cache_.clear(); gen_ = 1; } private: CacheType cache_; std::atomic gen_; }; } // namespace detail using FullBelowCache = detail::BasicFullBelowCache; } // namespace xrpl