15#include <unordered_set>
24template<
typename Value>
37 if (
m_set.insert(value).second)
67 std::unordered_set<Value>
m_set;
75template<
typename Key,
typename Value>
81 void set(
const Key &name,
const Value &value)
87 bool get(
const Key &name, Value *result)
const
101 std::vector<Value> result;
104 result.push_back(it->second);
128 template<
typename Key,
typename U,
typename Caller,
typename CallerData>
149 m_queue.push_back(std::move(t));
158 if (
m_signal.wait(wait_time_max_ms)) {
161 T t = std::move(
m_queue.front());
171 if (
m_signal.wait(wait_time_max_ms)) {
174 T t = std::move(
m_queue.front());
188 T t = std::move(
m_queue.front());
195 if (
m_signal.wait(wait_time_max_ms)) {
198 T t = std::move(
m_queue.back());
211 if (
m_signal.wait(wait_time_max_ms)) {
214 T t = std::move(
m_queue.back());
228 T t = std::move(
m_queue.back());
235 return IterationHelper(
this);
243 q->getMutex().unlock();
244 q->getSignal().post();
247 auto begin() {
return q->getQueue().begin(); }
248 auto end() {
return q->getQueue().end(); }
250 auto erase(
typename std::deque<T>::iterator it) {
251 return q->getQueue().erase(it);
256 q->getMutex().lock();
276template<
typename K,
typename V>
280 LRUCache(
size_t limit,
void (*cache_miss)(
void *data,
const K &key, V *dest),
290 m_limit = std::max<size_t>(1, limit);
302 auto it =
m_map.find(key);
304 if (it !=
m_map.end()) {
311 if (entry.first !=
m_queue.begin()) {
336 typedef typename std::pair<typename std::list<K>::iterator, V>
cache_entry;
363template<
typename K,
typename V>
368 static_assert(std::is_default_constructible<V>::value,
369 "Value type must be default constructible");
370 static_assert(std::is_constructible<bool, V>::value,
371 "Value type must be convertible to bool");
372 static_assert(std::is_move_assignable<V>::value,
373 "Value type must be move-assignable");
391 const V &
get(const K &key)
const {
393 auto it =
m_new.find(key);
394 if (it !=
m_new.end())
407 void put(
const K &key,
const V &value) {
424 void put(
const K &key, V &&value) {
435 m_new[key] = std::move(value);
444 auto it =
m_new.find(key);
445 if (it !=
m_new.end()) {
446 ret = std::move(it->second);
454 ret = std::move(it->second);
475 assert(
m_new.empty());
480 n += !it.second ? 0 : 1;
497 auto iter() {
return IterationHelper(
this); }
513 static constexpr size_t unknown =
static_cast<size_t>(-1);
518 if (!
m_new.empty()) {
541 assert(
m->m_iterating);
543 if (!
m->m_iterating) {
545 m->collect_garbage();
549 auto begin() {
return m->m_values.cbegin(); }
550 auto end() {
return m->m_values.cend(); }
554 assert(
m->m_iterating < std::numeric_limits<
decltype(
m_iterating)>::max());
#define DISABLE_CLASS_COPY(C)
Definition basic_macros.h:26
#define ALLOW_CLASS_MOVE(C)
Definition basic_macros.h:32
Definition exceptions.h:66
size_t m_limit
Definition container.h:341
cache_type m_map
Definition container.h:343
LRUCache(size_t limit, void(*cache_miss)(void *data, const K &key, V *dest), void *data)
Definition container.h:280
void setLimit(size_t limit)
Definition container.h:288
const V * lookupCache(const K &key)
Definition container.h:300
void * m_cache_miss_data
Definition container.h:340
std::map< K, cache_entry > cache_type
Definition container.h:337
std::pair< typename std::list< K >::iterator, V > cache_entry
Definition container.h:336
void invalidate()
Definition container.h:294
std::list< K > m_queue
Definition container.h:345
void(* m_cache_miss)(void *data, const K &key, V *dest)
Definition container.h:339
Definition container.h:365
const void *& get(const u16 &key) const
Definition container.h:391
size_t m_garbage
Definition container.h:566
void * mapped_type
Definition container.h:376
~ModifySafeMap()
Definition container.h:383
u16 key_type
Definition container.h:375
void clear()
Definition container.h:499
size_t size() const
Definition container.h:469
auto iter()
Definition container.h:497
void put(const K &key, V &&value)
Definition container.h:424
ModifySafeMap()
Definition container.h:378
V take(const K &key)
Definition container.h:441
static constexpr size_t GC_MIN_SIZE
Definition container.h:568
static constexpr size_t unknown
Definition container.h:513
void put(const K &key, const V &value)
Definition container.h:407
void collect_garbage()
Definition container.h:525
bool empty() const
Definition container.h:485
bool remove(const K &key)
Definition container.h:464
std::map< u16, void * > m_values
Definition container.h:562
unsigned int m_iterating
Definition container.h:564
static const void * null_value
Definition container.h:510
void merge_new()
Definition container.h:516
std::map< u16, void * > m_new
Definition container.h:563
std::vector< Value > getValues() const
Definition container.h:98
bool get(const Key &name, Value *result) const
Definition container.h:87
std::map< Key, Value > m_values
Definition container.h:115
std::mutex m_mutex
Definition container.h:116
void set(const Key &name, const Value &value)
Definition container.h:81
void clear()
Definition container.h:108
friend class RequestQueue
Definition container.h:129
bool empty() const
Definition container.h:133
void push_back(T &&t)
Definition container.h:146
std::deque< MeshUpdateResult > m_queue
Definition container.h:267
Semaphore m_signal
Definition container.h:269
T pop_front(u32 wait_time_max_ms)
Definition container.h:169
T pop_back(u32 wait_time_max_ms=0)
Definition container.h:193
T pop_frontNoEx()
Definition container.h:182
T pop_backNoEx()
Definition container.h:222
std::deque< T > & getQueue()
Definition container.h:265
std::mutex m_mutex
Definition container.h:268
auto iterLocked()
Definition container.h:233
Semaphore & getSignal()
Definition container.h:263
T pop_backNoEx(u32 wait_time_max_ms)
Definition container.h:209
T pop_frontNoEx(u32 wait_time_max_ms)
Definition container.h:156
void push_back(const T &t)
Definition container.h:139
std::mutex & getMutex()
Definition container.h:262
Definition semaphore.h:18
Definition container.h:26
size_t size() const
Definition container.h:56
void pop_front()
Definition container.h:45
bool push_back(const Value &value)
Definition container.h:35
std::queue< Value > m_queue
Definition container.h:68
const Value & front() const
Definition container.h:51
bool empty() const
Definition container.h:61
std::unordered_set< Value > m_set
Definition container.h:67
#define sanity_check(expr)
Definition debug.h:55
std::lock_guard< std::mutex > MutexAutoLock
Definition mutex_auto_lock.h:31
ModifySafeMap< K, V > * m
Definition container.h:558
IterationHelper(ModifySafeMap< K, V > *parent)
Definition container.h:553
~IterationHelper()
Definition container.h:540
auto end()
Definition container.h:550
auto begin()
Definition container.h:549
auto end()
Definition container.h:248
auto erase(typename std::deque< T >::iterator it)
Definition container.h:250
IterationHelper(MutexedQueue< T > *parent)
Definition container.h:255
~IterationHelper()
Definition container.h:242
auto begin()
Definition container.h:247
MutexedQueue< T > * q
Definition container.h:259