ATLAS Offline Software
Loading...
Searching...
No Matches
ConcurrentStrMap.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_CONCURRENTSTRMAP_H
14#define CXXUTILS_CONCURRENTSTRMAP_H
15
16
18#include "CxxUtils/UIntConv.h"
19#include "CxxUtils/IsUpdater.h"
21#include "boost/iterator/iterator_facade.hpp"
22#include <type_traits>
23#include <stdexcept>
24
25
26namespace CxxUtils {
27
28
73template <class VALUE, template <class> class UPDATER>
77{
78private:
80 struct Hasher;
81 struct Matcher;
85
86
87public:
89 using key_type = std::string;
91 using size_type = size_t;
93 using Updater_t = typename Impl_t::Updater_t;
95 using Context_t = typename Updater_t::Context_t;
97 using Lock_t = typename Impl_t::Lock_t;
98
100 static_assert( sizeof(typename Impl_t::val_t) >= sizeof(mapped_type) );
101
102
112 size_type capacity = 64,
113 const Context_t& ctx = Updater_t::defaultContext());
114
127 size_t capacity = 64,
128 const Context_t& ctx = Updater_t::defaultContext());
129
130
143 template <class InputIterator>
144 ConcurrentStrMap (InputIterator f,
145 InputIterator l,
147 size_type capacity = 64,
148 const Context_t& ctx = Updater_t::defaultContext());
149
150
152 ConcurrentStrMap (const ConcurrentStrMap& other) = delete;
154 ConcurrentStrMap& operator= (const ConcurrentStrMap& other) = delete;
155 ConcurrentStrMap& operator= (ConcurrentStrMap&& other) = delete;
156
157
162
163
168
169
173 bool empty() const;
174
175
179 size_t capacity() const;
180
181
194 using const_iterator_value = std::pair<const key_type&, mapped_type>;
195
196
207 : public boost::iterator_facade<const_iterator,
208 const const_iterator_value,
209 std::bidirectional_iterator_tag,
210 const const_iterator_value>
211 {
212 public:
217 const_iterator (typename Impl_t::const_iterator it);
218
219
225 bool valid() const;
226
227
228 private:
230 friend class boost::iterator_core_access;
231
232
236 void increment();
237
238
242 void decrement();
243
244
248 bool equal (const const_iterator& other) const;
249
250
255
256
258 typename Impl_t::const_iterator m_impl;
259 };
260
261
264
265
270
271
275 const_iterator begin() const;
276
277
281 const_iterator end() const;
282
283
287 const_iterator cbegin() const;
288
289
293 const_iterator cend() const;
294
295
300 bool contains (const key_type& key) const;
301
302
309 size_type count (const key_type& key) const;
310
311
318 const_iterator find (const key_type& key) const;
319
320
328 mapped_type at (const std::string& key) const;
329
330
338 std::pair<const_iterator, const_iterator>
339 equal_range (const key_type& key) const;
340
341
351
352
364 std::pair<const_iterator, bool>
365 emplace (const key_type& key, mapped_type val,
366 const Context_t& ctx = Updater_t::defaultContext());
367
368
381 std::pair<const_iterator, bool>
383 const key_type& key, mapped_type val,
384 const Context_t& ctx = Updater_t::defaultContext());
385
386
398 std::pair<const_iterator, bool>
400 const Context_t& ctx = Updater_t::defaultContext());
401
402
415 std::pair<const_iterator, bool>
417 key_type&& key, mapped_type val,
418 const Context_t& ctx = Updater_t::defaultContext());
419
420
432 std::pair<const_iterator, bool>
434 const Context_t& ctx = Updater_t::defaultContext());
435
436
450 std::pair<const_iterator, bool>
452 const key_type& key, mapped_type val,
453 const Context_t& ctx = Updater_t::defaultContext());
454
455
467 std::pair<const_iterator, bool>
469 const Context_t& ctx = Updater_t::defaultContext());
470
471
485 std::pair<const_iterator, bool>
487 key_type&& key, mapped_type val,
488 const Context_t& ctx = Updater_t::defaultContext());
489
490
505 template <class PAIR>
506 std::pair<const_iterator, bool> insert (const PAIR& p,
507 const Context_t& ctx = Updater_t::defaultContext());
508
509
522 template <class PAIR>
523 std::pair<const_iterator, bool> insert (PAIR&& p,
524 const Context_t& ctx = Updater_t::defaultContext());
525
526
536 template <class InputIterator>
537 void insert (InputIterator first, InputIterator last,
538 const Context_t& ctx = Updater_t::defaultContext());
539
540
550 const Context_t& ctx = Updater_t::defaultContext());
551
552
561
562
568 void quiescent (const Context_t& ctx);
569
570
581 void swap (ConcurrentStrMap& other);
582
583
588
589
590private:
595 static const std::string* keyAsString (val_t val);
596
597
602 static val_t keyAsVal (const std::string* s);
603
604
610
611
617
618
626 typename Impl_t::const_iterator get (const key_type& key) const;
627
628
640 std::pair<const_iterator, bool>
641 put (std::unique_ptr<key_type> key,
642 mapped_type val,
643 bool overwrite = true,
644 const Context_t& ctx = Updater_t::defaultContext());
645
646
658 std::pair<const_iterator, bool>
659 put (const Lock_t& lock,
660 std::unique_ptr<key_type> key,
661 mapped_type val,
662 bool overwrite = true,
663 const Context_t& ctx = Updater_t::defaultContext());
664
665
672 struct Hasher
673 {
675 size_t operator() (const val_t p) const;
677 size_t operator() (const std::string& s) const;
679 std::hash<std::string> m_hash;
680 };
681
682
686 struct Matcher
687 {
689 bool operator() (const val_t a, const val_t b) const;
690 };
691
692
695};
696
697
698} // namespace CxxUtils
699
700
702
703
704#endif // not CXXUTILS_CONCURRENTSTRMAP_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.
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.
Impl_t::const_iterator m_impl
The iterator on the underlying table.
bool valid() const
Test if this iterator is valid.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
void decrement()
iterator_facade requirement: Decrement the iterator.
static const std::string * keyAsString(val_t val)
Convert an underlying key value to a string pointer.
const_iterator cend() const
Iterator at the end of the map.
std::pair< const key_type &, mapped_type > const_iterator_value
std::pair< const_iterator, bool > put(const Lock_t &lock, std::unique_ptr< key_type > key, mapped_type val, bool overwrite=true, const Context_t &ctx=Updater_t::defaultContext())
Insert / overwrite an entry in the table, with external locking.
ConcurrentStrMap(const ConcurrentStrMap &other)=delete
Copy / move / assign not supported.
const_iterator find(const key_type &key) const
Look up an element in the map.
bool contains(const key_type &key) const
Test if a key is in the container.
size_type size() const
Return the number of items currently in the map.
std::pair< const_iterator, const_iterator > equal_range(const key_type &key) const
Return a range of iterators with entries matching key.
bool empty() const
Test if the map is currently empty.
~ConcurrentStrMap()
Destructor.
const_iterator cbegin() const
Iterator at the start of the map.
static mapped_type mappedAsMapped(val_t val)
Convert an underlying mapped value to this type's mapped value.
void reserve(size_type capacity, const Context_t &ctx=Updater_t::defaultContext())
Increase the table capacity.
Lock_t lock()
Take a lock on the container.
ConcurrentStrMap(Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Ensure that the underlying map can store our mapped_type.
std::pair< const_iterator, bool > insert(PAIR &&p, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
void quiescent(const Context_t &ctx)
Called when this thread is no longer referencing anything from this container.
std::pair< const_iterator, bool > emplace(const key_type &key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
std::pair< const_iterator, bool > insert_or_assign(const key_type &key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map, or overwrite an existing one.
CxxUtils::iterator_range< const_iterator > const_iterator_range
static val_t keyAsVal(const std::string *s)
Convert a string pointer to an underlying key value.
std::pair< const_iterator, bool > insert_or_assign(const Lock_t &lock, const key_type &key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map, or overwrite an existing one, with external locking.
std::pair< const_iterator, bool > emplace(const Lock_t &lock, const key_type &key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map, with external locking.
const_iterator end() const
Iterator at the end of the map.
const_iterator_range range() const
Return an iterator range covering the entire map.
size_type count(const key_type &key) const
Return the number of times a given key is in the container.
void rehash(size_type capacity)
Increase the table capacity.
typename detail::ConcurrentHashmapImpl< CxxUtils::SimpleUpdater, Hasher, Matcher > Impl_t
static val_t mappedAsVal(mapped_type val)
Convert this type's mapped value to an underlying mapped value.
ConcurrentStrMap(const ConcurrentStrMap &other, Updater_t &&updater, size_t capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Constructor from another map.
std::pair< const_iterator, bool > put(std::unique_ptr< key_type > key, mapped_type val, bool overwrite=true, const Context_t &ctx=Updater_t::defaultContext())
Insert / overwrite an entry in the table.
void insert(InputIterator first, InputIterator last, const Context_t &ctx=Updater_t::defaultContext())
Insert a range of elements to the map.
mapped_type at(const std::string &key) const
Look up an element in the map.
std::pair< const_iterator, bool > emplace(const Lock_t &lock, key_type &&key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map, with external locking.
std::pair< const_iterator, bool > insert_or_assign(key_type &&key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map, or overwrite an existing one.
void swap(ConcurrentStrMap &other)
Swap this container with another.
std::pair< const_iterator, bool > insert(const PAIR &p, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
std::pair< const_iterator, bool > emplace(key_type &&key, mapped_type val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
ConcurrentStrMap(InputIterator f, InputIterator l, Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Constructor from a range.
ConcurrentStrMap(ConcurrentStrMap &&other)=delete
const_iterator begin() const
Iterator at the start of the map.
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())
Add an element to the map, or overwrite an existing one, with external locking.
Impl_t::const_iterator get(const key_type &key) const
Do a lookup in the table.
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
#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.
std::hash< std::string > m_hash
Hash functional.
Matching functional for keys.