14#ifndef CXXUTILS_CONCURRENTTOVALMAP_H
15#define CXXUTILS_CONCURRENTTOVALMAP_H
23#include "boost/iterator/iterator_facade.hpp"
94template <
class KEY,
class VALUE,
template <
class>
class UPDATER,
95 class HASHER = std::hash<KEY>,
96 class MATCHER = std::equal_to<KEY>,
114 return m_h (keyAsKey (k));
121 return m_m (keyAsKey (
a), keyAsKey (b));
135 using key_type = KEY;
136 using mapped_type =
VALUE;
137 using size_type = size_t;
139 using Updater_t =
typename Impl_t::Updater_t;
141 using Context_t =
typename Updater_t::Context_t;
154 const Context_t& ctx = Updater_t::defaultContext());
170 const Context_t& ctx = Updater_t::defaultContext());
185 template <
class InputIterator>
190 const Context_t& ctx = Updater_t::defaultContext());
209 size_type
size()
const;
253 :
public boost::iterator_facade<const_iterator,
254 const const_iterator_value,
255 std::bidirectional_iterator_tag,
256 const const_iterator_value>
318 typename Impl_t::const_iterator
m_impl;
336 :
public boost::iterator_facade<iterator,
337 const iterator_value,
338 std::bidirectional_iterator_tag,
339 const iterator_value>
464 bool contains (
const key_type key)
const;
473 size_type
count (
const key_type key)
const;
504 const mapped_type&
at (
const key_type key)
const;
518 mapped_type&
at (
const key_type key);
528 std::pair<const_iterator, const_iterator>
542 std::pair<iterator, iterator>
557 std::pair<const_iterator, bool>
558 emplace (key_type key,
const mapped_type& val,
559 const Context_t& ctx = Updater_t::defaultContext());
573 std::pair<const_iterator, bool>
575 const Context_t& ctx = Updater_t::defaultContext());
589 std::pair<const_iterator, bool>
590 emplace (key_type key, std::unique_ptr<mapped_type> val,
591 const Context_t& ctx = Updater_t::defaultContext());
606 template <
class PAIR>
607 std::pair<const_iterator, bool>
insert (
const PAIR& p,
608 const Context_t& ctx = Updater_t::defaultContext());
623 template <
class PAIR>
624 std::pair<const_iterator, bool>
insert (PAIR&& p,
625 const Context_t& ctx = Updater_t::defaultContext());
637 template <
class InputIterator>
638 void insert (InputIterator first, InputIterator last,
639 const Context_t& ctx = Updater_t::defaultContext());
651 const Context_t& ctx = Updater_t::defaultContext());
728 typename Impl_t::const_iterator
get (
const key_type key)
const;
741 std::pair<const_iterator, bool>
743 std::unique_ptr<mapped_type> val,
744 const Context_t& ctx = Updater_t::defaultContext());
Hash table allowing concurrent, lockless reads.
Concept check for Updater class used by concurrent classes.
Helpers for converting between uintptr_t and a pointer or integer.
Simple range from a pair of iterators.
bool equal(const iterator &other) const
iterator_facade requirement: Equality test.
void increment()
iterator_facade requirement: Increment the iterator.
bool valid() const
Test if this iterator is valid.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
iterator(typename Impl_t::const_iterator it)
Constructor.
friend class boost::iterator_core_access
Required by iterator_facade.
friend class const_iterator
void decrement()
iterator_facade requirement: Decrement the iterator.
Impl_t::const_iterator m_impl
The iterator on the underlying table.
const iterator_value dereference() const
iterator_facade requirement: Dereference the iterator.
Concept for a value that can be saved in a concurrent hash map.
Concept check for Updater class used by concurrent classes.
A couple standard-library related concepts.
Simple range from a pair of iterators.
typename Updater_t::Context_t Context_t
uintptr_t ConcurrentHashmapVal_t
Type used for keys and values — an unsigned big enough to hold a pointer.
ConcurrentHashmapImpl(Updater_t &&updater, size_t capacity_in, const Hasher_t &hasher, const Matcher_t &matcher, const typename Updater_t::Context_t &ctx)
Constructor.
CxxUtils::iterator_range< const_iterator > const_iterator_range
A range defined by two iterators.
const_iterator cend() const
Iterator at the end of the map.
std::pair< const key_type, mapped_type & > iterator_value
Updater_t & updater()
Access the Updater instance.
const_iterator begin() const
Return a begin iterator.
std::pair< const key_type, mapped_type > const_iterator_value
Value structure for iterators.
std::pair< const_iterator, const_iterator > equal_range(key_type key) const
Return a range of iterators with entries matching key.
const_iterator find(bit_t bit) const
If bit bit is set, return an iterator pointing to it.
std::pair< const_iterator, bool > put(key_type key, mapped_type val, bool overwrite=true, const Context_t &ctx=Updater_t::defaultContext())
Insert / overwrite an entry in the table.
bool empty() const
Return true if there are no 1 bits in the set.
~ConcurrentToValMap()
Destructor.
void quiescent(const Context_t &ctx)
Called when this thread is no longer referencing anything from this container.
void rehash(size_type capacity)
Increase the table capacity.
bit_t size() const
Count the number of 1 bits in the set.
bool contains(key_type key) const
Test if a key is in the container.
bit_t capacity() const
The number of bits that this container can hold.
ConcurrentBitset & operator=(const ConcurrentBitset &other)
Assignment.
const_iterator_range range() const
Return an iterator range covering the entire map.
static mapped_type mappedAsMapped(val_t val)
Convert an underlying mapped value to this type's mapped value.
void swap(ClassName &other)
Swap this expression with another one.
UPDATER< Impl > Updater_t
const_iterator end() const
Return an end iterator.
mapped_type at(key_type key) const
Look up an element in the map.
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
static key_type keyAsKey(val_t val)
Convert an underlying key value to this type's key value.
static val_t keyAsVal(key_type k)
Convert this type's key value to an underlying key value.
ConcurrentToValMap(Updater_t &&updater, size_type capacity=64, const Context_t &ctx=Updater_t::defaultContext())
Hash map from pointers/integers to arbitrary objects allowing concurrent, lockless reads.
std::atomic< Impl * > m_impl
The current implementation object.
const_iterator cbegin() const
Iterator at the start of the map.
bit_t count() const
Count the number of 1 bits in the set.
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.
void reserve(size_type capacity, const Context_t &ctx=Updater_t::defaultContext())
Increase the table capacity.
static val_t mappedAsVal(mapped_type val)
Convert this type's mapped value to an underlying mapped value.
Impl_t::const_iterator get(key_type key) const
Do a lookup in the table.
Iterator over all 1 bits in the set.
bool valid() const
Test if this iterator is valid.
void decrement()
iterator_facade requirement: Decrement the iterator.
void increment()
iterator_facade requirement: Increment the iterator.
const_iterator(Block_t cache, bit_t bit, const std::atomic< Block_t > *data, const std::atomic< Block_t > *end)
Constructor.
bool equal(const iterator &other) const
iterator_facade requirement: Equality test.
bool equal(const const_iterator &other) const
iterator_facade requirement: Equality test.
const_iterator(const iterator &other)
Conversion from non-const iterator (for interoperability).
friend class boost::iterator_core_access
Required by iterator_facade.
const const_iterator_value dereference() const
iterator_facade requirement: Dereference the iterator.
const_iterator(typename Impl_t::const_iterator it)
Constructor.
Impl_t::const_iterator m_impl
The iterator on the underlying table.