comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:a3834af36579
1 #ifndef THREADSAFELOOKUP_HPP
2 #define THREADSAFELOOKUP_HPP
3
4 #include <QtCore/QMap>
5
6 #include <QtCore/QMutex>
7
8 #include <boost/optional.hpp>
9
10 struct Nothing {
11 Nothing() {}
12 Nothing(const Nothing&) {}
13 Nothing(const Nothing*) {}
14 };
15
16 template <bool Locks>
17 struct Locking {
18 typedef QMutex Lock_t;
19 typedef QMutexLocker Locker_t;
20 };
21
22 template <>
23 struct Locking<false> {
24 typedef Nothing Lock_t;
25 typedef Nothing Locker_t;
26 };
27
28 template <typename Key_t, typename Value_t, bool isLocking = true>
29 class ThreadSafeLookup {
30
31 private:
32 typedef QHash<Key_t, Value_t> map_t;
33 map_t map;
34
35 typename Locking<isLocking>::Lock_t masterLock;
36 public:
37
38 boost::optional<Value_t> value(const Key_t& key)
39 {
40 boost::optional<Value_t> retVal;
41 typename Locking<isLocking>::Locker_t lock(&masterLock);
42 typename map_t::const_iterator c = map.find(key);
43 if (c != map.end()) {
44 retVal = c.value();
45 }
46 return retVal;
47 }
48
49 bool insert(const Key_t& key, const Value_t& value, bool forceInsert = false)
50 {
51 typename Locking<isLocking>::Locker_t lock(&masterLock);
52 typename map_t::iterator c = map.find(key);
53 bool exists = (c != map.end());
54
55 if (exists) {
56 c.value() = value;
57 }
58 else {
59 map.insert(key, value);
60 }
61 return exists;
62 }
63 };
64
65 #endif //THREADSAFELOOKUP_HPP