3#include <xrpl/beast/clock/abstract_clock.h>
4#include <xrpl/beast/container/aged_container.h>
5#include <xrpl/beast/container/detail/aged_associative_container.h>
6#include <xrpl/beast/container/detail/aged_container_iterator.h>
7#include <xrpl/beast/container/detail/empty_base_optimization.h>
8#include <xrpl/beast/utility/instrumentation.h>
10#include <boost/intrusive/list.hpp>
11#include <boost/intrusive/unordered_set.hpp>
40#ifndef BEAST_NO_CXX14_IS_PERMUTATION
41#define BEAST_NO_CXX14_IS_PERMUTATION 1
70 class Clock = std::chrono::steady_clock,
71 class Hash = std::hash<Key>,
72 class KeyEqual = std::equal_to<Key>,
73 class Allocator = std::allocator<std::conditional_t<IsMap, std::pair<Key const, T>, Key>>>
99 struct Element : boost::intrusive::unordered_set_base_hook<
100 boost::intrusive::link_mode<boost::intrusive::normal_link>>,
101 boost::intrusive::list_base_hook<
102 boost::intrusive::link_mode<boost::intrusive::normal_link>>
122 template <
class... Args>
158 [[nodiscard]] Hash
const&
204 [[nodiscard]] KeyEqual
const&
212 boost::intrusive::make_list<Element, boost::intrusive::constant_time_size<false>>
::type;
216 typename boost::intrusive::make_unordered_multiset<
218 boost::intrusive::constant_time_size<true>,
219 boost::intrusive::hash<ValueHash>,
220 boost::intrusive::equal<KeyValueEqual>,
221 boost::intrusive::cache_begin<true>>
::type,
222 typename boost::intrusive::make_unordered_set<
224 boost::intrusive::constant_time_size<true>,
225 boost::intrusive::hash<ValueHash>,
226 boost::intrusive::equal<KeyValueEqual>,
227 boost::intrusive::cache_begin<true>>
::type>;
284 KeyEqual
const& keyEqual,
285 Allocator
const&
alloc)
320 Allocator
const&
alloc)
342 keyEq() = std::move(other.keyEq());
343 alloc() = std::move(other.alloc());
366 [[nodiscard]] Hash
const&
390 [[nodiscard]] KeyEqual
const&
420 vec_.resize(cont_type::suggested_upper_bucket_count(0));
425 vec_.resize(cont_type::suggested_upper_bucket_count(0));
442 return vec_.max_size();
451 [[nodiscard]]
float const&
458 template <
class Container>
491 template <
class Container>
495 size_type const suggested(cont_type::suggested_upper_bucket_count(n));
504 template <
class... Args>
516 operator()(Element* p)
663 reinterpret_cast<uint8_t*
>(&value) -
671 return list_.iterator_to(*
reinterpret_cast<Element const*
>(
672 reinterpret_cast<uint8_t const*
>(&value) -
710 KeyEqual
const&
keyEq,
711 Allocator
const& alloc);
713 template <
class InputIt>
716 template <
class InputIt>
719 template <
class InputIt>
722 template <
class InputIt>
725 template <
class InputIt>
731 KeyEqual
const&
keyEq);
733 template <
class InputIt>
739 Allocator
const& alloc);
741 template <
class InputIt>
746 KeyEqual
const&
keyEq,
747 Allocator
const& alloc);
749 template <
class InputIt>
755 KeyEqual
const&
keyEq,
756 Allocator
const& alloc);
767 Allocator
const& alloc);
779 KeyEqual
const&
keyEq);
784 Allocator
const& alloc);
790 KeyEqual
const&
keyEq);
796 Allocator
const& alloc);
801 KeyEqual
const&
keyEq,
802 Allocator
const& alloc);
808 KeyEqual
const&
keyEq,
809 Allocator
const& alloc);
846 template <
class K,
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
849 requires(MaybeMap && !MaybeMulti);
851 template <
class K,
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
854 requires(MaybeMap && !MaybeMulti);
856 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
859 requires(MaybeMap && !MaybeMulti);
861 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
864 requires(MaybeMap && !MaybeMulti);
912 return cont_.iterator_to(*
reinterpret_cast<Element*
>(
913 reinterpret_cast<uint8_t*
>(&value) -
921 return cont_.iterator_to(*
reinterpret_cast<Element const*
>(
922 reinterpret_cast<uint8_t const*
>(&value) -
935 return cont_.empty();
960 template <
bool MaybeMulti = IsMulti>
963 requires(!MaybeMulti);
966 template <
bool MaybeMulti = IsMulti>
972 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
975 requires(!MaybeMulti && !MaybeMap);
978 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
981 requires(MaybeMulti && !MaybeMap);
984 template <
bool MaybeMulti = IsMulti>
987 requires(!MaybeMulti)
991 return insert(value).first;
995 template <
bool MaybeMulti = IsMulti>
1006 template <
bool MaybeMulti = IsMulti>
1009 requires(!MaybeMulti)
1013 return insert(std::move(value)).first;
1017 template <
bool MaybeMulti = IsMulti>
1024 return insert(std::move(value));
1028 template <
class P,
bool MaybeMap = IsMap>
1037 template <
class P,
bool MaybeMap = IsMap>
1045 template <
class InputIt>
1059 template <
bool MaybeMulti = IsMulti,
class... Args>
1062 requires(!MaybeMulti);
1065 template <
bool MaybeMulti = IsMulti,
class... Args>
1068 requires MaybeMulti;
1071 template <
bool MaybeMulti = IsMulti,
class... Args>
1074 requires(!MaybeMulti);
1077 template <
bool MaybeMulti = IsMulti,
class... Args>
1087 template <
bool IsConst,
class Iterator>
1091 template <
bool IsConst,
class Iterator>
1104 template <
bool IsConst,
class Iterator>
1153 auto const r(
cont_.equal_range(
1163 auto const r(
cont_.equal_range(
1213 return cont_.bucket_count();
1219 return buck_.maxBucketCount();
1225 return cont_.bucket_size(n);
1233 "beast::detail::AgedUnorderedContainer::bucket : nonzero bucket "
1247 return size() /
static_cast<float>(
cont_.bucket_count());
1253 return buck_.maxLoadFactor();
1284 return config_.hashFunction();
1307 class OtherDuration,
1309 class OtherAllocator,
1310 bool MaybeMulti = IsMulti>
1320 OtherAllocator>
const& other)
const
1321 requires(!MaybeMulti);
1327 class OtherDuration,
1329 class OtherAllocator,
1330 bool MaybeMulti = IsMulti>
1340 OtherAllocator>
const& other)
const
1341 requires MaybeMulti;
1357 "beast::detail::AgedUnorderedContainer::maybeRehash : maximum "
1362 template <
bool MaybeMulti = IsMulti>
1365 requires(!MaybeMulti);
1368 template <
bool MaybeMulti = IsMulti>
1371 requires MaybeMulti;
1373 template <
class InputIt>
1377 for (; first != last; ++first)
1381 template <
class InputIt>
1385 for (; first != last; ++first)
1389 template <
class InputIt>
1398 template <
bool IsConst,
class Iterator>
1414 requires MaybePropagate
1426 requires(!MaybePropagate)
1569 KeyEqual
const&
keyEq,
1570 Allocator
const& alloc)
1586template <
class InputIt>
1604template <
class InputIt>
1622template <
class InputIt>
1640template <
class InputIt>
1659template <
class InputIt>
1666 KeyEqual
const&
keyEq)
1682template <
class InputIt>
1689 Allocator
const& alloc)
1706template <
class InputIt>
1712 KeyEqual
const&
keyEq,
1713 Allocator
const& alloc)
1730template <
class InputIt>
1737 KeyEqual
const&
keyEq,
1738 Allocator
const& alloc)
1813 Allocator
const& alloc)
1818 insert(other.cbegin(), other.cend());
1872 KeyEqual
const&
keyEq)
1892 Allocator
const& alloc)
1914 KeyEqual
const&
keyEq)
1935 Allocator
const& alloc)
1956 KeyEqual
const&
keyEq,
1957 Allocator
const& alloc)
1979 KeyEqual
const&
keyEq,
1980 Allocator
const& alloc)
2043 config_ = std::move(other.config_);
2080template <
class K,
bool MaybeMulti,
bool MaybeMap>
2083 requires(MaybeMap && !MaybeMulti)
2087 if (iter ==
cont_.end())
2089 return iter->value.second;
2101template <
class K,
bool MaybeMulti,
bool MaybeMap>
2105 requires(MaybeMap && !MaybeMulti)
2109 if (iter ==
cont_.end())
2111 return iter->value.second;
2123template <
bool MaybeMulti,
bool MaybeMap>
2127 requires(MaybeMap && !MaybeMulti)
2130 typename cont_type::insert_commit_data d;
2131 auto const result(
cont_.insert_check(
2137 cont_.insert_commit(*p, d);
2139 return p->
value.second;
2141 return result.first->value.second;
2153template <
bool MaybeMulti,
bool MaybeMap>
2157 requires(MaybeMap && !MaybeMulti)
2160 typename cont_type::insert_commit_data d;
2161 auto const result(
cont_.insert_check(
2169 cont_.insert_commit(*p, d);
2171 return p->
value.second;
2173 return result.first->value.second;
2207template <
bool MaybeMulti>
2211 requires(!MaybeMulti)
2214 typename cont_type::insert_commit_data d;
2215 auto const result(
cont_.insert_check(
2220 auto const iter(
cont_.insert_commit(*p, d));
2237template <
bool MaybeMulti>
2246 auto const iter(
cont_.insert(*p));
2260template <
bool MaybeMulti,
bool MaybeMap>
2264 requires(!MaybeMulti && !MaybeMap)
2267 typename cont_type::insert_commit_data d;
2268 auto const result(
cont_.insert_check(
2273 auto const iter(
cont_.insert_commit(*p, d));
2290template <
bool MaybeMulti,
bool MaybeMap>
2294 requires(MaybeMulti && !MaybeMap)
2299 auto const iter(
cont_.insert(*p));
2313template <
bool MaybeMulti,
class... Args>
2317 requires(!MaybeMulti)
2323 auto const result(
cont_.insert(*p));
2343template <
bool MaybeMulti,
class... Args>
2352 auto const iter(
cont_.insert(*p));
2366template <
bool MaybeMulti,
class... Args>
2371 requires(!MaybeMulti)
2377 typename cont_type::insert_commit_data d;
2378 auto const result(
cont_.insert_check(
2385 auto const iter(
cont_.insert_commit(*p, d));
2402template <
bool IsConst,
class Iterator>
2420template <
bool IsConst,
class Iterator>
2426 for (; first != last;)
2447 if (iter ==
cont_.end())
2494 auto const now(
clock().now());
2496 auto const range(equal_range(k));
2497 for (
auto iter : range)
2518 class OtherDuration,
2520 class OtherAllocator,
2532 OtherAllocator>
const& other)
const
2533 requires(!MaybeMulti)
2535 if (
size() != other.size())
2537 for (
auto iter(
cbegin()), last(
cend()), otherLast(other.cend()); iter != last; ++iter)
2539 auto otherIter(other.find(
extract(*iter)));
2540 if (otherIter == otherLast)
2559 class OtherDuration,
2561 class OtherAllocator,
2573 OtherAllocator>
const& other)
const
2576 if (
size() != other.size())
2578 for (
auto iter(
cbegin()), last(
cend()); iter != last;)
2580 auto const& k(
extract(*iter));
2582 auto const oeq(other.equalRange(k));
2583#if BEAST_NO_CXX14_IS_PERMUTATION
2608template <
bool MaybeMulti>
2612 requires(!MaybeMulti)
2614 typename cont_type::insert_commit_data d;
2615 auto const result(
cont_.insert_check(
2620 auto const iter(
cont_.insert_commit(*p, d));
2637template <
bool MaybeMulti>
2645 auto const iter(
cont_.insert(*p));
2713 auto const expired(c.clock().now() - age);
2714 for (
auto iter(c.chronological.cbegin());
2715 iter != c.chronological.cend() && iter.when() <= expired;)
2717 iter = c.erase(iter);
Abstract interface to a clock.
Clock::time_point time_point
Iterator const & iterator() const
void rehash(size_type count, Container &c)
size_type maxBucketCount() const
std::vector< bucket_type, typename std::allocator_traits< Allocator >::template rebind_alloc< bucket_type > > vec_type
float const & maxLoadFactor() const
Buckets(Allocator const &alloc)
void resize(size_type n, Container &c)
const_reverse_iterator rend() const
const_iterator begin() const
const_reverse_iterator crbegin() const
beast::detail::AgedContainerIterator<!IsMap, typename list_type::reverse_iterator > reverse_iterator
const_reverse_iterator rbegin() const
beast::detail::AgedContainerIterator< true, typename list_type::iterator > const_iterator
ChronologicalT(ChronologicalT &&)=delete
const_iterator cend() const
iterator iteratorTo(value_type &value)
friend class AgedUnorderedContainer
const_iterator end() const
ChronologicalT(ChronologicalT const &)=delete
const_iterator cbegin() const
const_iterator iteratorTo(value_type const &value) const
reverse_iterator rbegin()
const_reverse_iterator crend() const
beast::detail::AgedContainerIterator<!IsMap, typename list_type::iterator > iterator
beast::detail::AgedContainerIterator< true, typename list_type::reverse_iterator > const_reverse_iterator
ConfigT(clock_type &clock, Allocator const &alloc)
Hash const & hashFunction() const
ConfigT(clock_type &clock, Hash const &hash, KeyEqual const &keyEqual, Allocator const &alloc)
ConfigT(ConfigT const &other, Allocator const &alloc)
ElementAllocator const & alloc() const
ConfigT(ConfigT const &other)
KeyValueEqual const & keyValueEqual() const
ConfigT & operator=(ConfigT const &other)
std::reference_wrapper< clock_type > clock
ConfigT(clock_type &clock, Hash const &hash)
ConfigT(clock_type &clock, KeyEqual const &keyEqual)
ValueHash const & valueHash() const
ConfigT(ConfigT &&other, Allocator const &alloc)
ConfigT(clock_type &clock, Hash const &hash, Allocator const &alloc)
ConfigT(clock_type &clock, Hash const &hash, KeyEqual const &keyEqual)
ConfigT(clock_type &clock, KeyEqual const &keyEqual, Allocator const &alloc)
KeyEqual const & keyEq() const
ConfigT & operator=(ConfigT &&other)
KeyValueEqual & keyValueEqual()
ConfigT(clock_type &clock)
ElementAllocator & alloc()
KeyEqual const & keyEq() const
bool operator()(Element const &lhs, Element const &rhs) const
bool operator()(Key const &k, Element const &e) const
KeyValueEqual(KeyEqual const &keyEqual)
Element second_argument_type
bool operator()(Element const &e, Key const &k) const
Hash const & hashFunction() const
std::size_t operator()(Element const &e) const
Associative container where each element is also indexed by time.
auto insert(value_type &&value) -> iterator requires(MaybeMulti &&!MaybeMap)
const_local_iterator cbegin(size_type n) const
iterator insert(const_iterator, value_type &&value)
void insert(std::initializer_list< value_type > init)
std::pair< const_iterator, const_iterator > equalRange(K const &k) const
void rehash(size_type count)
std::conditional_t< IsMulti, iterator, std::pair< iterator, bool > > insert(const_iterator hint, P &&value)
void touch(beast::detail::AgedContainerIterator< IsConst, Iterator > pos, clock_type::time_point const &now)
AgedUnorderedContainer(clock_type &clock)
std::conditional_t< IsMap, T, void * > & operator[](Key &&key)
clock_type::time_point time_point
std::integral_constant< bool, IsMulti > is_multi
const_local_iterator end(size_type n) const
local_iterator begin(size_type n)
void maybeRehash(size_type additional)
AgedUnorderedContainer & operator=(AgedUnorderedContainer const &other)
iterator emplaceHint(const_iterator, Args &&... args)
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::chronological class beast::detail::AgedUnorderedContainer::ChronologicalT chronological
void deleteElement(Element const *p)
std::integral_constant< bool, IsMap > is_map
bool empty() const noexcept
const_iterator find(K const &k) const
size_type count(K const &k) const
auto insert(value_type const &value) -> std::pair< iterator, bool > requires(!MaybeMulti)
bool operator==(AgedUnorderedContainer< true, OtherIsMap, OtherKey, OtherT, OtherDuration, OtherHash, KeyEqual, OtherAllocator > const &other) const
AgedUnorderedContainer(AgedUnorderedContainer const &other)
void insert(InputIt first, InputIt last, std::input_iterator_tag)
std::allocator_traits< Allocator >::pointer pointer
void touch(beast::detail::AgedContainerIterator< IsConst, Iterator > pos)
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, Allocator const &alloc)
beast::detail::AgedContainerIterator< false, Iterator > erase(beast::detail::AgedContainerIterator< IsConst, Iterator > first, beast::detail::AgedContainerIterator< IsConst, Iterator > last)
AgedUnorderedContainer(clock_type &clock, Hash const &hash, KeyEqual const &keyEq, Allocator const &alloc)
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, Hash const &hash, Allocator const &alloc)
void swap(AgedUnorderedContainer &other) noexcept
size_type size() const noexcept
size_type bucketSize(size_type n) const
const_local_iterator begin(size_type n) const
std::allocator_traits< ElementAllocator > ElementAllocatorTraits
auto emplace(Args &&... args) -> std::pair< iterator, bool > requires(!MaybeMulti)
iterator insert(const_iterator, value_type const &value)
beast::detail::AgedContainerIterator< true, typename cont_type::iterator > const_iterator
auto insertUnchecked(value_type const &value) -> iterator
bool operator==(AgedUnorderedContainer< false, OtherIsMap, OtherKey, OtherT, OtherDuration, OtherHash, KeyEqual, OtherAllocator > const &other) const
std::allocator_traits< Allocator >::template rebind_alloc< Element > BucketAllocator
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::clock clock_type & clock()
std::pair< iterator, iterator > equalRange(K const &k)
std::conditional_t< IsMap, std::pair< Key const, T >, Key > value_type
float maxLoadFactor() const
auto insertUnchecked(value_type const &value) -> std::pair< iterator, bool > requires(!MaybeMulti)
const_iterator cbegin() const
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, KeyEqual const &keyEq, Allocator const &alloc)
value_type const & const_reference
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, Hash const &hash, Allocator const &alloc)
size_type maxBucketCount() const
auto emplace(Args &&... args) -> iterator
AgedUnorderedContainer(AgedUnorderedContainer &&other)
std::conditional_t< IsMap, T, void * > & at(K const &k)
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, KeyEqual const &keyEq)
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, Hash const &hash, KeyEqual const &keyEq)
cont_type::bucket_traits bucket_traits
auto erase(K const &k) -> size_type
void swapData(AgedUnorderedContainer &other) noexcept
void unlinkAndDeleteElement(Element const *p)
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::buck_ Buckets buck_
clock_type const & clock() const
void insertUnchecked(InputIt first, InputIt last)
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::keyEq key_equal const & keyEq() const
size_type bucket(Key const &k) const
boost::intrusive::make_list< Element, boost::intrusive::constant_time_size< false > >::type list_type
AgedUnorderedContainer(AgedUnorderedContainer &&other, Allocator const &alloc)
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::config_ ConfigT config_
std::ptrdiff_t difference_type
std::conditional_t< IsMulti, typename boost::intrusive::make_unordered_multiset< Element, boost::intrusive::constant_time_size< true >, boost::intrusive::hash< ValueHash >, boost::intrusive::equal< KeyValueEqual >, boost::intrusive::cache_begin< true > >::type, typename boost::intrusive::make_unordered_set< Element, boost::intrusive::constant_time_size< true >, boost::intrusive::hash< ValueHash >, boost::intrusive::equal< KeyValueEqual >, boost::intrusive::cache_begin< true > >::type > cont_type
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, KeyEqual const &keyEq)
AgedUnorderedContainer(clock_type &clock, KeyEqual const &keyEq, Allocator const &alloc)
AgedUnorderedContainer(clock_type &clock, KeyEqual const &keyEq)
beast::detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator >< uint256, std::unordered_set< Peer::id_t >, ClockType, HardenedHash< strong_hash > >::cont_ cont_type cont_
~AgedUnorderedContainer()
AgedUnorderedContainer(clock_type &clock, Hash const &hash, Allocator const &alloc)
auto touch(K const &k) -> size_type
iterator iteratorTo(value_type &value)
auto insert(value_type &&value) -> std::pair< iterator, bool > requires(!MaybeMulti &&!MaybeMap)
const_iterator end() const
std::conditional< IsMap, T, void * >::type const & at(K const &k) const
bool wouldExceed(size_type additional) const
AbstractClock< Clock > clock_type
beast::detail::AgedContainerIterator<!IsMap, typename cont_type::local_iterator > local_iterator
const_iterator cend() const
void insert(InputIt first, InputIt last, std::random_access_iterator_tag)
beast::detail::AgedContainerIterator< true, typename cont_type::local_iterator > const_local_iterator
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, Hash const &hash)
AgedUnorderedContainer & operator=(AgedUnorderedContainer &&other)
auto insert(value_type const &value) -> iterator
std::true_type is_unordered
static Key const & extract(value_type const &value)
iterator find(K const &k)
void reserve(size_type count)
AgedUnorderedContainer & operator=(std::initializer_list< value_type > init)
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock)
void maxLoadFactor(float ml)
const_local_iterator cend(size_type n) const
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock)
AgedUnorderedContainer(clock_type &clock, Allocator const &alloc)
local_iterator end(size_type n)
std::allocator_traits< Allocator >::template rebind_alloc< Element > ElementAllocator
size_type bucketCount() const
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, KeyEqual const &keyEq, Allocator const &alloc)
AgedUnorderedContainer()=delete
std::conditional_t< IsMulti, iterator, std::pair< iterator, bool > > insert(P &&value)
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, Hash const &hash, KeyEqual const &keyEq, Allocator const &alloc)
std::conditional_t< IsMap, T, void * > & operator[](Key const &key)
iterator insert(const_iterator, value_type &&value)
cont_type::bucket_type bucket_type
allocator_type getAllocator() const
const_iterator iteratorTo(value_type const &value) const
hasher const & hashFunction() const
void swapData(AgedUnorderedContainer &other) noexcept
Element * newElement(Args &&... args)
AgedUnorderedContainer(AgedUnorderedContainer const &other, Allocator const &alloc)
std::allocator_traits< BucketAllocator > BucketAllocatorTraits
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, Hash const &hash)
iterator insert(const_iterator, value_type const &value)
AgedUnorderedContainer(clock_type &clock, Hash const &hash, KeyEqual const &keyEq)
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, Hash const &hash, KeyEqual const &keyEq, Allocator const &alloc)
AgedUnorderedContainer(clock_type &clock, Hash const &hash)
clock_type::duration duration
const_iterator begin() const
void insert(InputIt first, InputIt last)
beast::detail::AgedContainerIterator<!IsMap, typename cont_type::iterator > iterator
std::allocator_traits< Allocator >::const_pointer const_pointer
AgedUnorderedContainer(std::initializer_list< value_type > init, clock_type &clock, Hash const &hash, KeyEqual const &keyEq)
size_type maxSize() const noexcept
AgedUnorderedContainer(InputIt first, InputIt last, clock_type &clock, Allocator const &alloc)
auto emplaceHint(const_iterator, Args &&... args) -> std::pair< iterator, bool > requires(!MaybeMulti)
beast::detail::AgedContainerIterator< false, Iterator > erase(beast::detail::AgedContainerIterator< IsConst, Iterator > pos)
EmptyBaseOptimization()=default
T forward_as_tuple(T... args)
T is_permutation(T... args)
std::size_t expire(AgedContainer &c, std::chrono::duration< Rep, Period > const &age)
Expire aged container items past the specified age.
void swap(beast::detail::AgedOrderedContainer< IsMulti, IsMap, Key, T, Clock, Compare, Allocator > &lhs, beast::detail::AgedOrderedContainer< IsMulti, IsMap, Key, T, Clock, Compare, Allocator > &rhs) noexcept
IsAgedContainer()=default
AgedUnorderedContainer::value_type value_type
AgedUnorderedContainer::time_point time_point
Element(time_point const &when, Args &&... args)
Element(time_point const &when, value_type const &value)
Element(time_point const &when, value_type &&value)