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>
410 template <
class Container,
class Values>
411 std::enable_if_t<!(Container::is_map::value && !Container::is_multi::value)>
417 template <
class C,
class Values>
421 template <
class C,
class Values>
427 template <
class C,
class Values>
431 template <
class Cont,
class Values>
435 template <
class Cont>
442 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
447 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
452 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
457 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
462 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
467 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
473 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
479 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
484 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
488 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
496 template <
class Container,
class Values>
500 template <
class Container,
class Values>
504 template <
class Container,
class Values>
508 template <
class Container,
class Values>
512 template <
class Container,
class Values>
516 template <
class Container,
class Values>
520 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
526 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
533 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
537 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
546 template <
class Container,
class Values>
550 template <
class Iter>
556 template <
class Container,
class Iter>
558 doElementErase(Container& c, Iter
const beginItr, Iter
const endItr);
560 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
566 template <
class Container,
class BeginEndSrc>
568 doRangeErase(Container& c, BeginEndSrc
const& beginEndSrc);
570 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
577 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
581 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
590 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
595 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
601 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
605 template <
bool IsUnordered,
bool IsMulti>
609 template <
bool IsUnordered>
618template <
class Container,
class Values>
624 BEAST_EXPECT(c.empty());
625 BEAST_EXPECT(c.size() == 0);
632 for (
auto const& e : v)
634 for (
auto const& e : v)
635 BEAST_EXPECT(c.operator[](e.first) == e.second);
639 fail(
"caught exception");
644template <
class C,
class Values>
651 using size_type = Cont::size_type;
652 auto const hash(c.hashFunction());
653 auto const keyEq(c.keyEq());
654 for (size_type i(0); i < c.bucketCount(); ++i)
656 auto const last(c.end(i));
657 for (
auto iter(c.begin(i)); iter != last; ++iter)
660 return Traits::extract(*iter) == Traits::extract(e);
662 BEAST_EXPECT(match != v.end());
663 BEAST_EXPECT(keyEq(Traits::extract(*iter), Traits::extract(*match)));
664 BEAST_EXPECT(hash(Traits::extract(*iter)) == hash(Traits::extract(*match)));
669template <
class C,
class Values>
674 using size_type = Cont::size_type;
676 BEAST_EXPECT(c.size() == v.size());
677 BEAST_EXPECT(size_type(
std::distance(c.begin(), c.end())) == v.size());
678 BEAST_EXPECT(size_type(
std::distance(c.cbegin(), c.cend())) == v.size());
680 size_type(
std::distance(c.chronological.begin(), c.chronological.end())) == v.size());
682 size_type(
std::distance(c.chronological.cbegin(), c.chronological.cend())) == v.size());
684 size_type(
std::distance(c.chronological.rbegin(), c.chronological.rend())) == v.size());
686 size_type(
std::distance(c.chronological.crbegin(), c.chronological.crend())) == v.size());
691template <
class Cont,
class Values>
706 using Values = Traits::Values;
717template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
722 using Comp = Traits::Comp;
723 using Alloc = Traits::Alloc;
724 using MyComp = Traits::MyComp;
725 using MyAlloc = Traits::MyAlloc;
726 typename Traits::ManualClock clock;
732 typename Traits::template Cont<Comp, Alloc> c(clock);
737 typename Traits::template Cont<MyComp, Alloc> c(clock, MyComp(1));
742 typename Traits::template Cont<Comp, MyAlloc> c(clock, MyAlloc(1));
747 typename Traits::template Cont<MyComp, MyAlloc> c(clock, MyComp(1), MyAlloc(1));
753template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
758 using Hash = Traits::Hash;
759 using Equal = Traits::Equal;
760 using Alloc = Traits::Alloc;
761 using MyHash = Traits::MyHash;
762 using MyEqual = Traits::MyEqual;
763 using MyAlloc = Traits::MyAlloc;
764 typename Traits::ManualClock clock;
769 typename Traits::template Cont<Hash, Equal, Alloc> c(clock);
774 typename Traits::template Cont<MyHash, Equal, Alloc> c(clock, MyHash(1));
779 typename Traits::template Cont<Hash, MyEqual, Alloc> c(clock, MyEqual(1));
784 typename Traits::template Cont<Hash, Equal, MyAlloc> c(clock, MyAlloc(1));
789 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(clock, MyHash(1), MyEqual(1));
794 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(clock, MyHash(1), MyAlloc(1));
799 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(clock, MyEqual(1), MyAlloc(1));
804 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
805 clock, MyHash(1), MyEqual(1), MyAlloc(1));
811template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
816 using Comp = Traits::Comp;
817 using Alloc = Traits::Alloc;
818 using MyComp = Traits::MyComp;
819 using MyAlloc = Traits::MyAlloc;
820 typename Traits::ManualClock clock;
821 auto const v(Traits::values());
827 typename Traits::template Cont<Comp, Alloc> c(v.begin(), v.end(), clock);
832 typename Traits::template Cont<MyComp, Alloc> c(v.begin(), v.end(), clock, MyComp(1));
837 typename Traits::template Cont<Comp, MyAlloc> c(v.begin(), v.end(), clock, MyAlloc(1));
842 typename Traits::template Cont<MyComp, MyAlloc> c(
843 v.begin(), v.end(), clock, MyComp(1), MyAlloc(1));
850 typename Traits::template Cont<Comp, Alloc> c1(v.begin(), v.end(), clock);
851 typename Traits::template Cont<Comp, Alloc> c2(clock);
858template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
863 using Hash = Traits::Hash;
864 using Equal = Traits::Equal;
865 using Alloc = Traits::Alloc;
866 using MyHash = Traits::MyHash;
867 using MyEqual = Traits::MyEqual;
868 using MyAlloc = Traits::MyAlloc;
869 typename Traits::ManualClock clock;
870 auto const v(Traits::values());
876 typename Traits::template Cont<Hash, Equal, Alloc> c(v.begin(), v.end(), clock);
881 typename Traits::template Cont<MyHash, Equal, Alloc> c(
882 v.begin(), v.end(), clock, MyHash(1));
887 typename Traits::template Cont<Hash, MyEqual, Alloc> c(
888 v.begin(), v.end(), clock, MyEqual(1));
893 typename Traits::template Cont<Hash, Equal, MyAlloc> c(
894 v.begin(), v.end(), clock, MyAlloc(1));
899 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(
900 v.begin(), v.end(), clock, MyHash(1), MyEqual(1));
905 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(
906 v.begin(), v.end(), clock, MyHash(1), MyAlloc(1));
911 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(
912 v.begin(), v.end(), clock, MyEqual(1), MyAlloc(1));
917 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
918 v.begin(), v.end(), clock, MyHash(1), MyEqual(1), MyAlloc(1));
924template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
929 typename Traits::ManualClock
const clock;
940template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
945 typename Traits::ManualClock
const clock;
960template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
965 using Alloc = Traits::Alloc;
966 typename Traits::ManualClock clock;
967 auto const v(Traits::values());
975 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
976 typename Traits::template Cont<> c2(c);
979 BEAST_EXPECT(c == c2);
984 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
985 typename Traits::template Cont<> c2(c, Alloc());
988 BEAST_EXPECT(c == c2);
993 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
994 typename Traits::template Cont<> c2(clock);
998 BEAST_EXPECT(c == c2);
1005 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1006 typename Traits::template Cont<> c2(std::move(c));
1011 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1012 typename Traits::template Cont<> c2(std::move(c), Alloc());
1017 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1018 typename Traits::template Cont<> c2(clock);
1030template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1035 typename Traits::ManualClock clock;
1036 auto const v(Traits::values());
1041 typename Traits::template Cont<> c{clock};
1043 using iterator =
decltype(c.begin());
1044 using const_iterator =
decltype(c.cbegin());
1047 iterator
const nnIt0{c.begin()};
1048 iterator
const nnIt1{nnIt0};
1049 BEAST_EXPECT(nnIt0 == nnIt1);
1052 BEAST_EXPECT(nnIt1 == nnIt2);
1056 const_iterator
const ccIt0{c.cbegin()};
1057 const_iterator
const ccIt1{ccIt0};
1058 BEAST_EXPECT(ccIt0 == ccIt1);
1059 const_iterator ccIt2;
1061 BEAST_EXPECT(ccIt1 == ccIt2);
1064 BEAST_EXPECT(nnIt0 == ccIt0);
1065 BEAST_EXPECT(ccIt1 == nnIt1);
1068 const_iterator
const ncIt3{c.begin()};
1069 const_iterator
const ncIt4{nnIt0};
1070 BEAST_EXPECT(ncIt3 == ncIt4);
1071 const_iterator ncIt5;
1073 BEAST_EXPECT(ncIt5 == ncIt4);
1086template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1091 typename Traits::ManualClock clock;
1092 auto const v(Traits::values());
1097 typename Traits::template Cont<> c{clock};
1099 using iterator =
decltype(c.begin());
1100 using reverse_iterator =
decltype(c.rbegin());
1101 using const_reverse_iterator =
decltype(c.crbegin());
1112 reverse_iterator
const rNrNit0{c.rbegin()};
1113 reverse_iterator
const rNrNit1{rNrNit0};
1114 BEAST_EXPECT(rNrNit0 == rNrNit1);
1115 reverse_iterator xXrNit2;
1117 BEAST_EXPECT(rNrNit1 == xXrNit2);
1121 const_reverse_iterator
const rCrCit0{c.crbegin()};
1122 const_reverse_iterator
const rCrCit1{rCrCit0};
1123 BEAST_EXPECT(rCrCit0 == rCrCit1);
1124 const_reverse_iterator xXrCit2;
1126 BEAST_EXPECT(rCrCit1 == xXrCit2);
1129 BEAST_EXPECT(rNrNit0 == rCrCit0);
1130 BEAST_EXPECT(rCrCit1 == rNrNit1);
1134 const_reverse_iterator
const rNrCit0{c.rbegin()};
1135 const_reverse_iterator
const rNrCit1{rNrNit0};
1136 BEAST_EXPECT(rNrCit0 == rNrCit1);
1138 BEAST_EXPECT(rNrCit1 == xXrCit2);
1146 reverse_iterator
const fNrNit0{c.begin()};
1147 const_reverse_iterator
const fNrCit0{c.begin()};
1148 BEAST_EXPECT(fNrNit0 == fNrCit0);
1149 const_reverse_iterator
const fCrCit0{c.cbegin()};
1150 BEAST_EXPECT(fNrCit0 == fCrCit0);
1160 iterator
const xXfNit0;
1171template <
class Container,
class Values>
1175 for (
auto const& e : v)
1180template <
class Container,
class Values>
1186 c.insert(std::move(e));
1190template <
class Container,
class Values>
1194 for (
auto const& e : v)
1195 c.insert(c.cend(), e);
1199template <
class Container,
class Values>
1205 c.insert(c.cend(), std::move(e));
1209template <
class Container,
class Values>
1213 for (
auto const& e : v)
1218template <
class Container,
class Values>
1222 for (
auto const& e : v)
1223 c.emplace_hint(c.cend(), e);
1227template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1232 typename Traits::ManualClock clock;
1233 auto const v(Traits::values());
1240 typename Traits::template Cont<> c(clock);
1245 typename Traits::template Cont<> c(clock);
1250 typename Traits::template Cont<> c(clock);
1255 typename Traits::template Cont<> c(clock);
1260 typename Traits::template Cont<> c(clock);
1265 typename Traits::template Cont<> c(clock);
1270 typename Traits::template Cont<> c(clock);
1275 typename Traits::template Cont<> c(clock);
1286template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1291 typename Traits::ManualClock clock;
1292 auto const v(Traits::values());
1297 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1302 for (
auto iter(v.crbegin()); iter != v.crend(); ++iter)
1304 using iterator =
decltype(c)::iterator;
1305 iterator
const found(c.find(Traits::extract(*iter)));
1307 BEAST_EXPECT(found != c.cend());
1308 if (found == c.cend())
1315 c.chronological.cbegin(),
1316 c.chronological.cend(),
1322 for (
auto iter(v.cbegin()); iter != v.cend(); ++iter)
1324 using const_iterator =
decltype(c)::const_iterator;
1325 const_iterator
const found(c.find(Traits::extract(*iter)));
1327 BEAST_EXPECT(found != c.cend());
1328 if (found == c.cend())
1350template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1355 typename Traits::ManualClock clock;
1356 auto v(Traits::values());
1363 typename Traits::template Cont<> c(clock);
1364 for (
auto const& e : v)
1365 c[e.first] = e.second;
1371 typename Traits::template Cont<> c(clock);
1373 c[std::move(e.first)] = e.second;
1384template <
class Container,
class Values>
1410template <
class Iter>
1414 if (beginIter == endIter)
1416 fail(
"Internal test failure. Cannot advance beginIter");
1421 Iter nextToEnd = beginIter;
1424 nextToEnd = beginIter++;
1425 }
while (beginIter != endIter);
1442template <
class Container,
class Iter>
1446 Iter
const beginItr,
1450 size_t count = c.size();
1451 while (it != endItr)
1459 fail(
"Unexpected returned iterator from element erase");
1464 if (count != c.size())
1466 fail(
"Failed to erase element");
1474 fail(
"Erase of last element didn't produce end");
1488template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1498 typename Traits::ManualClock clock;
1499 typename Traits::template Cont<> c{clock};
1504 auto tempContainer(c);
1505 if (!
doElementErase(tempContainer, tempContainer.cbegin(), tempContainer.cend()))
1508 BEAST_EXPECT(tempContainer.empty());
1513 auto tempContainer(c);
1514 auto& chron(tempContainer.chronological);
1518 BEAST_EXPECT(tempContainer.empty());
1523 auto tempContainer(c);
1524 BEAST_EXPECT(tempContainer.size() > 2);
1527 ++tempContainer.begin(),
1531 BEAST_EXPECT(tempContainer.size() == 2);
1536 auto tempContainer(c);
1537 BEAST_EXPECT(tempContainer.size() > 2);
1538 auto& chron(tempContainer.chronological);
1540 tempContainer, ++chron.begin(),
nextToEndIter(chron.begin(), chron.end())))
1543 BEAST_EXPECT(tempContainer.size() == 2);
1547 auto tempContainer(c);
1548 BEAST_EXPECT(tempContainer.size() > 4);
1573template <
class Container,
class BeginEndSrc>
1577 BEAST_EXPECT(c.size() > 2);
1578 auto itBeginPlusOne(beginEndSrc.begin());
1579 auto const valueFront = *itBeginPlusOne;
1583 auto itBack(
nextToEndIter(itBeginPlusOne, beginEndSrc.end()));
1584 auto const valueBack = *itBack;
1587 auto const retIter = c.erase(itBeginPlusOne, itBack);
1589 BEAST_EXPECT(c.size() == 2);
1590 BEAST_EXPECT(valueFront == *(beginEndSrc.begin()));
1591 BEAST_EXPECT(valueBack == *(++beginEndSrc.begin()));
1592 BEAST_EXPECT(retIter == (++beginEndSrc.begin()));
1601template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1611 typename Traits::ManualClock clock;
1612 typename Traits::template Cont<> c{clock};
1617 auto tempContainer(c);
1621 auto tempContainer(c);
1622 doRangeErase(tempContainer, tempContainer.chronological);
1633template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1638 typename Traits::ManualClock clock;
1639 auto const v(Traits::values());
1644 typename Traits::template Cont<>
const c1(v.begin(), v.end(), clock);
1646 typename Traits::template Cont<> c2(v.begin(), v.end(), clock);
1647 c2.erase(c2.cbegin());
1664template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1669 typename Traits::ManualClock clock;
1674 typename Traits::template Cont<>
const c(clock);
1682template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1687 typename Traits::ManualClock clock;
1692 typename Traits::template Cont<>
const c(clock);
1705template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1736 "bad alias: aged_set");
1740 "bad alias: aged_multiset");
1744 "bad alias: aged_map");
1748 "bad alias: aged_multimap");
1754 "bad alias: aged_unordered_set");
1760 "bad alias: aged_unordered_multiset");
1766 "bad alias: aged_unordered_map");
1772 "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 reverseFillAgedContainer(Container &c, Values const &v)
bool doElementErase(Container &c, Iter const beginItr, Iter const endItr)
std::enable_if_t<!IsUnordered > testCompare()
void checkContentsRefRef(C &&c, Values const &v)
static std::string name(Cont const &)
void testMaybeUnorderedMultiMap()
void checkEmplaceHint(Container &c, Values const &v)
std::enable_if_t<!IsUnordered > testReverseIterator()
void checkInsertCopy(Container &c, Values const &v)
std::enable_if_t< Container::is_map::value &&!Container::is_multi::value > checkMapContents(Container &c, Values const &v)
std::enable_if_t<!(Container::is_map::value &&!Container::is_multi::value)> checkMapContents(Container, Values const &)
void doRangeErase(Container &c, BeginEndSrc const &beginEndSrc)
void checkInsertMove(Container &c, Values const &v)
std::enable_if_t<!std::remove_reference_t< C >::is_unordered::value > checkUnorderedContentsRefRef(C &&, Values const &)
std::enable_if_t<!IsMap||IsMulti > testArrayCreate()
std::enable_if_t<!IsUnordered > testConstructRange()
std::enable_if_t< IsUnordered > testCompare()
void checkEmplace(Container &c, Values const &v)
static std::vector< typename Cont::value_type > makeList(Cont const &c)
std::enable_if_t< IsUnordered > testReverseIterator()
std::enable_if_t<!IsUnordered > testConstructEmpty()
std::enable_if_t< std::remove_reference_t< C >::is_unordered::value > checkUnorderedContentsRefRef(C &&c, Values const &v)
void checkInsertHintCopy(Container &c, Values const &v)
std::enable_if_t<!IsUnordered > testConstructInitList()
Iter nextToEndIter(Iter const beginIter, Iter const endItr)
std::enable_if_t< IsMap &&!IsMulti > testArrayCreate()
void testMaybeUnorderedMulti()
void testMaybeUnordered()
void checkContents(Cont &c, Values const &v)
std::enable_if_t<!IsUnordered > testObservers()
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)
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
bool operator!=(AllocT< U > const &o) const
T * allocate(std::size_t n, T const *=0)
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