Maurice Grönwoldt
5bb68a7d02
We have no make install support... so we don't need to have everything as a single-header and lib file.
59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <cassert>
|
|
#include <mutex>
|
|
#include <unordered_map>
|
|
#include <condition_variable>
|
|
#include <atomic>
|
|
|
|
namespace VWeb {
|
|
template <typename T, typename S> struct SafeMap {
|
|
explicit SafeMap(size_t maxSize = -1UL) : m_MaxSize(maxSize), m_End(false){};
|
|
bool Add(const T &t, S &x) {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
while (m_Data.size() == m_MaxSize && !m_End)
|
|
return false;
|
|
assert(!m_End);
|
|
m_Data.emplace(t, std::move(x));
|
|
return true;
|
|
};
|
|
bool Add(T &&t, S &&x) {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
while (m_Data.size() == m_MaxSize && !m_End)
|
|
return false;
|
|
assert(!m_End);
|
|
m_Data.push(std::move(t));
|
|
return true;
|
|
};
|
|
void Remove(T t) {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
if (m_Data.empty() || m_End)
|
|
return;
|
|
if (m_Data.contains(t))
|
|
m_Data.erase(t);
|
|
m_CVFull.notify_one();
|
|
};
|
|
void Clear() {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
std::unordered_map<T, S> empty;
|
|
std::swap(m_Data, empty);
|
|
m_CVFull.notify_all();
|
|
};
|
|
bool Has(T t) {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
return m_Data.contains(t);
|
|
};
|
|
S &Get(T t) {
|
|
std::unique_lock<std::mutex> lck(m_Mutex);
|
|
return m_Data[t];
|
|
};
|
|
int Size() { return m_Data.size(); };
|
|
|
|
private:
|
|
std::unordered_map<T, S> m_Data{};
|
|
std::mutex m_Mutex{};
|
|
std::condition_variable m_CVFull{};
|
|
const size_t m_MaxSize{};
|
|
std::atomic<bool> m_End{};
|
|
};
|
|
} |