1#ifndef GYM_PCB_RL_ACTIONCACHE_H
2#define GYM_PCB_RL_ACTIONCACHE_H
4#include "RL/Action.hpp"
8template<
class Data>
class ActionCache
11 ActionCache(uint size, uint maxOversize) : mSize(size), mTriggerSize(size + maxOversize) { }
12 using Ref = Action::CacheRef;
13 using List = std::list<std::pair<Ref, Data>>;
15 void store(Ref,
const Data&);
19 std::map<Ref, typename List::iterator> mLUT;
25template<
class Data> Data *ActionCache<Data>::load(ActionCache::Ref ref)
27 auto M = mLUT.find(ref);
30 mLRU.splice(mLRU.end(), mLRU, M->second);
31 return &M->second->second;
34template<
class Data>
void ActionCache<Data>::store(ActionCache::Ref ref,
const Data &data)
36 auto M = mLUT.find(ref);
37 if (M != mLUT.end()) {
38 M->second->second = data;
40 mLRU.emplace_back(ref, data);
41 mLUT[ref] = --mLRU.end();
43 if (mLRU.size() >= mTriggerSize)
47template<
class Data>
void ActionCache<Data>::shrink()
49 if (mLRU.size() <= mSize)
51 uint N = mLRU.size() - mSize;
52 for (
auto I = mLRU.begin(); I != mLRU.end() && N; --N) {
58template<
class Data>
void ActionCache<Data>::clear()