ATLAS Offline Software
Loading...
Searching...
No Matches
ConcurrentMap.h
Go to the documentation of this file.
1// This file's extension implies that it's C, but it's really -*- C++ -*-.
2/*
3 * Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration.
4 */
11
12
13#ifndef CXXUTILS_CONCURRENTMAP_H
14#define CXXUTILS_CONCURRENTMAP_H
15
16
18#include "CxxUtils/UIntConv.h"
19#include "CxxUtils/concepts.h"
20#include "CxxUtils/IsUpdater.h"
22#include "boost/iterator/iterator_facade.hpp"
23#include <type_traits>
24#include <stdexcept>
25
26
27namespace CxxUtils {
28
29
89template <class KEY, class VALUE, template <class> class UPDATER,
90 class HASHER = std::hash<KEY>,
91 class MATCHER = std::equal_to<KEY>,
93 detail::ConcurrentHashmapVal_t TOMBSTONE = NULLVAL>
100{
101private:
104
105 // Translate between the Hasher/Matcher provided (which take KEY arguments)
106 // and what we need to give to the underlying implementation
107 // (which takes a uintptr_t).
108 struct Hasher
109 {
110 size_t operator() (val_t k) const {
111 return m_h (keyAsKey (k));
112 }
113 HASHER m_h;
114 };
115 struct Matcher
116 {
117 bool operator() (val_t a, val_t b) const {
118 return m_m (keyAsKey (a), keyAsKey (b));
119 }
120 MATCHER m_m;
121 };
122
124 using Impl_t = typename detail::ConcurrentHashmapImpl<UPDATER,
125 Hasher,
126 Matcher,
127 NULLVAL,
128 TOMBSTONE>;
129
130
131public:
133 using key_type = KEY;
135 using size_type = size_t;
137 using Updater_t = typename Impl_t::Updater_t;
139 using Context_t = typename Updater_t::Context_t;
141 using Lock_t = typename Impl_t::Lock_t;
142
144 static_assert( sizeof(typename Impl_t::val_t) >= sizeof(key_type) );
145 static_assert( sizeof(typename Impl_t::val_t) >= sizeof(mapped_type) );
146
147
157 size_type capacity = 64,
158 const Context_t& ctx = Updater_t::defaultContext());
159
172 size_t capacity = 64,
173 const Context_t& ctx = Updater_t::defaultContext());
174
175
188 template <class InputIterator>
189 ConcurrentMap (InputIterator f,
190 InputIterator l,
192 size_type capacity = 64,
193 const Context_t& ctx = Updater_t::defaultContext());
194
195
197 ConcurrentMap (const ConcurrentMap& other) = delete;
198 ConcurrentMap (ConcurrentMap&& other) = delete;
199 ConcurrentMap& operator= (const ConcurrentMap& other) = delete;
200 ConcurrentMap& operator= (ConcurrentMap&& other) = delete;
201
202
206 ~ConcurrentMap() = default;
207
208
213
214
218 bool empty() const;
219
220
224 size_t capacity() const;
225
226
230 size_t erased() const;
231
232
236 using const_iterator_value = std::pair<const key_type, mapped_type>;
237
238
249 : public boost::iterator_facade<const_iterator,
250 const const_iterator_value,
251 std::bidirectional_iterator_tag,
252 const const_iterator_value>
253 {
254 public:
259 const_iterator (typename Impl_t::const_iterator it);
260
261
267 bool valid() const;
268
269
270 private:
272 friend class boost::iterator_core_access;
273
274
278 void increment();
279
280
284 void decrement();
285
286
290 bool equal (const const_iterator& other) const;
291
292
297
298
300 typename Impl_t::const_iterator m_impl;
301 };
302
303
306
307
312
313
317 const_iterator begin() const;
318
319
323 const_iterator end() const;
324
325
329 const_iterator cbegin() const;
330
331
335 const_iterator cend() const;
336
337
342 bool contains (key_type key) const;
343
344
352
353
360 const_iterator find (key_type key) const;
361
362
371
372
380 std::pair<const_iterator, const_iterator>
382
383
393
394
406 std::pair<const_iterator, bool>
408 const Context_t& ctx = Updater_t::defaultContext());
409
410
423 std::pair<const_iterator, bool>
425 key_type key, mapped_type val,
426 const Context_t& ctx = Updater_t::defaultContext());
427
428
440 std::pair<const_iterator, bool>
442 const Context_t& ctx = Updater_t::defaultContext());
443
444
458 std::pair<const_iterator, bool>
460 key_type key, mapped_type val,
461 const Context_t& ctx = Updater_t::defaultContext());
462
463
477 template <class PAIR>
478 std::pair<const_iterator, bool> insert (const PAIR& p);
479
480
489 template <class InputIterator>
490 void insert (InputIterator first, InputIterator last);
491
492
505 bool erase (key_type key);
506
507
521 bool erase (const Lock_t& lock, key_type key);
522
523
533 const Context_t& ctx = Updater_t::defaultContext());
534
535
544
545
551 void clear (size_t capacity,
552 const Context_t& ctx = Updater_t::defaultContext());
553
554
559 void clear (const Context_t& ctx = Updater_t::defaultContext());
560
561
571
572
578 void quiescent (const Context_t& ctx);
579
580
592 void swap (ConcurrentMap& other);
593
594
599
600
601private:
606 static key_type keyAsKey (val_t val);
607
608
614
615
621
622
628
629
637 typename Impl_t::const_iterator get (key_type key) const;
638
639
651 std::pair<const_iterator, bool>
653 mapped_type val,
654 bool overwrite = true,
655 const Context_t& ctx = Updater_t::defaultContext());
656
657
670 std::pair<const_iterator, bool>
671 put (const Lock_t& lock,
672 key_type key,
673 mapped_type val,
674 bool overwrite = true,
675 const Context_t& ctx = Updater_t::defaultContext());
676
677
680};
681
682
683} // namespace CxxUtils
684
685
687
688
689#endif // not CXXUTILS_CONCURRENTMAP_H
Hash table allowing concurrent, lockless reads.
Concept check for Updater class used by concurrent classes.
static Double_t a
Helpers for converting between uintptr_t and a pointer or integer.
bool valid() const
Test if this iterator is valid.
const_iterator(typename Impl_t::const_iterator it)
Constructor.
void increment()
iterator_facade requirement: Increment the iterator.
const const_iterator_value dereference() const
iterator_facade requirement: Dereference the iterator.
void decrement()
iterator_facade requirement: Decrement the iterator.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
Impl_t::const_iterator m_impl
The iterator on the underlying table.
std::pair< const_iterator, bool > insert_or_assign(const Lock_t &lock, key_type key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
void reserve(size_type capacity, const Context_t &ctx=Updater_t::defaultContext())
ConcurrentMap(InputIterator f, InputIterator l, Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
typename detail::ConcurrentHashmapImpl< UPDATER, Hasher, Matcher, NULLVAL, TOMBSTONE > Impl_t
The underlying uint->uint hash table.
std::pair< const key_type, mapped_type > const_iterator_value
Value structure for iterators.
static key_type keyAsKey(val_t val)
Convert an underlying key value to this type's key value.
std::pair< const_iterator, bool > put(const Lock_t &lock, key_type key, mapped_type val, bool overwrite=true, const Context_t &ctx=Updater_t::defaultContext())
std::pair< const_iterator, bool > emplace(key_type key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
typename Impl_t::Updater_t Updater_t
Updater object.
void clear(size_t capacity, const Context_t &ctx=Updater_t::defaultContext())
ConcurrentMap(Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Ensure that the underlying map can store our types.
CxxUtils::detail::ConcurrentHashmapVal_t val_t
Representation type in the underlying map.
std::pair< const_iterator, bool > insert_or_assign(key_type key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
ConcurrentMap(const ConcurrentMap &other, Updater_t &&updater, size_t capacity=64, const Context_t &ctx=Updater_t::defaultContext())
std::pair< const_iterator, bool > put(key_type key, mapped_type val, bool overwrite=true, const Context_t &ctx=Updater_t::defaultContext())
KEY key_type
Standard STL types.
CxxUtils::iterator_range< const_iterator > const_iterator_range
A range defined by two iterators.
typename Impl_t::Lock_t Lock_t
Type for external locking.
std::pair< const_iterator, bool > emplace(const Lock_t &lock, key_type key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
typename Updater_t::Context_t Context_t
Context type.
Hash table allowing concurrent, lockless reads.
Simple range from a pair of iterators.
Concept for a value that can be saved in a concurrent hash map.
Concept check for Updater class used by concurrent classes.
Definition IsUpdater.h:51
A couple standard-library related concepts.
#define VALUE(TESTED)
Definition expect.h:59
Simple range from a pair of iterators.
uintptr_t ConcurrentHashmapVal_t
Type used for keys and values — an unsigned big enough to hold a pointer.