Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual > Class Template Reference
Collaboration diagram for duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >:

Classes

struct  Entry
 

Public Types

using key_type = Key
 
using mapped_type = shared_ptr< Val >
 
using hasher = KeyHash
 
using key_equal = KeyEqual
 

Public Member Functions

 SharedLruCache (idx_t max_total_weight_p)
 
 SharedLruCache (const SharedLruCache &)=delete
 
SharedLruCacheoperator= (const SharedLruCache &)=delete
 
template<typename... Types>
void Put (Key key, shared_ptr< Val > value, Types... constructor_args)
 
bool Delete (const Key &key)
 
shared_ptr< Val > Get (const Key &key)
 
void Clear ()
 
idx_t EvictToReduceAtLeast (idx_t target_weight)
 
idx_t Capacity () const
 
idx_t CurrentTotalWeight () const
 
size_t Size () const
 
bool IsEmpty () const
 

Private Types

using EntryMap = unordered_map< Key, Entry, KeyHash, KeyEqual >
 

Private Member Functions

void DeleteImpl (typename EntryMap::iterator iter)
 
void EvictIfNeeded (idx_t required_weight)
 

Private Attributes

const idx_t max_total_weight
 
idx_t current_total_weight
 
EntryMap entry_map
 
list< Keylru_list
 

Constructor & Destructor Documentation

◆ SharedLruCache()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::SharedLruCache ( idx_t  max_total_weight_p)
inlineexplicit
51396 : max_total_weight(max_total_weight_p), current_total_weight(0) {
51397 }

Member Function Documentation

◆ Put()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
template<typename... Types>
void duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Put ( Key  key,
shared_ptr< Val >  value,
Types...  constructor_args 
)
inline
51407 {
51408 // Remove existing entry if present
51409 auto existing_it = entry_map.find(key);
51410 if (existing_it != entry_map.end()) {
51411 DeleteImpl(existing_it);
51412 }
51413
51414 auto payload = make_uniq<Payload>(std::forward<Types>(constructor_args)...);
51415 auto payload_weight = payload->GetWeight();
51416
51417 // Evict entries if needed to make room
51418 if (max_total_weight > 0 && payload_weight > 0) {
51419 EvictIfNeeded(payload_weight);
51420 }
51421
51422 // Add new entry
51423 lru_list.emplace_front(key);
51424 Entry new_entry;
51425 new_entry.value = std::move(value);
51426 new_entry.lru_iterator = lru_list.begin();
51427 new_entry.payload = std::move(payload);
51428 new_entry.payload_weight = payload_weight;
51429
51430 entry_map[std::move(key)] = std::move(new_entry);
51431 current_total_weight += payload_weight;
51432 }

◆ Delete()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
bool duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Delete ( const Key key)
inline
51436 {
51437 auto it = entry_map.find(key);
51438 if (it == entry_map.end()) {
51439 return false;
51440 }
51441 DeleteImpl(it);
51442 return true;
51443 }

◆ Get()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
shared_ptr< Val > duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Get ( const Key key)
inline
51446 {
51447 auto entry_map_iter = entry_map.find(key);
51448 if (entry_map_iter == entry_map.end()) {
51449 return nullptr;
51450 }
51451
51452 // Move to front, which indicates most recently used.
51453 lru_list.splice(lru_list.begin(), lru_list, entry_map_iter->second.lru_iterator);
51454 return entry_map_iter->second.value;
51455 }

◆ Clear()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
void duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Clear ( )
inline
51458 {
51459 entry_map.clear();
51460 lru_list.clear();
51461 current_total_weight = 0;
51462 }

◆ EvictToReduceAtLeast()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
idx_t duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::EvictToReduceAtLeast ( idx_t  target_weight)
inline
51466 {
51467 idx_t freed = 0;
51468 while (!lru_list.empty() && freed < target_weight) {
51469 const auto &stale_key = lru_list.back();
51470 auto stale_it = entry_map.find(stale_key);
51471 D_ASSERT(stale_it != entry_map.end());
51472 freed += stale_it->second.payload_weight;
51473 DeleteImpl(stale_it);
51474 }
51475 return freed;
51476 }

◆ Capacity()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
idx_t duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Capacity ( ) const
inline
51478 {
51479 return max_total_weight;
51480 }

◆ CurrentTotalWeight()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
idx_t duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::CurrentTotalWeight ( ) const
inline
51481 {
51482 return current_total_weight;
51483 }

◆ Size()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
size_t duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::Size ( ) const
inline
51484 {
51485 return entry_map.size();
51486 }

◆ IsEmpty()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
bool duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::IsEmpty ( ) const
inline
51487 {
51488 return entry_map.empty();
51489 }

◆ DeleteImpl()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
void duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::DeleteImpl ( typename EntryMap::iterator  iter)
inlineprivate
51503 {
51504 current_total_weight -= iter->second.payload_weight;
51505 D_ASSERT(current_total_weight >= 0);
51506 lru_list.erase(iter->second.lru_iterator);
51507 entry_map.erase(iter);
51508 }

◆ EvictIfNeeded()

template<typename Key , typename Val , typename Payload = DefaultPayload, typename KeyHash = std::hash<Key>, typename KeyEqual = std::equal_to<Key>>
void duckdb::SharedLruCache< Key, Val, Payload, KeyHash, KeyEqual >::EvictIfNeeded ( idx_t  required_weight)
inlineprivate
51510 {
51511 if (max_total_weight == 0) {
51512 return;
51513 }
51514
51515 // Evict LRU entries until we have enough space
51516 while (!lru_list.empty() && (current_total_weight + required_weight > max_total_weight)) {
51517 const auto &stale_key = lru_list.back();
51518 auto stale_it = entry_map.find(stale_key);
51519 if (stale_it != entry_map.end()) {
51520 DeleteImpl(stale_it);
51521 } else {
51522 // Should not happen, but be defensive
51523 lru_list.pop_back();
51524 }
51525 }
51526 }

The documentation for this class was generated from the following file: