00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __CORE_UTILS_LOCK_HASHSET_H_
00025 #define __CORE_UTILS_LOCK_HASHSET_H_
00026
00027 #include <core/threading/mutex.h>
00028 #include <core/utils/refptr.h>
00029
00030 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
00031 # include <tr1/unordered_set>
00032 #else
00033 # include <ext/hash_set>
00034 #endif
00035
00036 namespace fawkes {
00037
00038
00039 template <class KeyType,
00040 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
00041 class HashFunction = std::tr1::hash<KeyType>,
00042 class EqualKey = std::equal_to<KeyType> >
00043 class LockHashSet : public std::tr1::unordered_set<KeyType, HashFunction, EqualKey>
00044 #else
00045 class HashFunction = __gnu_cxx::hash<KeyType>,
00046 class EqualKey = std::equal_to<KeyType> >
00047 class LockHashSet : public __gnu_cxx::hash_set<KeyType, HashFunction, EqualKey>
00048 #endif
00049 {
00050 public:
00051 LockHashSet();
00052 LockHashSet(const LockHashSet<KeyType, HashFunction, EqualKey> &lh);
00053 virtual ~LockHashSet();
00054
00055 void lock();
00056 bool try_lock();
00057 void unlock();
00058 RefPtr<Mutex> mutex() const;
00059
00060 void insert_locked(const KeyType& x);
00061
00062 private:
00063 RefPtr<Mutex> __mutex;
00064
00065 };
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 template <class KeyType, class HashFunction, class EqualKey>
00081 LockHashSet<KeyType, HashFunction, EqualKey>::LockHashSet()
00082 : __mutex(new Mutex())
00083 {}
00084
00085
00086
00087
00088
00089 template <class KeyType, class HashFunction, class EqualKey>
00090 LockHashSet<KeyType, HashFunction, EqualKey>::LockHashSet(const LockHashSet<KeyType, HashFunction, EqualKey> &lh)
00091 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
00092 : std::tr1::unordered_set<KeyType, HashFunction, EqualKey>::unordered_set(lh),
00093 #else
00094 : __gnu_cxx::hash_set<KeyType, HashFunction, EqualKey>::hash_set(lh),
00095 #endif
00096 __mutex(new Mutex())
00097 {}
00098
00099
00100
00101 template <class KeyType, class HashFunction, class EqualKey>
00102 LockHashSet<KeyType, HashFunction, EqualKey>::~LockHashSet()
00103 {}
00104
00105
00106
00107 template <class KeyType, class HashFunction, class EqualKey>
00108 void
00109 LockHashSet<KeyType, HashFunction, EqualKey>::lock()
00110 {
00111 __mutex->lock();
00112 }
00113
00114
00115
00116
00117
00118 template <class KeyType, class HashFunction, class EqualKey>
00119 bool
00120 LockHashSet<KeyType, HashFunction, EqualKey>::try_lock()
00121 {
00122 return __mutex->try_lock();
00123 }
00124
00125
00126
00127 template <class KeyType, class HashFunction, class EqualKey>
00128 void
00129 LockHashSet<KeyType, HashFunction, EqualKey>::unlock()
00130 {
00131 return __mutex->unlock();
00132 }
00133
00134
00135
00136
00137
00138 template <class KeyType, class HashFunction, class EqualKey>
00139 void
00140 LockHashSet<KeyType, HashFunction, EqualKey>::insert_locked(const KeyType& x)
00141 {
00142 __mutex->lock();
00143 insert(x);
00144 __mutex->unlock();
00145 }
00146
00147
00148
00149
00150
00151
00152 template <typename KeyType, class HashFunction, class EqualKey>
00153 RefPtr<Mutex>
00154 LockHashSet<KeyType, HashFunction, EqualKey>::mutex() const
00155 {
00156 return __mutex;
00157 }
00158
00159 }
00160
00161 #endif