@@ -28,8 +28,13 @@ typedef ValueEntryBase CacheRecord;
2828
2929class Evictor {
3030public:
31- typedef std::function< bool (const CacheRecord&) > can_evict_cb_t ;
32- typedef std::function< void (const CacheRecord&) > post_eviction_cb_t ;
31+ typedef std::function< bool (const CacheRecord&) > eviction_cb_t ;
32+ using can_evict_cb_t = eviction_cb_t ;
33+
34+ struct RecordFamily {
35+ Evictor::eviction_cb_t can_evict_cb{nullptr };
36+ Evictor::eviction_cb_t post_eviction_cb{nullptr };
37+ };
3338
3439 Evictor (const int64_t max_size, const uint32_t num_partitions) :
3540 m_max_size{max_size}, m_num_partitions{num_partitions} {}
@@ -39,12 +44,12 @@ class Evictor {
3944 Evictor& operator =(Evictor&&) noexcept = delete ;
4045 virtual ~Evictor () = default ;
4146
42- uint32_t register_record_family (can_evict_cb_t can_evict_cb = nullptr , post_eviction_cb_t post_eviction_cb = nullptr ) {
47+ uint32_t register_record_family (RecordFamily record_family ) {
4348 uint32_t id{0 };
4449 std::unique_lock lk (m_reg_mtx);
4550 while (id < m_eviction_cbs.size ()) {
46- if (std::get< bool >( m_eviction_cbs[id]) == false ) {
47- m_eviction_cbs[id] = std::make_tuple (true , can_evict_cb, post_eviction_cb );
51+ if (m_eviction_cbs[id]. first == false ) {
52+ m_eviction_cbs[id] = std::make_pair (true , record_family );
4853 return id;
4954 }
5055 ++id;
@@ -55,7 +60,7 @@ class Evictor {
5560
5661 void unregister_record_family (const uint32_t record_type_id) {
5762 std::unique_lock lk (m_reg_mtx);
58- m_eviction_cbs[record_type_id] = std::make_tuple (false , nullptr , nullptr );
63+ m_eviction_cbs[record_type_id] = std::make_pair (false , RecordFamily{} );
5964 }
6065
6166 virtual bool add_record (uint64_t hash_code, CacheRecord& record) = 0;
@@ -65,14 +70,14 @@ class Evictor {
6570
6671 int64_t max_size () const { return m_max_size; }
6772 uint32_t num_partitions () const { return m_num_partitions; }
68- const can_evict_cb_t & can_evict_cb (const uint32_t record_id) const { return std::get< can_evict_cb_t >( m_eviction_cbs[record_id]) ; }
69- const post_eviction_cb_t & post_eviction_cb (const uint32_t record_id) const { return std::get< post_eviction_cb_t >( m_eviction_cbs[record_id]) ; }
73+ const eviction_cb_t & can_evict_cb (const uint32_t record_id) const { return m_eviction_cbs[record_id]. second . can_evict_cb ; }
74+ const eviction_cb_t & post_eviction_cb (const uint32_t record_id) const { return m_eviction_cbs[record_id]. second . post_eviction_cb ; }
7075
7176private:
7277 int64_t m_max_size;
7378 uint32_t m_num_partitions;
7479
7580 std::mutex m_reg_mtx;
76- std::array< std::tuple < bool , can_evict_cb_t , post_eviction_cb_t >, CacheRecord::max_record_families() > m_eviction_cbs;
81+ std::array< std::pair < bool , RecordFamily >, CacheRecord::max_record_families() > m_eviction_cbs;
7782};
7883} // namespace sisl
0 commit comments