diff ThreadSafeLookup.hpp @ 0:a3834af36579

Working with memory backend.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Mon, 20 Aug 2012 15:49:48 +0200
parents
children b5943e4bf676
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ThreadSafeLookup.hpp	Mon Aug 20 15:49:48 2012 +0200
@@ -0,0 +1,65 @@
+#ifndef THREADSAFELOOKUP_HPP
+#define THREADSAFELOOKUP_HPP
+
+#include <QtCore/QMap>
+
+#include <QtCore/QMutex>
+
+#include <boost/optional.hpp>
+
+struct Nothing {
+  Nothing() {}
+  Nothing(const Nothing&) {}
+  Nothing(const Nothing*) {}
+};
+
+template <bool Locks>
+struct Locking {
+  typedef QMutex Lock_t;
+  typedef QMutexLocker Locker_t;
+};
+
+template <>
+struct Locking<false> {
+  typedef Nothing Lock_t;
+  typedef Nothing Locker_t;
+};
+
+template <typename Key_t, typename Value_t, bool isLocking = true>
+class ThreadSafeLookup {
+
+private:
+  typedef QHash<Key_t, Value_t> map_t;
+  map_t map;
+
+  typename Locking<isLocking>::Lock_t masterLock;
+public:
+
+  boost::optional<Value_t> value(const Key_t& key)
+  {
+    boost::optional<Value_t> retVal;
+    typename Locking<isLocking>::Locker_t lock(&masterLock);
+    typename map_t::const_iterator c = map.find(key);
+    if (c != map.end()) {
+      retVal = c.value();
+    }
+    return retVal;
+  }
+
+  bool insert(const Key_t& key, const Value_t& value, bool forceInsert = false)
+  {
+    typename Locking<isLocking>::Locker_t lock(&masterLock);
+    typename map_t::iterator c = map.find(key);
+    bool exists = (c != map.end());
+    
+    if (exists) {
+      c.value() = value;
+    }
+    else {
+      map.insert(key, value);
+    }
+    return exists;
+  }
+};
+
+#endif //THREADSAFELOOKUP_HPP