1#include <xrpl/beast/clock/manual_clock.h>
2#include <xrpl/beast/container/aged_map.h>
3#include <xrpl/beast/container/aged_multimap.h>
4#include <xrpl/beast/container/aged_multiset.h>
5#include <xrpl/beast/container/aged_set.h>
6#include <xrpl/beast/container/aged_unordered_map.h>
7#include <xrpl/beast/container/aged_unordered_multimap.h>
8#include <xrpl/beast/container/aged_unordered_multiset.h>
9#include <xrpl/beast/container/aged_unordered_set.h>
10#include <xrpl/beast/container/detail/aged_ordered_container.h>
11#include <xrpl/beast/container/detail/aged_unordered_container.h>
12#include <xrpl/beast/unit_test/suite.h>
25#ifndef BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
27#define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 0
29#define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 1
33#ifndef BEAST_CONTAINER_EXTRACT_NOREF
35#define BEAST_CONTAINER_EXTRACT_NOREF 1
37#define BEAST_CONTAINER_EXTRACT_NOREF 1
62 return less_(lhs, rhs);
102 return eq_(lhs, rhs);
144 return !(*
this == o);
150 return static_cast<T*
>(::operator
new(n *
sizeof(T)));
156 ::operator
delete(p);
159#if !BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
171 template <
class Base,
bool IsUnordered>
187 template <
class Base>
205 template <
class Base,
bool IsMulti>
218 template <
class Base>
231 template <
class Base,
bool IsMap>
239 static Base::Key
const&
267 template <
class Base>
275 static Base::Key
const&
304 template <
class Base,
bool IsUnordered = Base::is_unordered::value>
311 Base::is_multi::value,
315 typename Base::Clock,
321 template <
class Base>
329 Base::is_multi::value,
333 typename Base::Clock,
348 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
350 :
MaybeUnordered<MaybeMulti<MaybeMap<TestTraitsBase, IsMap>, IsMulti>, IsUnordered>
357 using typename Base::Key;
369 return std::string(
"aged_") + Base::name_ordered_part() + Base::name_multi_part() +
370 Base::name_map_part();
374 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
376 ContType<TestTraitsHelper<IsUnordered, IsMulti, IsMap>>
380 template <
class Cont>
387 template <
class Traits>
391 operator()(Traits::Value
const& lhs, Traits::Value
const& rhs)
393 return Traits::extract(lhs) == Traits::extract(rhs);
397 template <
class Cont>
406 template <
class Container,
class Values>
409 requires(Container::is_map::value && !Container::is_multi::value);
411 template <
class Container,
class Values>
414 requires(!(Container::is_map::value && !Container::is_multi::value))
419 template <
class C,
class Values>
424 template <
class C,
class Values>
431 template <
class C,
class Values>
435 template <
class Cont,
class Values>
439 template <
class Cont>
446 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
449 requires(!IsUnordered);
452 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
455 requires IsUnordered;
458 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
461 requires(!IsUnordered);
464 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
467 requires IsUnordered;
470 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
473 requires(!IsUnordered);
476 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
479 requires IsUnordered;
483 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
489 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
494 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
497 requires(!IsUnordered);
499 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
508 template <
class Container,
class Values>
512 template <
class Container,
class Values>
516 template <
class Container,
class Values>
520 template <
class Container,
class Values>
524 template <
class Container,
class Values>
528 template <
class Container,
class Values>
532 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
538 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
545 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
548 requires(IsMap && !IsMulti);
550 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
553 requires(!IsMap || IsMulti)
560 template <
class Container,
class Values>
564 template <
class Iter>
570 template <
class Container,
class Iter>
572 doElementErase(Container& c, Iter
const beginItr, Iter
const endItr);
574 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
580 template <
class Container,
class BeginEndSrc>
582 doRangeErase(Container& c, BeginEndSrc
const& beginEndSrc);
584 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
591 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
594 requires(!IsUnordered);
596 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
606 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
609 requires(!IsUnordered);
612 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
615 requires IsUnordered;
619 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
623 template <
bool IsUnordered,
bool IsMulti>
627 template <
bool IsUnordered>
636template <class Container, class Values>
639 requires(Container::is_map::value && !Container::is_multi::value)
643 BEAST_EXPECT(c.empty());
644 BEAST_EXPECT(c.size() == 0);
651 for (auto const& e : v)
653 for (auto const& e : v)
654 BEAST_EXPECT(c.operator[](e.first) == e.second);
658 fail(
"caught exception");
663template <
class C,
class Values>
671 using size_type = Cont::size_type;
672 auto const hash(c.hashFunction());
673 auto const keyEq(c.keyEq());
674 for (size_type i(0); i < c.bucketCount(); ++i)
676 auto const last(c.end(i));
677 for (
auto iter(c.begin(i)); iter != last; ++iter)
680 return Traits::extract(*iter) == Traits::extract(e);
682 BEAST_EXPECT(match != v.end());
683 BEAST_EXPECT(keyEq(Traits::extract(*iter), Traits::extract(*match)));
684 BEAST_EXPECT(hash(Traits::extract(*iter)) == hash(Traits::extract(*match)));
689template <
class C,
class Values>
694 using size_type = Cont::size_type;
696 BEAST_EXPECT(c.size() == v.size());
697 BEAST_EXPECT(size_type(
std::distance(c.begin(), c.end())) == v.size());
698 BEAST_EXPECT(size_type(
std::distance(c.cbegin(), c.cend())) == v.size());
700 size_type(
std::distance(c.chronological.begin(), c.chronological.end())) == v.size());
702 size_type(
std::distance(c.chronological.cbegin(), c.chronological.cend())) == v.size());
704 size_type(
std::distance(c.chronological.rbegin(), c.chronological.rend())) == v.size());
706 size_type(
std::distance(c.chronological.crbegin(), c.chronological.crend())) == v.size());
711template <
class Cont,
class Values>
726 using Values = Traits::Values;
737template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
740 requires(!IsUnordered)
743 using Comp = Traits::Comp;
744 using Alloc = Traits::Alloc;
745 using MyComp = Traits::MyComp;
746 using MyAlloc = Traits::MyAlloc;
747 typename Traits::ManualClock clock;
753 typename Traits::template Cont<Comp, Alloc> c(clock);
758 typename Traits::template Cont<MyComp, Alloc> c(clock, MyComp(1));
763 typename Traits::template Cont<Comp, MyAlloc> c(clock, MyAlloc(1));
768 typename Traits::template Cont<MyComp, MyAlloc> c(clock, MyComp(1), MyAlloc(1));
774template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
779 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
780 using Hash = Traits::Hash;
781 using Equal = Traits::Equal;
782 using Alloc = Traits::Alloc;
783 using MyHash = Traits::MyHash;
784 using MyEqual = Traits::MyEqual;
785 using MyAlloc = Traits::MyAlloc;
786 typename Traits::ManualClock clock;
791 typename Traits::template Cont<Hash, Equal, Alloc> c(clock);
796 typename Traits::template Cont<MyHash, Equal, Alloc> c(clock, MyHash(1));
801 typename Traits::template Cont<Hash, MyEqual, Alloc> c(clock, MyEqual(1));
806 typename Traits::template Cont<Hash, Equal, MyAlloc> c(clock, MyAlloc(1));
811 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(clock, MyHash(1), MyEqual(1));
816 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(clock, MyHash(1), MyAlloc(1));
821 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(clock, MyEqual(1), MyAlloc(1));
826 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
827 clock, MyHash(1), MyEqual(1), MyAlloc(1));
833template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
836 requires(!IsUnordered)
839 using Comp = Traits::Comp;
840 using Alloc = Traits::Alloc;
841 using MyComp = Traits::MyComp;
842 using MyAlloc = Traits::MyAlloc;
843 typename Traits::ManualClock clock;
844 auto const v(Traits::values());
850 typename Traits::template Cont<Comp, Alloc> c(v.begin(), v.end(), clock);
855 typename Traits::template Cont<MyComp, Alloc> c(v.begin(), v.end(), clock, MyComp(1));
860 typename Traits::template Cont<Comp, MyAlloc> c(v.begin(), v.end(), clock, MyAlloc(1));
865 typename Traits::template Cont<MyComp, MyAlloc> c(
866 v.begin(), v.end(), clock, MyComp(1), MyAlloc(1));
873 typename Traits::template Cont<Comp, Alloc> c1(v.begin(), v.end(), clock);
874 typename Traits::template Cont<Comp, Alloc> c2(clock);
881template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
886 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
887 using Hash = Traits::Hash;
888 using Equal = Traits::Equal;
889 using Alloc = Traits::Alloc;
890 using MyHash = Traits::MyHash;
891 using MyEqual = Traits::MyEqual;
892 using MyAlloc = Traits::MyAlloc;
893 typename Traits::ManualClock clock;
894 auto const v(Traits::values());
900 typename Traits::template Cont<Hash, Equal, Alloc> c(v.begin(), v.end(), clock);
905 typename Traits::template Cont<MyHash, Equal, Alloc> c(
906 v.begin(), v.end(), clock, MyHash(1));
911 typename Traits::template Cont<Hash, MyEqual, Alloc> c(
912 v.begin(), v.end(), clock, MyEqual(1));
917 typename Traits::template Cont<Hash, Equal, MyAlloc> c(
918 v.begin(), v.end(), clock, MyAlloc(1));
923 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(
924 v.begin(), v.end(), clock, MyHash(1), MyEqual(1));
929 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(
930 v.begin(), v.end(), clock, MyHash(1), MyAlloc(1));
935 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(
936 v.begin(), v.end(), clock, MyEqual(1), MyAlloc(1));
941 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
942 v.begin(), v.end(), clock, MyHash(1), MyEqual(1), MyAlloc(1));
948template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
951 requires(!IsUnordered)
954 typename Traits::ManualClock
const clock;
965template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
970 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
971 typename Traits::ManualClock
const clock;
986template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
991 using Alloc = Traits::Alloc;
992 typename Traits::ManualClock clock;
993 auto const v(Traits::values());
1001 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1002 typename Traits::template Cont<> c2(c);
1005 BEAST_EXPECT(c == c2);
1010 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1011 typename Traits::template Cont<> c2(c, Alloc());
1014 BEAST_EXPECT(c == c2);
1019 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1020 typename Traits::template Cont<> c2(clock);
1024 BEAST_EXPECT(c == c2);
1031 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1032 typename Traits::template Cont<> c2(std::move(c));
1037 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1038 typename Traits::template Cont<> c2(std::move(c), Alloc());
1043 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1044 typename Traits::template Cont<> c2(clock);
1056template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1061 typename Traits::ManualClock clock;
1062 auto const v(Traits::values());
1067 typename Traits::template Cont<> c{clock};
1069 using iterator =
decltype(c.begin());
1070 using const_iterator =
decltype(c.cbegin());
1073 iterator
const nnIt0{c.begin()};
1074 iterator
const nnIt1{nnIt0};
1075 BEAST_EXPECT(nnIt0 == nnIt1);
1078 BEAST_EXPECT(nnIt1 == nnIt2);
1082 const_iterator
const ccIt0{c.cbegin()};
1083 const_iterator
const ccIt1{ccIt0};
1084 BEAST_EXPECT(ccIt0 == ccIt1);
1085 const_iterator ccIt2;
1087 BEAST_EXPECT(ccIt1 == ccIt2);
1090 BEAST_EXPECT(nnIt0 == ccIt0);
1091 BEAST_EXPECT(ccIt1 == nnIt1);
1094 const_iterator
const ncIt3{c.begin()};
1095 const_iterator
const ncIt4{nnIt0};
1096 BEAST_EXPECT(ncIt3 == ncIt4);
1097 const_iterator ncIt5;
1099 BEAST_EXPECT(ncIt5 == ncIt4);
1112template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1115 requires(!IsUnordered)
1118 typename Traits::ManualClock clock;
1119 auto const v(Traits::values());
1124 typename Traits::template Cont<> c{clock};
1126 using iterator =
decltype(c.begin());
1127 using reverse_iterator =
decltype(c.rbegin());
1128 using const_reverse_iterator =
decltype(c.crbegin());
1139 reverse_iterator
const rNrNit0{c.rbegin()};
1140 reverse_iterator
const rNrNit1{rNrNit0};
1141 BEAST_EXPECT(rNrNit0 == rNrNit1);
1142 reverse_iterator xXrNit2;
1144 BEAST_EXPECT(rNrNit1 == xXrNit2);
1148 const_reverse_iterator
const rCrCit0{c.crbegin()};
1149 const_reverse_iterator
const rCrCit1{rCrCit0};
1150 BEAST_EXPECT(rCrCit0 == rCrCit1);
1151 const_reverse_iterator xXrCit2;
1153 BEAST_EXPECT(rCrCit1 == xXrCit2);
1156 BEAST_EXPECT(rNrNit0 == rCrCit0);
1157 BEAST_EXPECT(rCrCit1 == rNrNit1);
1161 const_reverse_iterator
const rNrCit0{c.rbegin()};
1162 const_reverse_iterator
const rNrCit1{rNrNit0};
1163 BEAST_EXPECT(rNrCit0 == rNrCit1);
1165 BEAST_EXPECT(rNrCit1 == xXrCit2);
1173 reverse_iterator
const fNrNit0{c.begin()};
1174 const_reverse_iterator
const fNrCit0{c.begin()};
1175 BEAST_EXPECT(fNrNit0 == fNrCit0);
1176 const_reverse_iterator
const fCrCit0{c.cbegin()};
1177 BEAST_EXPECT(fNrCit0 == fCrCit0);
1187 iterator
const xXfNit0;
1198template <
class Container,
class Values>
1202 for (
auto const& e : v)
1207template <
class Container,
class Values>
1213 c.insert(std::move(e));
1217template <
class Container,
class Values>
1221 for (
auto const& e : v)
1222 c.insert(c.cend(), e);
1226template <
class Container,
class Values>
1232 c.insert(c.cend(), std::move(e));
1236template <
class Container,
class Values>
1240 for (
auto const& e : v)
1245template <
class Container,
class Values>
1249 for (
auto const& e : v)
1250 c.emplace_hint(c.cend(), e);
1254template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1259 typename Traits::ManualClock clock;
1260 auto const v(Traits::values());
1267 typename Traits::template Cont<> c(clock);
1272 typename Traits::template Cont<> c(clock);
1277 typename Traits::template Cont<> c(clock);
1282 typename Traits::template Cont<> c(clock);
1287 typename Traits::template Cont<> c(clock);
1292 typename Traits::template Cont<> c(clock);
1297 typename Traits::template Cont<> c(clock);
1302 typename Traits::template Cont<> c(clock);
1313template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1318 typename Traits::ManualClock clock;
1319 auto const v(Traits::values());
1324 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1329 for (
auto iter(v.crbegin()); iter != v.crend(); ++iter)
1331 using iterator =
decltype(c)::iterator;
1332 iterator
const found(c.find(Traits::extract(*iter)));
1334 BEAST_EXPECT(found != c.cend());
1335 if (found == c.cend())
1342 c.chronological.cbegin(),
1343 c.chronological.cend(),
1349 for (
auto iter(v.cbegin()); iter != v.cend(); ++iter)
1351 using const_iterator =
decltype(c)::const_iterator;
1352 const_iterator
const found(c.find(Traits::extract(*iter)));
1354 BEAST_EXPECT(found != c.cend());
1355 if (found == c.cend())
1377template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1380 requires(IsMap && !IsMulti)
1383 typename Traits::ManualClock clock;
1384 auto v(Traits::values());
1391 typename Traits::template Cont<> c(clock);
1392 for (
auto const& e : v)
1393 c[e.first] = e.second;
1399 typename Traits::template Cont<> c(clock);
1401 c[std::move(e.first)] = e.second;
1412template <
class Container,
class Values>
1422 auto& clk =
dynamic_cast<ManualClock&
>(c.clock());
1438template <
class Iter>
1442 if (beginIter == endIter)
1444 fail(
"Internal test failure. Cannot advance beginIter");
1449 Iter nextToEnd = beginIter;
1452 nextToEnd = beginIter++;
1453 }
while (beginIter != endIter);
1470template <
class Container,
class Iter>
1474 Iter
const beginItr,
1478 size_t count = c.size();
1479 while (it != endItr)
1487 fail(
"Unexpected returned iterator from element erase");
1492 if (count != c.size())
1494 fail(
"Failed to erase element");
1502 fail(
"Erase of last element didn't produce end");
1516template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1526 typename Traits::ManualClock clock;
1527 typename Traits::template Cont<> c{clock};
1532 auto tempContainer(c);
1533 if (!
doElementErase(tempContainer, tempContainer.cbegin(), tempContainer.cend()))
1536 BEAST_EXPECT(tempContainer.empty());
1541 auto tempContainer(c);
1542 auto& chron(tempContainer.chronological);
1546 BEAST_EXPECT(tempContainer.empty());
1551 auto tempContainer(c);
1552 BEAST_EXPECT(tempContainer.size() > 2);
1555 ++tempContainer.begin(),
1559 BEAST_EXPECT(tempContainer.size() == 2);
1564 auto tempContainer(c);
1565 BEAST_EXPECT(tempContainer.size() > 2);
1566 auto& chron(tempContainer.chronological);
1568 tempContainer, ++chron.begin(),
nextToEndIter(chron.begin(), chron.end())))
1571 BEAST_EXPECT(tempContainer.size() == 2);
1575 auto tempContainer(c);
1576 BEAST_EXPECT(tempContainer.size() > 4);
1601template <
class Container,
class BeginEndSrc>
1605 BEAST_EXPECT(c.size() > 2);
1606 auto itBeginPlusOne(beginEndSrc.begin());
1607 auto const valueFront = *itBeginPlusOne;
1611 auto itBack(
nextToEndIter(itBeginPlusOne, beginEndSrc.end()));
1612 auto const valueBack = *itBack;
1615 auto const retIter = c.erase(itBeginPlusOne, itBack);
1617 BEAST_EXPECT(c.size() == 2);
1618 BEAST_EXPECT(valueFront == *(beginEndSrc.begin()));
1619 BEAST_EXPECT(valueBack == *(++beginEndSrc.begin()));
1620 BEAST_EXPECT(retIter == (++beginEndSrc.begin()));
1629template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1639 typename Traits::ManualClock clock;
1640 typename Traits::template Cont<> c{clock};
1645 auto tempContainer(c);
1649 auto tempContainer(c);
1650 doRangeErase(tempContainer, tempContainer.chronological);
1661template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1664 requires(!IsUnordered)
1667 typename Traits::ManualClock clock;
1668 auto const v(Traits::values());
1673 typename Traits::template Cont<>
const c1(v.begin(), v.end(), clock);
1675 typename Traits::template Cont<> c2(v.begin(), v.end(), clock);
1676 c2.erase(c2.cbegin());
1693template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1696 requires(!IsUnordered)
1699 typename Traits::ManualClock clock;
1704 typename Traits::template Cont<>
const c(clock);
1712template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1715 requires IsUnordered
1717 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
1718 typename Traits::ManualClock clock;
1723 typename Traits::template Cont<>
const c(clock);
1736template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1767 "bad alias: aged_set");
1771 "bad alias: aged_multiset");
1775 "bad alias: aged_map");
1779 "bad alias: aged_multimap");
1785 "bad alias: aged_unordered_set");
1791 "bad alias: aged_unordered_multiset");
1797 "bad alias: aged_unordered_map");
1803 "bad alias: aged_unordered_multimap");
std::size_t operator()(T const &t) const
static std::string nameMapPart()
static Base::Key const & extract(Value const &value)
std::vector< Value > Values
std::pair< typename Base::Key, T > Value
static Base::Key const & extract(Value const &value)
static std::string nameMapPart()
std::vector< Value > Values
static std::string nameMultiPart()
static std::string nameMultiPart()
std::hash< typename Base::Key > Hash
static std::string nameOrderedPart()
EqualT< typename Base::Key > MyEqual
HashT< typename Base::Key > MyHash
std::equal_to< typename Base::Key > Equal
std::less< typename Base::Key > Comp
static std::string nameOrderedPart()
CompT< typename Base::Key > MyComp
void checkInsertHintMove(Container &c, Values const &v)
void testConstructRange()
void reverseFillAgedContainer(Container &c, Values const &v)
bool doElementErase(Container &c, Iter const beginItr, Iter const endItr)
void checkMapContents(Container &c, Values const &v)
void checkContentsRefRef(C &&c, Values const &v)
static std::string name(Cont const &)
void testReverseIterator()
void testConstructInitList()
void testMaybeUnorderedMultiMap()
void checkEmplaceHint(Container &c, Values const &v)
void checkInsertCopy(Container &c, Values const &v)
void doRangeErase(Container &c, BeginEndSrc const &beginEndSrc)
void checkInsertMove(Container &c, Values const &v)
void checkEmplace(Container &c, Values const &v)
static std::vector< typename Cont::value_type > makeList(Cont const &c)
void testConstructEmpty()
void checkUnorderedContentsRefRef(C &&, Values const &)
void checkInsertHintCopy(Container &c, Values const &v)
void checkUnorderedContentsRefRef(C &&c, Values const &v)
Iter nextToEndIter(Iter const beginIter, Iter const endItr)
void testConstructEmpty()
void testMaybeUnorderedMulti()
void checkMapContents(Container, Values const &)
void testMaybeUnordered()
void checkContents(Cont &c, Values const &v)
Manual clock implementation.
void set(time_point const &when)
Set the current time of the manual clock.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
void run() override
Runs the suite.
Associative container where each element is also indexed by time.
Associative container where each element is also indexed by time.
bool unexpected(Condition shouldBeFalse, String const &reason)
DEPRECATED.
void pass()
Record a successful test condition.
bool expect(Condition const &shouldBeTrue)
Evaluate a test condition.
void fail(String const &reason, char const *file, int line)
Record a failure.
TestcaseT testcase
Memberspace for declaring test cases.
detail::AgedOrderedContainer< false, false, Key, void, Clock, Compare, Allocator > aged_set
detail::AgedUnorderedContainer< true, true, Key, T, Clock, Hash, KeyEqual, Allocator > aged_unordered_multimap
detail::AgedUnorderedContainer< false, false, Key, void, Clock, Hash, KeyEqual, Allocator > aged_unordered_set
detail::AgedUnorderedContainer< true, false, Key, void, Clock, Hash, KeyEqual, Allocator > aged_unordered_multiset
detail::AgedOrderedContainer< true, true, Key, T, Clock, Compare, Allocator > aged_multimap
detail::AgedUnorderedContainer< false, true, Key, T, Clock, Hash, KeyEqual, Allocator > aged_unordered_map
detail::AgedOrderedContainer< true, false, Key, void, Clock, Compare, Allocator > aged_multiset
BEAST_DEFINE_TESTSUITE(aged_set, beast, beast)
detail::AgedOrderedContainer< false, true, Key, T, Clock, Compare, Allocator > aged_map
AllocT(AllocT< U > const &)
bool operator==(AllocT< U > const &) const
AllocT(AllocT const &)=default
T * allocate(std::size_t n, T const *=nullptr)
bool operator!=(AllocT< U > const &o) const
void deallocate(T *p, std::size_t)
bool operator()(T const &lhs, T const &rhs) const
detail::AgedUnorderedContainer< Base::is_multi::value, Base::is_map::value, typename Base::Key, typename Base::T, typename Base::Clock, Hash, KeyEqual, Allocator > Cont
detail::AgedOrderedContainer< Base::is_multi::value, Base::is_map::value, typename Base::Key, typename Base::T, typename Base::Clock, Compare, Allocator > Cont
bool operator()(T const &lhs, T const &rhs) const
bool operator()(Traits::Value const &lhs, Traits::Value const &rhs)
std::chrono::steady_clock Clock
beast::ManualClock< Clock > ManualClock
AllocT< typename Base::Value > MyAlloc
MaybeUnordered< MaybeMulti< MaybeMap< TestTraitsBase, IsMap >, IsMulti >, IsUnordered > Base
std::integral_constant< bool, IsMap > is_map
std::integral_constant< bool, IsMulti > is_multi
std::allocator< typename Base::Value > Alloc
static std::string name()
std::integral_constant< bool, IsUnordered > is_unordered