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>
9#include <boost/intrusive/list.hpp>
10#include <boost/intrusive/set.hpp>
11#include <boost/version.hpp>
92 struct Element : boost::intrusive::set_base_hook<
93 boost::intrusive::link_mode<boost::intrusive::normal_link>>,
94 boost::intrusive::list_base_hook<
95 boost::intrusive::link_mode<boost::intrusive::normal_link>>
115 template <
class... Args>
137 return Compare::operator()(lhs.first, rhs.first);
193 [[nodiscard]] Compare
const&
201 boost::intrusive::make_list<Element, boost::intrusive::constant_time_size<false>>
::type;
205 typename boost::intrusive::make_multiset<
207 boost::intrusive::constant_time_size<true>,
208 boost::intrusive::compare<KeyValueCompare>>
::type,
209 typename boost::intrusive::make_set<
211 boost::intrusive::constant_time_size<true>,
212 boost::intrusive::compare<KeyValueCompare>>
::type>;
267 Allocator
const&
alloc)
289 compare() = std::move(other.compare());
290 alloc() = std::move(other.alloc());
301 [[nodiscard]] Compare
const&
334 template <
class... Args>
346 operator()(Element* p)
494 reinterpret_cast<uint8_t*
>(&value) -
502 return list_.iterator_to(*
reinterpret_cast<Element const*
>(
503 reinterpret_cast<uint8_t const*
>(&value) -
531 template <
class InputIt>
534 template <
class InputIt>
537 template <
class InputIt>
540 template <
class InputIt>
546 Allocator
const& alloc);
557 Allocator
const& alloc);
564 Compare
const& comp);
569 Allocator
const& alloc);
575 Allocator
const& alloc);
612 template <
class K,
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
615 requires(MaybeMap && !MaybeMulti);
617 template <
class K,
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
620 requires(MaybeMap && !MaybeMulti);
622 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
625 requires(MaybeMap && !MaybeMulti);
627 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
630 requires(MaybeMap && !MaybeMulti);
714 return cont_.iterator_to(*
reinterpret_cast<Element*
>(
715 reinterpret_cast<uint8_t*
>(&value) -
723 return cont_.iterator_to(*
reinterpret_cast<Element const*
>(
724 reinterpret_cast<uint8_t const*
>(&value) -
737 return cont_.empty();
762 template <
bool MaybeMulti = IsMulti>
765 requires(!MaybeMulti);
768 template <
bool MaybeMulti = IsMulti>
774 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
777 requires(!MaybeMulti && !MaybeMap);
780 template <
bool MaybeMulti = IsMulti,
bool MaybeMap = IsMap>
783 requires(MaybeMulti && !MaybeMap);
788 template <
bool MaybeMulti = IsMulti>
791 requires(!MaybeMulti);
794 template <
bool MaybeMulti = IsMulti>
804 template <
bool MaybeMulti = IsMulti>
807 requires(!MaybeMulti);
810 template <
bool MaybeMulti = IsMulti>
816 return insert(std::move(value));
820 template <
class P,
bool MaybeMap = IsMap>
829 template <
class P,
bool MaybeMap = IsMap>
837 template <
class InputIt>
841 for (; first != last; ++first)
852 template <
bool MaybeMulti = IsMulti,
class... Args>
855 requires(!MaybeMulti);
858 template <
bool MaybeMulti = IsMulti,
class... Args>
864 template <
bool MaybeMulti = IsMulti,
class... Args>
867 requires(!MaybeMulti);
870 template <
bool MaybeMulti = IsMulti,
class... Args>
880 template <
bool IsConst,
class Iterator>
887 template <
bool IsConst,
class Iterator>
904 template <
bool IsConst,
class Iterator>
1029 class OtherDuration,
1030 class OtherAllocator>
1039 OtherAllocator>
const& other)
const;
1045 class OtherDuration,
1046 class OtherAllocator>
1055 OtherAllocator>
const& other)
const
1065 class OtherDuration,
1066 class OtherAllocator>
1075 OtherAllocator>
const& other)
const
1077 return !(other < *
this);
1084 class OtherDuration,
1085 class OtherAllocator>
1094 OtherAllocator>
const& other)
const
1096 return other < *
this;
1103 class OtherDuration,
1104 class OtherAllocator>
1113 OtherAllocator>
const& other)
const
1115 return !(*
this < other);
1120 template <
bool IsConst,
class Iterator>
1131 requires MaybePropagate;
1137 requires(!MaybePropagate);
1146template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1153template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1156 Compare
const& comp)
1161template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1164 Allocator
const& alloc)
1169template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1172 Compare
const& comp,
1173 Allocator
const& alloc)
1178template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1179template <
class InputIt>
1189template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1190template <
class InputIt>
1195 Compare
const& comp)
1201template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1202template <
class InputIt>
1207 Allocator
const& alloc)
1213template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1214template <
class InputIt>
1219 Compare
const& comp,
1220 Allocator
const& alloc)
1226template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1234template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1237 Allocator
const& alloc)
1243template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1251template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1254 Allocator
const& alloc)
1257 insert(other.cbegin(), other.cend());
1261template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1270template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1274 Compare
const& comp)
1280template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1284 Allocator
const& alloc)
1290template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1294 Compare
const& comp,
1295 Allocator
const& alloc)
1301template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1307template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1315 this->
config_ = other.config_;
1316 insert(other.begin(), other.end());
1321template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1327 this->
config_ = std::move(other.config_);
1328 insert(other.begin(), other.end());
1333template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1345template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1346template <
class K,
bool MaybeMulti,
bool MaybeMap>
1349 requires(MaybeMap && !MaybeMulti)
1352 if (iter ==
cont_.end())
1354 return iter->value.second;
1357template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1358template <
class K,
bool MaybeMulti,
bool MaybeMap>
1361 requires(MaybeMap && !MaybeMulti)
1364 if (iter ==
cont_.end())
1366 return iter->value.second;
1369template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1370template <
bool MaybeMulti,
bool MaybeMap>
1373 requires(MaybeMap && !MaybeMulti)
1375 typename cont_type::insert_commit_data d;
1381 cont_.insert_commit(*p, d);
1383 return p->
value.second;
1385 return result.first->value.second;
1388template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1389template <
bool MaybeMulti,
bool MaybeMap>
1392 requires(MaybeMap && !MaybeMulti)
1394 typename cont_type::insert_commit_data d;
1402 cont_.insert_commit(*p, d);
1404 return p->
value.second;
1406 return result.first->value.second;
1411template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1422template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1423template <
bool MaybeMulti>
1427 requires(!MaybeMulti)
1429 typename cont_type::insert_commit_data d;
1434 auto const iter(
cont_.insert_commit(*p, d));
1442template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1443template <
bool MaybeMulti>
1452 auto const iter(
cont_.insert_before(before, *p));
1457template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1458template <
bool MaybeMulti,
bool MaybeMap>
1462 requires(!MaybeMulti && !MaybeMap)
1464 typename cont_type::insert_commit_data d;
1469 auto const iter(
cont_.insert_commit(*p, d));
1477template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1478template <
bool MaybeMulti,
bool MaybeMap>
1482 requires(MaybeMulti && !MaybeMap)
1487 auto const iter(
cont_.insert_before(before, *p));
1494template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1495template <
bool MaybeMulti>
1500 requires(!MaybeMulti)
1502 typename cont_type::insert_commit_data d;
1508 auto const iter(
cont_.insert_commit(*p, d));
1516template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1517template <
bool MaybeMulti>
1522 requires(!MaybeMulti)
1524 typename cont_type::insert_commit_data d;
1530 auto const iter(
cont_.insert_commit(*p, d));
1538template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1539template <
bool MaybeMulti,
class... Args>
1543 requires(!MaybeMulti)
1548 typename cont_type::insert_commit_data d;
1552 auto const iter(
cont_.insert_commit(*p, d));
1561template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1562template <
bool MaybeMulti,
class... Args>
1571 auto const iter(
cont_.insert_before(before, *p));
1576template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1577template <
bool MaybeMulti,
class... Args>
1582 requires(!MaybeMulti)
1587 typename cont_type::insert_commit_data d;
1592 auto const iter(
cont_.insert_commit(*p, d));
1600template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1601template <
bool IsConst,
class Iterator>
1611template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1612template <
bool IsConst,
class Iterator>
1619 for (; first != last;)
1625template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1632 if (iter ==
cont_.end())
1647template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1659template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1665 auto const now(
clock().now());
1668 for (
auto iter : range)
1678template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1683 class OtherDuration,
1684 class OtherAllocator>
1694 OtherAllocator>
const& other)
const
1704 if (
size() != other.size())
1712 [&eq, &other](
value_type const& lhs, Other::value_type
const& rhs) {
1713 return eq(extract(lhs), other.extract(rhs));
1719template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1720template <
bool IsConst,
class Iterator>
1727 auto& e(*pos.iterator());
1733template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1734template <
bool MaybePropagate>
1738 requires MaybePropagate
1745template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1746template <
bool MaybePropagate>
1750 requires(!MaybePropagate)
1752 std::swap(config_.keyCompare(), other.config_.keyCompare());
1753 std::swap(config_.clock, other.config_.clock);
1760template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1770template <
bool IsMulti,
bool IsMap,
class Key,
class T,
class Clock,
class Compare,
class Allocator>
1799 auto const expired(c.
clock().
now() - age);
1803 iter = c.
erase(iter);
Abstract interface to a clock.
Clock::time_point time_point
virtual time_point now() const =0
Returns the current time.
time_point const & when() const
iterator iteratorTo(value_type &value)
const_reverse_iterator rbegin() const
reverse_iterator rbegin()
ChronologicalT(ChronologicalT &&)=delete
const_iterator cend() const
beast::detail::AgedContainerIterator<!IsMap, typename list_type::reverse_iterator > reverse_iterator
const_iterator end() const
friend class AgedOrderedContainer
const_reverse_iterator crend() const
const_iterator begin() const
const_iterator iteratorTo(value_type const &value) const
const_reverse_iterator rend() const
beast::detail::AgedContainerIterator< true, typename list_type::reverse_iterator > const_reverse_iterator
beast::detail::AgedContainerIterator<!IsMap, typename list_type::iterator > iterator
ChronologicalT(ChronologicalT const &)=delete
const_iterator cbegin() const
const_reverse_iterator crbegin() const
beast::detail::AgedContainerIterator< true, typename list_type::iterator > const_iterator
ConfigT(ConfigT const &other, Allocator const &alloc)
ElementAllocator const & alloc() const
Compare const & compare() const
ConfigT(clock_type &clock, Compare const &comp, Allocator const &alloc)
ConfigT(ConfigT &&other, Allocator const &alloc)
std::reference_wrapper< clock_type > clock
ConfigT(ConfigT const &other)
KeyValueCompare const & keyCompare() const
ConfigT & operator=(ConfigT &&other)
KeyValueCompare & keyCompare()
ConfigT(clock_type &clock)
ConfigT & operator=(ConfigT const &other)
ElementAllocator & alloc()
ConfigT(clock_type &clock, Compare const &comp)
ConfigT(clock_type &clock, Allocator const &alloc)
KeyValueCompare(Compare const &compare)
bool operator()(Key const &k, Element const &e) const
KeyValueCompare()=default
bool operator()(Element const &x, Element const &y) const
bool operator()(Element const &e, Key const &k) const
Compare const & compare() const
PairValueCompare(PairValueCompare const &other)
value_type second_argument
value_type first_argument
bool operator()(value_type const &lhs, value_type const &rhs) const
PairValueCompare(Compare const &compare)
PairValueCompare()=default
friend AgedOrderedContainer
Associative container where each element is also indexed by time.
std::pair< iterator, iterator > equalRange(K const &k)
void insert(InputIt first, InputIt last)
iterator upperBound(K const &k)
beast::detail::AgedContainerIterator<!IsMap, typename cont_type::iterator > iterator
const_iterator cbegin() const
iterator lowerBound(K const &k)
allocator_type getAllocator() const
AgedOrderedContainer(InputIt first, InputIt last, clock_type &clock, Compare const &comp)
AgedOrderedContainer(InputIt first, InputIt last, clock_type &clock, Compare const &comp, Allocator const &alloc)
beast::detail::AgedOrderedContainer< false, true, Key, T, Clock, Compare, Allocator >< beast::ip::Endpoint, Element, std::chrono::steady_clock, std::less< beast::ip::Endpoint >, Allocator >::clock clock_type & clock()
beast::detail::AgedContainerIterator< true, typename cont_type::iterator > const_iterator
iterator insert(const_iterator, value_type &&value)
bool operator>=(AgedOrderedContainer< OtherIsMulti, OtherIsMap, Key, OtherT, OtherDuration, Compare, OtherAllocator > const &other) const
AgedOrderedContainer(clock_type &clock, Compare const &comp)
std::allocator_traits< Allocator >::pointer pointer
auto insert(value_type const &value) -> iterator
value_type const & const_reference
iterator find(K const &k)
AgedOrderedContainer(clock_type &clock, Allocator const &alloc)
value_compare valueComp() const
size_type touch(K const &k)
beast::detail::AgedContainerIterator< false, Iterator > erase(beast::detail::AgedContainerIterator< IsConst, Iterator > first, beast::detail::AgedContainerIterator< IsConst, Iterator > last)
size_type count(K const &k) const
key_compare keyComp() const
beast::detail::AgedOrderedContainer< false, true, Key, T, Clock, Compare, Allocator >< beast::ip::Endpoint, Element, std::chrono::steady_clock, std::less< beast::ip::Endpoint >, Allocator >::chronological class beast::detail::AgedOrderedContainer::ChronologicalT chronological
iterator insert(const_iterator, value_type const &value)
std::conditional< IsMap, T, void * >::type const & at(K const &k) const
auto emplaceHint(const_iterator hint, Args &&... args) -> std::pair< iterator, bool > requires(!MaybeMulti)
auto insert(value_type const &value) -> std::pair< iterator, bool > requires(!MaybeMulti)
std::allocator_traits< ElementAllocator > ElementAllocatorTraits
bool operator<=(AgedOrderedContainer< OtherIsMulti, OtherIsMap, Key, OtherT, OtherDuration, Compare, OtherAllocator > const &other) const
const_reverse_iterator rend() const
std::conditional_t< IsMap, PairValueCompare, Compare > value_compare
boost::intrusive::make_list< Element, boost::intrusive::constant_time_size< false > >::type list_type
beast::detail::AgedContainerIterator<!IsMap, typename cont_type::reverse_iterator > reverse_iterator
AgedOrderedContainer & operator=(AgedOrderedContainer const &other)
reverse_iterator rbegin()
size_type size() const noexcept
bool empty() const noexcept
static Key const & extract(value_type const &value)
AgedOrderedContainer & operator=(AgedOrderedContainer &&other)
beast::detail::AgedContainerIterator< false, Iterator > erase(beast::detail::AgedContainerIterator< IsConst, Iterator > pos)
bool operator<(AgedOrderedContainer< OtherIsMulti, OtherIsMap, Key, OtherT, OtherDuration, Compare, OtherAllocator > const &other) const
void touch(beast::detail::AgedContainerIterator< IsConst, Iterator > pos, clock_type::time_point const &now)
iterator iteratorTo(value_type &value)
const_iterator lowerBound(K const &k) const
std::integral_constant< bool, IsMap > is_map
beast::detail::AgedOrderedContainer< false, true, Key, T, Clock, Compare, Allocator >< beast::ip::Endpoint, Element, std::chrono::steady_clock, std::less< beast::ip::Endpoint >, Allocator >::config_ ConfigT config_
AgedOrderedContainer()=delete
beast::detail::AgedOrderedContainer< false, true, Key, T, Clock, Compare, Allocator >< beast::ip::Endpoint, Element, std::chrono::steady_clock, std::less< beast::ip::Endpoint >, Allocator >::cont_ cont_type cont_
AgedOrderedContainer(std::initializer_list< value_type > init, clock_type &clock, Compare const &comp, Allocator const &alloc)
Element * newElement(Args &&... args)
std::ptrdiff_t difference_type
void swap(AgedOrderedContainer &other) noexcept
AgedOrderedContainer & operator=(std::initializer_list< value_type > init)
std::conditional_t< IsMap, std::pair< Key const, T >, Key > value_type
beast::detail::AgedContainerIterator< true, typename cont_type::reverse_iterator > const_reverse_iterator
AbstractClock< Clock > clock_type
const_iterator begin() const
AgedOrderedContainer(AgedOrderedContainer const &other)
std::integral_constant< bool, IsMulti > is_multi
std::conditional_t< IsMulti, iterator, std::pair< iterator, bool > > insert(const_iterator hint, P &&value)
auto insert(const_iterator hint, value_type &&value) -> iterator requires(!MaybeMulti)
std::conditional_t< IsMulti, typename boost::intrusive::make_multiset< Element, boost::intrusive::constant_time_size< true >, boost::intrusive::compare< KeyValueCompare > >::type, typename boost::intrusive::make_set< Element, boost::intrusive::constant_time_size< true >, boost::intrusive::compare< KeyValueCompare > >::type > cont_type
void swapData(AgedOrderedContainer &other) noexcept
std::pair< const_iterator, const_iterator > equalRange(K const &k) const
void swapData(AgedOrderedContainer &other) noexcept
const_iterator end() const
iterator emplaceHint(const_iterator, Args &&... args)
AgedOrderedContainer(clock_type &clock, Compare const &comp, Allocator const &alloc)
auto emplace(Args &&... args) -> std::pair< iterator, bool > requires(!MaybeMulti)
AgedOrderedContainer(std::initializer_list< value_type > init, clock_type &clock, Compare const &comp)
const_reverse_iterator rbegin() const
AgedOrderedContainer(AgedOrderedContainer const &other, Allocator const &alloc)
auto insert(const_iterator hint, value_type const &value) -> iterator requires(!MaybeMulti)
bool operator>(AgedOrderedContainer< OtherIsMulti, OtherIsMap, Key, OtherT, OtherDuration, Compare, OtherAllocator > const &other) const
bool operator==(AgedOrderedContainer< OtherIsMulti, OtherIsMap, Key, OtherT, OtherDuration, Compare, OtherAllocator > const &other) const
std::conditional_t< IsMap, T, void * > & operator[](Key const &key)
size_type maxSize() const noexcept
auto insert(value_type &&value) -> iterator requires(MaybeMulti &&!MaybeMap)
clock_type::duration duration
std::allocator_traits< Allocator >::const_pointer const_pointer
clock_type const & clock() const
AgedOrderedContainer(InputIt first, InputIt last, clock_type &clock)
std::conditional_t< IsMap, T, void * > & at(K const &k)
void unlinkAndDeleteElement(Element const *p)
std::false_type is_unordered
void deleteElement(Element const *p)
auto erase(K const &k) -> size_type
std::allocator_traits< Allocator >::template rebind_alloc< Element > ElementAllocator
const_reverse_iterator crend() const
clock_type::time_point time_point
auto insert(value_type &&value) -> std::pair< iterator, bool > requires(!MaybeMulti &&!MaybeMap)
AgedOrderedContainer(std::initializer_list< value_type > init, clock_type &clock)
std::conditional_t< IsMulti, iterator, std::pair< iterator, bool > > insert(P &&value)
void touch(beast::detail::AgedContainerIterator< IsConst, Iterator > pos)
const_iterator iteratorTo(value_type const &value) const
AgedOrderedContainer(AgedOrderedContainer &&other)
AgedOrderedContainer(InputIt first, InputIt last, clock_type &clock, Allocator const &alloc)
const_iterator upperBound(K const &k) const
auto emplace(Args &&... args) -> iterator
AgedOrderedContainer(clock_type &clock)
std::conditional_t< IsMap, T, void * > & operator[](Key &&key)
const_iterator find(K const &k) const
const_reverse_iterator crbegin() const
const_iterator cend() const
void insert(std::initializer_list< value_type > init)
AgedOrderedContainer(std::initializer_list< value_type > init, clock_type &clock, Allocator const &alloc)
AgedOrderedContainer(AgedOrderedContainer &&other, Allocator const &alloc)
EmptyBaseOptimization()=default
T forward_as_tuple(T... args)
T lexicographical_compare(T... args)
int compare(SemanticVersion const &lhs, SemanticVersion const &rhs)
Compare two SemanticVersions against each other.
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
AgedOrderedContainer::value_type value_type
AgedOrderedContainer::time_point time_point
Element(time_point const &when, Args &&... args)
Element(time_point const &when, value_type &&value)
Element(time_point const &when, value_type const &value)
IsBoostReverseIterator()=default
IsBoostReverseIterator()=default