#ifndef CONCURRENTMAP_H #define CONCURRENTMAP_H #include #include #include namespace chatterino { template class ConcurrentMap { public: ConcurrentMap() { mutex = new QMutex(); map = new QMap(); } bool tryGet(const TKey &name, TValue &value) const { mutex->lock(); auto a = map->find(name); if (a == map->end()) { mutex->unlock(); value = NULL; return false; } mutex->unlock(); value = a.value(); return true; } TValue getOrAdd(const TKey &name, std::function addLambda) { 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(); } void clear() { mutex->lock(); map->clear(); mutex->unlock(); } void insert(const TKey &name, const TValue &value) { mutex->lock(); map->insert(name, value); mutex->unlock(); } private: QMutex *mutex; QMap *map; }; } #endif // CONCURRENTMAP_H