13#ifndef CXXUTILS_CONCURRENTSTRMAP_H
14#define CXXUTILS_CONCURRENTSTRMAP_H
21#include "boost/iterator/iterator_facade.hpp"
73template <
class VALUE,
template <
class>
class UPDATER>
97 using Lock_t =
typename Impl_t::Lock_t;
100 static_assert(
sizeof(
typename Impl_t::val_t) >=
sizeof(
mapped_type) );
113 const Context_t& ctx = Updater_t::defaultContext());
128 const Context_t& ctx = Updater_t::defaultContext());
143 template <
class InputIterator>
148 const Context_t& ctx = Updater_t::defaultContext());
207 :
public boost::iterator_facade<const_iterator,
208 const const_iterator_value,
209 std::bidirectional_iterator_tag,
210 const const_iterator_value>
230 friend class boost::iterator_core_access;
281 const_iterator
end()
const;
338 std::pair<const_iterator, const_iterator>
364 std::pair<const_iterator, bool>
366 const Context_t& ctx = Updater_t::defaultContext());
381 std::pair<const_iterator, bool>
384 const Context_t& ctx = Updater_t::defaultContext());
398 std::pair<const_iterator, bool>
400 const Context_t& ctx = Updater_t::defaultContext());
415 std::pair<const_iterator, bool>
418 const Context_t& ctx = Updater_t::defaultContext());
432 std::pair<const_iterator, bool>
434 const Context_t& ctx = Updater_t::defaultContext());
450 std::pair<const_iterator, bool>
453 const Context_t& ctx = Updater_t::defaultContext());
467 std::pair<const_iterator, bool>
469 const Context_t& ctx = Updater_t::defaultContext());
485 std::pair<const_iterator, bool>
488 const Context_t& ctx = Updater_t::defaultContext());
505 template <
class PAIR>
506 std::pair<const_iterator, bool>
insert (
const PAIR& p,
507 const Context_t& ctx = Updater_t::defaultContext());
522 template <
class PAIR>
523 std::pair<const_iterator, bool>
insert (PAIR&& p,
524 const Context_t& ctx = Updater_t::defaultContext());
536 template <
class InputIterator>
537 void insert (InputIterator first, InputIterator last,
538 const Context_t& ctx = Updater_t::defaultContext());
550 const Context_t& ctx = Updater_t::defaultContext());
640 std::pair<const_iterator, bool>
641 put (std::unique_ptr<key_type> key,
643 bool overwrite =
true,
644 const Context_t& ctx = Updater_t::defaultContext());
658 std::pair<const_iterator, bool>
660 std::unique_ptr<key_type> key,
662 bool overwrite =
true,
663 const Context_t& ctx = Updater_t::defaultContext());
675 size_t operator() (
const val_t p)
const;
677 size_t operator() (
const std::string& s)
const;
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.
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.
typename Updater_t::Context_t Context_t
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.
CxxUtils::detail::ConcurrentHashmapVal_t val_t
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.
typename Impl_t::Lock_t Lock_t
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.
typename Impl_t::Updater_t Updater_t
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.
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.
Hash functional for keys.
std::hash< std::string > m_hash
Hash functional.
Matching functional for keys.