ATLAS Offline Software
Loading...
Searching...
No Matches
ConcurrentStrToValMap.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 */
12
13
14#ifndef CXXUTILS_CONCURRENTSTRTOVALMAP_H
15#define CXXUTILS_CONCURRENTSTRTOVALMAP_H
16
17
19#include "CxxUtils/UIntConv.h"
20#include "CxxUtils/IsUpdater.h"
22#include "boost/iterator/iterator_facade.hpp"
23#include <memory>
24#include <type_traits>
25#include <stdexcept>
26
27
28namespace CxxUtils {
29
30
83template <class VALUE, template <class> class UPDATER>
86{
87private:
89 struct Hasher;
90 struct Matcher;
94
95
96public:
98 using key_type = std::string;
100 using size_type = size_t;
102 using Updater_t = typename Impl_t::Updater_t;
104 using Context_t = typename Updater_t::Context_t;
105
106
116 size_type capacity = 64,
117 const Context_t& ctx = Updater_t::defaultContext());
118
119
132 size_t capacity = 64,
133 const Context_t& ctx = Updater_t::defaultContext());
134
135
148 template <class InputIterator>
149 ConcurrentStrToValMap (InputIterator f,
150 InputIterator l,
152 size_type capacity = 64,
153 const Context_t& ctx = Updater_t::defaultContext());
154
155
159 ConcurrentStrToValMap& operator= (const ConcurrentStrToValMap& other) = delete;
160 ConcurrentStrToValMap& operator= (ConcurrentStrToValMap&& other) = delete;
161
162
167
168
173
174
178 bool empty() const;
179
180
184 size_t capacity() const;
185
186
199 using const_iterator_value = std::pair<const key_type&, const mapped_type&>;
200 using iterator_value = std::pair<const key_type, mapped_type&>;
201
202 class const_iterator;
203 class iterator;
204
205
216 : public boost::iterator_facade<const_iterator,
217 const const_iterator_value,
218 std::bidirectional_iterator_tag,
219 const const_iterator_value>
220 {
221 public:
226 const_iterator (typename Impl_t::const_iterator it);
227
228
233 const_iterator (const iterator& other);
234
235
241 bool valid() const;
242
243
244 private:
246 friend class boost::iterator_core_access;
247 friend class iterator;
248
249
253 void increment();
254
255
259 void decrement();
260
261
265 bool equal (const const_iterator& other) const;
266
267
271 bool equal (const iterator& other) const;
272
273
278
279
281 typename Impl_t::const_iterator m_impl;
282 };
283
284
299 : public boost::iterator_facade<iterator,
300 const iterator_value,
301 std::bidirectional_iterator_tag,
302 const iterator_value>
303 {
304 public:
309 iterator (typename Impl_t::const_iterator it);
310
311
317 bool valid() const;
318
319
320 private:
322 friend class boost::iterator_core_access;
323 friend class const_iterator;
324
325
329 void increment();
330
331
335 void decrement();
336
337
341 bool equal (const iterator& other) const;
342
343
347 bool equal (const const_iterator& other) const;
348
349
354
355
357 typename Impl_t::const_iterator m_impl;
358 };
359
360
364
365
370
371
379
380
384 const_iterator begin() const;
385
386
390 const_iterator end() const;
391
392
399 iterator begin();
400
401
408 iterator end();
409
410
414 const_iterator cbegin() const;
415
416
420 const_iterator cend() const;
421
422
427 bool contains (const key_type& key) const;
428
429
436 size_type count (const key_type& key) const;
437
438
445 const_iterator find (const key_type& key) const;
446
447
457 iterator find (const key_type& key);
458
459
467 const mapped_type& at (const key_type& key) const;
468
469
481 mapped_type& at (const key_type& key);
482
483
491 std::pair<const_iterator, const_iterator>
492 equal_range (const key_type& key) const;
493
494
505 std::pair<iterator, iterator>
506 equal_range (const key_type& key);
507
508
520 std::pair<const_iterator, bool>
521 emplace (const key_type& key, const mapped_type& val,
522 const Context_t& ctx = Updater_t::defaultContext());
523
524
536 std::pair<const_iterator, bool>
537 emplace (key_type&& key, const mapped_type& val,
538 const Context_t& ctx = Updater_t::defaultContext());
539
540
552 std::pair<const_iterator, bool>
553 emplace (const key_type& key, mapped_type&& val,
554 const Context_t& ctx = Updater_t::defaultContext());
555
556
568 std::pair<const_iterator, bool>
570 const Context_t& ctx = Updater_t::defaultContext());
571
572
584 std::pair<const_iterator, bool>
585 emplace (const key_type& key, std::unique_ptr<mapped_type> val,
586 const Context_t& ctx = Updater_t::defaultContext());
587
588
600 std::pair<const_iterator, bool>
601 emplace (key_type&& key, std::unique_ptr<mapped_type> val,
602 const Context_t& ctx = Updater_t::defaultContext());
603
604
617 template <class PAIR>
618 std::pair<const_iterator, bool> insert (const PAIR& p,
619 const Context_t& ctx = Updater_t::defaultContext());
620
621
634 template <class PAIR>
635 std::pair<const_iterator, bool> insert (PAIR&& p,
636 const Context_t& ctx = Updater_t::defaultContext());
637
638
648 template <class InputIterator>
649 void insert (InputIterator first, InputIterator last,
650 const Context_t& ctx = Updater_t::defaultContext());
651
652
662 const Context_t& ctx = Updater_t::defaultContext());
663
664
673
674
680 void quiescent (const Context_t& ctx);
681
682
694
695
700
701
702private:
707 static const std::string* keyAsString (val_t val);
708
709
714 static val_t keyAsVal (const std::string* s);
715
716
723
724
730
731
739 typename Impl_t::const_iterator get (const key_type& key) const;
740
741
752 std::pair<const_iterator, bool>
753 put (std::unique_ptr<key_type> key,
754 std::unique_ptr<mapped_type> val,
755 const Context_t& ctx = Updater_t::defaultContext());
756
757
764 struct Hasher
765 {
767 size_t operator() (const val_t p) const;
769 size_t operator() (const std::string& s) const;
771 std::hash<std::string> m_hash;
772 };
773
774
778 struct Matcher
779 {
781 bool operator() (const val_t a, const val_t b) const;
782 };
783
784
787};
788
789
790} // namespace CxxUtils
791
792
794
795
796#endif // not CXXUTILS_CONCURRENTSTRTOVALMAP_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(const iterator &other)
Conversion from non-const iterator (for interoperability).
void increment()
iterator_facade requirement: Increment the iterator.
Impl_t::const_iterator m_impl
The iterator on the underlying table.
bool equal(const iterator &other) const
iterator_facade requirement: Equality test.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
void decrement()
iterator_facade requirement: Decrement the iterator.
const_iterator(typename Impl_t::const_iterator it)
Constructor.
bool valid() const
Test if this iterator is valid.
const const_iterator_value dereference() const
iterator_facade requirement: Dereference the iterator.
void decrement()
iterator_facade requirement: Decrement the iterator.
bool equal(const iterator &other) const
iterator_facade requirement: Equality test.
const iterator_value dereference() const
iterator_facade requirement: Dereference the iterator.
void increment()
iterator_facade requirement: Increment the iterator.
iterator(typename Impl_t::const_iterator it)
Constructor.
bool valid() const
Test if this iterator is valid.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
Impl_t::const_iterator m_impl
The iterator on the underlying table.
iterator begin()
Iterator at the start of the map.
bool empty() const
Test if the map is currently empty.
ConcurrentStrToValMap(const ConcurrentStrToValMap &other, Updater_t &&updater, size_t capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Constructor from another map.
void rehash(size_type capacity)
Increase the table capacity.
ConcurrentStrToValMap(const ConcurrentStrToValMap &other)=delete
Copy / move / assign not supported.
mapped_type & at(const key_type &key)
Look up an element 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.
const_iterator end() const
Iterator at the end of the map.
std::pair< const_iterator, bool > emplace(const key_type &key, const mapped_type &val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
const_iterator_range range() const
Return an iterator range covering the entire map.
std::pair< const_iterator, bool > insert(PAIR &&p, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
ConcurrentStrToValMap(Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Constructor.
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.
ConcurrentStrToValMap(InputIterator f, InputIterator l, Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Constructor from a range.
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.
std::pair< const_iterator, bool > emplace(const key_type &key, std::unique_ptr< mapped_type > val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
const_iterator cend() const
Iterator at the end of the map.
size_type count(const key_type &key) const
Return the number of times a given key is in the container.
static val_t keyAsVal(const std::string *s)
Convert a string pointer to an underlying key value.
const_iterator find(const key_type &key) const
Look up an element in the map.
iterator end()
Iterator at the end of the map.
void quiescent(const Context_t &ctx)
Called when this thread is no longer referencing anything from this container.
void swap(ConcurrentStrToValMap &other)
Swap this container with another.
const_iterator begin() const
Iterator at the start of the map.
std::pair< const_iterator, bool > emplace(key_type &&key, const mapped_type &val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
static mapped_type * mappedAsMapped(val_t val)
Convert an underlying mapped value a pointer to this type's mapped value.
static val_t mappedAsVal(mapped_type *val)
Convert this type's mapped value to an underlying mapped value.
bool contains(const key_type &key) const
Test if a key is in the container.
std::pair< const_iterator, bool > emplace(key_type &&key, std::unique_ptr< mapped_type > val, const Context_t &ctx=Updater_t::defaultContext())
Add an element to the map.
static const std::string * keyAsString(val_t val)
Convert an underlying key value to a string pointer.
Impl_t::const_iterator get(const key_type &key) const
Do a lookup in the table.
const mapped_type & at(const key_type &key) const
Look up an element in the map.
size_type size() const
Return the number of items currently in the map.
void insert(InputIterator first, InputIterator last, const Context_t &ctx=Updater_t::defaultContext())
Insert a range of elements to the map.
void reserve(size_type capacity, const Context_t &ctx=Updater_t::defaultContext())
Increase the table capacity.
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 > put(std::unique_ptr< key_type > key, std::unique_ptr< mapped_type > val, const Context_t &ctx=Updater_t::defaultContext())
Insert an entry in the table.
iterator_range range()
Return an iterator range covering the entire map.
std::pair< iterator, iterator > equal_range(const key_type &key)
Return a range of iterators with entries matching key.
iterator find(const key_type &key)
Look up an element in the map.
ConcurrentStrToValMap(ConcurrentStrToValMap &&other)=delete
const_iterator cbegin() const
Iterator at the start of the map.
Hash table allowing concurrent, lockless reads.
Simple range from a pair of iterators.
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.