mirror-chatterino2/concurrentmap.h

73 lines
1.3 KiB
C
Raw Normal View History

2017-01-04 15:12:31 +01:00
#ifndef CONCURRENTMAP_H
#define CONCURRENTMAP_H
2017-01-06 23:28:48 +01:00
#include <QMap>
2017-01-11 18:52:09 +01:00
#include <QMutex>
2017-01-06 23:28:48 +01:00
#include <functional>
2017-01-04 15:12:31 +01:00
2017-01-18 21:30:23 +01:00
namespace chatterino {
2017-01-11 18:52:09 +01:00
template <typename TKey, typename TValue>
2017-01-04 15:12:31 +01:00
class ConcurrentMap
{
public:
2017-01-11 18:52:09 +01:00
ConcurrentMap()
{
2017-01-04 15:12:31 +01:00
mutex = new QMutex();
map = new QMap<TKey, TValue>();
}
2017-01-11 18:52:09 +01:00
bool
tryGet(const TKey &name, TValue &value) const
{
2017-01-04 15:12:31 +01:00
mutex->lock();
auto a = map->find(name);
if (a == map->end()) {
mutex->unlock();
value = NULL;
return false;
}
mutex->unlock();
value = a.value();
return true;
}
2017-01-11 18:52:09 +01:00
TValue
getOrAdd(const TKey &name, std::function<TValue()> addLambda)
{
2017-01-04 15:12:31 +01:00
mutex->lock();
auto a = map->find(name);
if (a == map->end()) {
TValue value = addLambda();
map->insert(name, value);
mutex->unlock();
return value;
}
mutex->unlock();
return a.value();
}
2017-01-11 18:52:09 +01:00
void
clear()
{
2017-01-04 15:12:31 +01:00
mutex->lock();
map->clear();
mutex->unlock();
}
2017-01-11 18:52:09 +01:00
void
insert(const TKey &name, const TValue &value)
{
2017-01-04 15:12:31 +01:00
mutex->lock();
map->insert(name, value);
mutex->unlock();
}
private:
2017-01-11 18:52:09 +01:00
QMutex *mutex;
QMap<TKey, TValue> *map;
2017-01-04 15:12:31 +01:00
};
2017-01-18 21:30:23 +01:00
}
2017-01-04 15:12:31 +01:00
2017-01-11 18:52:09 +01:00
#endif // CONCURRENTMAP_H