jaffarCommon
Loading...
Searching...
No Matches
concurrent.hpp
Go to the documentation of this file.
1#pragma once
2
8#include <atomic_queue/include/atomic_queue/atomic_queue.h>
9#include <deque>
10#include <mutex>
11#include <oneapi/tbb/concurrent_map.h>
12#include <phmap/parallel_hashmap/phmap.h>
13#include <stddef.h>
14
15namespace jaffarCommon
16{
17
18namespace concurrent
19{
20
24template <class T>
25using atomicQueue_t = atomic_queue::AtomicQueueB<T>;
26
30template <class V>
31using HashSet_t = phmap::parallel_flat_hash_set<V, phmap::priv::hash_default_hash<V>, phmap::priv::hash_default_eq<V>, std::allocator<V>, 4, std::mutex>;
32
36template <class K, class V>
37using HashMap_t = phmap::parallel_flat_hash_map<K, V, phmap::priv::hash_default_hash<K>, phmap::priv::hash_default_eq<K>, std::allocator<std::pair<const K, V>>, 4, std::mutex>;
38
42template <class K, class V, class C = std::greater<K>>
43using concurrentMultimap_t = oneapi::tbb::concurrent_multimap<K, V, C>;
44
50template <class T>
51class Deque
52{
53public:
54 Deque() = default;
55 ~Deque() = default;
56
61 __JAFFAR_COMMON__INLINE__ auto& getInternalStorage() { return _internalDeque; }
62
70 __JAFFAR_COMMON__INLINE__ void push_back_no_lock(T element) { _internalDeque.push_back(element); }
71
79 __JAFFAR_COMMON__INLINE__ void push_back(T element)
80 {
81 _mutex.lock();
82 _internalDeque.push_back(element);
83 _mutex.unlock();
84 }
85
93 __JAFFAR_COMMON__INLINE__ void push_front_no_lock(T element) { _internalDeque.push_front(element); }
94
102 __JAFFAR_COMMON__INLINE__ void push_front(T element)
103 {
104 _mutex.lock();
105 _internalDeque.push_front(element);
106 _mutex.unlock();
107 }
108
117 __JAFFAR_COMMON__INLINE__ T front() const { return _internalDeque.front(); }
118
127 __JAFFAR_COMMON__INLINE__ T back() const { return _internalDeque.back(); }
128
135 __JAFFAR_COMMON__INLINE__ void pop_front()
136 {
137 _mutex.lock();
138 _internalDeque.pop_front();
139 _mutex.unlock();
140 }
141
148 __JAFFAR_COMMON__INLINE__ void pop_back()
149 {
150 _mutex.lock();
151 _internalDeque.pop_back();
152 _mutex.unlock();
153 }
154
162 __JAFFAR_COMMON__INLINE__ bool pop_back_get(T& element)
163 {
164 _mutex.lock();
165
166 if (_internalDeque.empty())
167 {
168 _mutex.unlock();
169 return false;
170 }
171
172 element = _internalDeque.back();
173 _internalDeque.pop_back();
174
175 _mutex.unlock();
176 return true;
177 }
178
186 __JAFFAR_COMMON__INLINE__ bool pop_front_get(T& element)
187 {
188 _mutex.lock();
189
190 if (_internalDeque.empty())
191 {
192 _mutex.unlock();
193 return false;
194 }
195
196 element = _internalDeque.front();
197 _internalDeque.pop_front();
198
199 _mutex.unlock();
200 return true;
201 }
202
209 __JAFFAR_COMMON__INLINE__ size_t wasSize() const { return _internalDeque.size(); }
210
211private:
215 std::mutex _mutex;
216
220 std::deque<T> _internalDeque;
221};
222
223} // namespace concurrent
224
225} // namespace jaffarCommon
Definition concurrent.hpp:52
__JAFFAR_COMMON__INLINE__ void push_front(T element)
Definition concurrent.hpp:102
__JAFFAR_COMMON__INLINE__ void push_front_no_lock(T element)
Definition concurrent.hpp:93
__JAFFAR_COMMON__INLINE__ size_t wasSize() const
Definition concurrent.hpp:209
__JAFFAR_COMMON__INLINE__ bool pop_front_get(T &element)
Definition concurrent.hpp:186
__JAFFAR_COMMON__INLINE__ void push_back_no_lock(T element)
Definition concurrent.hpp:70
__JAFFAR_COMMON__INLINE__ void pop_front()
Definition concurrent.hpp:135
__JAFFAR_COMMON__INLINE__ T back() const
Definition concurrent.hpp:127
__JAFFAR_COMMON__INLINE__ void push_back(T element)
Definition concurrent.hpp:79
__JAFFAR_COMMON__INLINE__ void pop_back()
Definition concurrent.hpp:148
__JAFFAR_COMMON__INLINE__ bool pop_back_get(T &element)
Definition concurrent.hpp:162
__JAFFAR_COMMON__INLINE__ auto & getInternalStorage()
Definition concurrent.hpp:61
__JAFFAR_COMMON__INLINE__ T front() const
Definition concurrent.hpp:117
phmap::parallel_flat_hash_set< V, phmap::priv::hash_default_hash< V >, phmap::priv::hash_default_eq< V >, std::allocator< V >, 4, std::mutex > HashSet_t
Definition concurrent.hpp:31
atomic_queue::AtomicQueueB< T > atomicQueue_t
Definition concurrent.hpp:25
oneapi::tbb::concurrent_multimap< K, V, C > concurrentMultimap_t
Definition concurrent.hpp:43
phmap::parallel_flat_hash_map< K, V, phmap::priv::hash_default_hash< K >, phmap::priv::hash_default_eq< K >, std::allocator< std::pair< const K, V > >, 4, std::mutex > HashMap_t
Definition concurrent.hpp:37