Mercurial > dedupe
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
