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/unit_test.h>
15#ifndef BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
17#define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 0
19#define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 1
23#ifndef BEAST_CONTAINER_EXTRACT_NOREF
25#define BEAST_CONTAINER_EXTRACT_NOREF 1
27#define BEAST_CONTAINER_EXTRACT_NOREF 1
88 return m_eq(lhs, rhs);
131 return !(*
this == o);
137 return static_cast<T*
>(::operator
new(n *
sizeof(T)));
143 ::operator
delete(p);
146#if !BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
159 template <
class Base,
bool IsUnordered>
175 template <
class Base>
193 template <
class Base,
bool IsMulti>
206 template <
class Base>
219 template <
class Base,
bool IsMap>
227 static typename Base::Key
const&
255 template <
class Base>
263 static typename Base::Key
const&
292 template <
class Base,
bool IsUnordered = Base::is_unordered::value>
299 Base::is_multi::value,
303 typename Base::Clock,
309 template <
class Base>
317 Base::is_multi::value,
321 typename Base::Clock,
336 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
338 :
MaybeUnordered<MaybeMulti<MaybeMap<TestTraitsBase, IsMap>, IsMulti>, IsUnordered>
362 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
364 ContType<TestTraitsHelper<IsUnordered, IsMulti, IsMap>>
368 template <
class Cont>
375 template <
class Traits>
379 operator()(
typename Traits::Value
const& lhs,
typename Traits::Value
const& rhs)
381 return Traits::extract(lhs) == Traits::extract(rhs);
385 template <
class Cont>
394 template <
class Container,
class Values>
398 template <
class Container,
class Values>
399 typename std::enable_if<!(Container::is_map::value && !Container::is_multi::value)>::type
405 template <
class C,
class Values>
409 template <
class C,
class Values>
415 template <
class C,
class Values>
419 template <
class Cont,
class Values>
423 template <
class Cont>
430 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
435 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
440 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
445 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
450 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
455 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
461 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
467 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
472 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
476 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
484 template <
class Container,
class Values>
488 template <
class Container,
class Values>
492 template <
class Container,
class Values>
496 template <
class Container,
class Values>
500 template <
class Container,
class Values>
504 template <
class Container,
class Values>
508 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
514 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
521 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
525 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
534 template <
class Container,
class Values>
538 template <
class Iter>
544 template <
class Container,
class Iter>
546 doElementErase(Container& c, Iter
const beginItr, Iter
const endItr);
548 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
554 template <
class Container,
class BeginEndSrc>
556 doRangeErase(Container& c, BeginEndSrc
const& beginEndSrc);
558 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
565 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
569 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
578 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
583 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
589 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
593 template <
bool IsUnordered,
bool IsMulti>
597 template <
bool IsUnordered>
606template <
class Container,
class Values>
612 BEAST_EXPECT(c.empty());
613 BEAST_EXPECT(c.size() == 0);
620 for (
auto const& e : v)
622 for (
auto const& e : v)
623 BEAST_EXPECT(c.operator[](e.first) == e.second);
627 fail(
"caught exception");
632template <
class C,
class Values>
639 using size_type =
typename Cont::size_type;
640 auto const hash(c.hash_function());
641 auto const key_eq(c.key_eq());
642 for (size_type i(0); i < c.bucket_count(); ++i)
644 auto const last(c.end(i));
645 for (
auto iter(c.begin(i)); iter != last; ++iter)
648 std::find_if(v.begin(), v.end(), [iter](
typename Values::value_type
const& e) {
649 return Traits::extract(*iter) == Traits::extract(e);
651 BEAST_EXPECT(match != v.end());
652 BEAST_EXPECT(key_eq(Traits::extract(*iter), Traits::extract(*match)));
653 BEAST_EXPECT(hash(Traits::extract(*iter)) == hash(Traits::extract(*match)));
658template <
class C,
class Values>
663 using size_type =
typename Cont::size_type;
665 BEAST_EXPECT(c.size() == v.size());
666 BEAST_EXPECT(size_type(
std::distance(c.begin(), c.end())) == v.size());
667 BEAST_EXPECT(size_type(
std::distance(c.cbegin(), c.cend())) == v.size());
669 size_type(
std::distance(c.chronological.begin(), c.chronological.end())) == v.size());
671 size_type(
std::distance(c.chronological.cbegin(), c.chronological.cend())) == v.size());
673 size_type(
std::distance(c.chronological.rbegin(), c.chronological.rend())) == v.size());
675 size_type(
std::distance(c.chronological.crbegin(), c.chronological.crend())) == v.size());
680template <
class Cont,
class Values>
695 using Values =
typename Traits::Values;
706template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
711 using Comp =
typename Traits::Comp;
712 using Alloc =
typename Traits::Alloc;
713 using MyComp =
typename Traits::MyComp;
714 using MyAlloc =
typename Traits::MyAlloc;
715 typename Traits::ManualClock clock;
721 typename Traits::template Cont<Comp, Alloc> c(clock);
726 typename Traits::template Cont<MyComp, Alloc> c(clock, MyComp(1));
731 typename Traits::template Cont<Comp, MyAlloc> c(clock, MyAlloc(1));
736 typename Traits::template Cont<MyComp, MyAlloc> c(clock, MyComp(1), MyAlloc(1));
742template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
746 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
747 using Hash =
typename Traits::Hash;
748 using Equal =
typename Traits::Equal;
749 using Alloc =
typename Traits::Alloc;
750 using MyHash =
typename Traits::MyHash;
751 using MyEqual =
typename Traits::MyEqual;
752 using MyAlloc =
typename Traits::MyAlloc;
753 typename Traits::ManualClock clock;
758 typename Traits::template Cont<Hash, Equal, Alloc> c(clock);
763 typename Traits::template Cont<MyHash, Equal, Alloc> c(clock, MyHash(1));
768 typename Traits::template Cont<Hash, MyEqual, Alloc> c(clock, MyEqual(1));
773 typename Traits::template Cont<Hash, Equal, MyAlloc> c(clock, MyAlloc(1));
778 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(clock, MyHash(1), MyEqual(1));
783 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(clock, MyHash(1), MyAlloc(1));
788 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(clock, MyEqual(1), MyAlloc(1));
793 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
794 clock, MyHash(1), MyEqual(1), MyAlloc(1));
800template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
805 using Comp =
typename Traits::Comp;
806 using Alloc =
typename Traits::Alloc;
807 using MyComp =
typename Traits::MyComp;
808 using MyAlloc =
typename Traits::MyAlloc;
809 typename Traits::ManualClock clock;
810 auto const v(Traits::values());
816 typename Traits::template Cont<Comp, Alloc> c(v.begin(), v.end(), clock);
821 typename Traits::template Cont<MyComp, Alloc> c(v.begin(), v.end(), clock, MyComp(1));
826 typename Traits::template Cont<Comp, MyAlloc> c(v.begin(), v.end(), clock, MyAlloc(1));
831 typename Traits::template Cont<MyComp, MyAlloc> c(
832 v.begin(), v.end(), clock, MyComp(1), MyAlloc(1));
839 typename Traits::template Cont<Comp, Alloc> c1(v.begin(), v.end(), clock);
840 typename Traits::template Cont<Comp, Alloc> c2(clock);
847template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
851 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
852 using Hash =
typename Traits::Hash;
853 using Equal =
typename Traits::Equal;
854 using Alloc =
typename Traits::Alloc;
855 using MyHash =
typename Traits::MyHash;
856 using MyEqual =
typename Traits::MyEqual;
857 using MyAlloc =
typename Traits::MyAlloc;
858 typename Traits::ManualClock clock;
859 auto const v(Traits::values());
865 typename Traits::template Cont<Hash, Equal, Alloc> c(v.begin(), v.end(), clock);
870 typename Traits::template Cont<MyHash, Equal, Alloc> c(
871 v.begin(), v.end(), clock, MyHash(1));
876 typename Traits::template Cont<Hash, MyEqual, Alloc> c(
877 v.begin(), v.end(), clock, MyEqual(1));
882 typename Traits::template Cont<Hash, Equal, MyAlloc> c(
883 v.begin(), v.end(), clock, MyAlloc(1));
888 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(
889 v.begin(), v.end(), clock, MyHash(1), MyEqual(1));
894 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(
895 v.begin(), v.end(), clock, MyHash(1), MyAlloc(1));
900 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(
901 v.begin(), v.end(), clock, MyEqual(1), MyAlloc(1));
906 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
907 v.begin(), v.end(), clock, MyHash(1), MyEqual(1), MyAlloc(1));
913template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
918 typename Traits::ManualClock
const clock;
929template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
933 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
934 typename Traits::ManualClock
const clock;
949template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
954 using Alloc =
typename Traits::Alloc;
955 typename Traits::ManualClock clock;
956 auto const v(Traits::values());
964 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
965 typename Traits::template Cont<> c2(c);
968 BEAST_EXPECT(c == c2);
973 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
974 typename Traits::template Cont<> c2(c, Alloc());
977 BEAST_EXPECT(c == c2);
982 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
983 typename Traits::template Cont<> c2(clock);
987 BEAST_EXPECT(c == c2);
994 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
995 typename Traits::template Cont<> c2(std::move(c));
1000 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1001 typename Traits::template Cont<> c2(std::move(c), Alloc());
1006 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1007 typename Traits::template Cont<> c2(clock);
1019template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1024 typename Traits::ManualClock clock;
1025 auto const v(Traits::values());
1030 typename Traits::template Cont<> c{clock};
1032 using iterator =
decltype(c.begin());
1033 using const_iterator =
decltype(c.cbegin());
1036 iterator
const nnIt_0{c.begin()};
1037 iterator
const nnIt_1{nnIt_0};
1038 BEAST_EXPECT(nnIt_0 == nnIt_1);
1041 BEAST_EXPECT(nnIt_1 == nnIt_2);
1045 const_iterator
const ccIt_0{c.cbegin()};
1046 const_iterator
const ccIt_1{ccIt_0};
1047 BEAST_EXPECT(ccIt_0 == ccIt_1);
1048 const_iterator ccIt_2;
1050 BEAST_EXPECT(ccIt_1 == ccIt_2);
1053 BEAST_EXPECT(nnIt_0 == ccIt_0);
1054 BEAST_EXPECT(ccIt_1 == nnIt_1);
1057 const_iterator
const ncIt_3{c.begin()};
1058 const_iterator
const ncIt_4{nnIt_0};
1059 BEAST_EXPECT(ncIt_3 == ncIt_4);
1060 const_iterator ncIt_5;
1062 BEAST_EXPECT(ncIt_5 == ncIt_4);
1075template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1080 typename Traits::ManualClock clock;
1081 auto const v(Traits::values());
1086 typename Traits::template Cont<> c{clock};
1088 using iterator =
decltype(c.begin());
1089 using reverse_iterator =
decltype(c.rbegin());
1090 using const_reverse_iterator =
decltype(c.crbegin());
1101 reverse_iterator
const rNrNit_0{c.rbegin()};
1102 reverse_iterator
const rNrNit_1{rNrNit_0};
1103 BEAST_EXPECT(rNrNit_0 == rNrNit_1);
1104 reverse_iterator xXrNit_2;
1105 xXrNit_2 = rNrNit_1;
1106 BEAST_EXPECT(rNrNit_1 == xXrNit_2);
1110 const_reverse_iterator
const rCrCit_0{c.crbegin()};
1111 const_reverse_iterator
const rCrCit_1{rCrCit_0};
1112 BEAST_EXPECT(rCrCit_0 == rCrCit_1);
1113 const_reverse_iterator xXrCit_2;
1114 xXrCit_2 = rCrCit_1;
1115 BEAST_EXPECT(rCrCit_1 == xXrCit_2);
1118 BEAST_EXPECT(rNrNit_0 == rCrCit_0);
1119 BEAST_EXPECT(rCrCit_1 == rNrNit_1);
1123 const_reverse_iterator
const rNrCit_0{c.rbegin()};
1124 const_reverse_iterator
const rNrCit_1{rNrNit_0};
1125 BEAST_EXPECT(rNrCit_0 == rNrCit_1);
1126 xXrCit_2 = rNrNit_1;
1127 BEAST_EXPECT(rNrCit_1 == xXrCit_2);
1135 reverse_iterator
const fNrNit_0{c.begin()};
1136 const_reverse_iterator
const fNrCit_0{c.begin()};
1137 BEAST_EXPECT(fNrNit_0 == fNrCit_0);
1138 const_reverse_iterator
const fCrCit_0{c.cbegin()};
1139 BEAST_EXPECT(fNrCit_0 == fCrCit_0);
1149 iterator
const xXfNit_0;
1160template <
class Container,
class Values>
1164 for (
auto const& e : v)
1169template <
class Container,
class Values>
1175 c.insert(std::move(e));
1179template <
class Container,
class Values>
1183 for (
auto const& e : v)
1184 c.insert(c.cend(), e);
1188template <
class Container,
class Values>
1194 c.insert(c.cend(), std::move(e));
1198template <
class Container,
class Values>
1202 for (
auto const& e : v)
1207template <
class Container,
class Values>
1211 for (
auto const& e : v)
1212 c.emplace_hint(c.cend(), e);
1216template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1221 typename Traits::ManualClock clock;
1222 auto const v(Traits::values());
1229 typename Traits::template Cont<> c(clock);
1234 typename Traits::template Cont<> c(clock);
1239 typename Traits::template Cont<> c(clock);
1244 typename Traits::template Cont<> c(clock);
1249 typename Traits::template Cont<> c(clock);
1254 typename Traits::template Cont<> c(clock);
1259 typename Traits::template Cont<> c(clock);
1264 typename Traits::template Cont<> c(clock);
1275template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1280 typename Traits::ManualClock clock;
1281 auto const v(Traits::values());
1286 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1290 c.chronological.cbegin(),
1291 c.chronological.cend(),
1297 for (
auto iter(v.crbegin()); iter != v.crend(); ++iter)
1299 using iterator =
typename decltype(c)::iterator;
1300 iterator
const found(c.find(Traits::extract(*iter)));
1302 BEAST_EXPECT(found != c.cend());
1303 if (found == c.cend())
1310 c.chronological.cbegin(),
1311 c.chronological.cend(),
1317 for (
auto iter(v.cbegin()); iter != v.cend(); ++iter)
1319 using const_iterator =
typename decltype(c)::const_iterator;
1320 const_iterator
const found(c.find(Traits::extract(*iter)));
1322 BEAST_EXPECT(found != c.cend());
1323 if (found == c.cend())
1330 c.chronological.cbegin(),
1331 c.chronological.cend(),
1351template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1356 typename Traits::ManualClock clock;
1357 auto v(Traits::values());
1364 typename Traits::template Cont<> c(clock);
1365 for (
auto const& e : v)
1366 c[e.first] = e.second;
1372 typename Traits::template Cont<> c(clock);
1374 c[std::move(e.first)] = e.second;
1385template <
class Container,
class Values>
1395 ManualClock& clk(
dynamic_cast<ManualClock&
>(c.clock()));
1411template <
class Iter>
1415 if (beginIter == endIter)
1417 fail(
"Internal test failure. Cannot advance beginIter");
1422 Iter nextToEnd = beginIter;
1425 nextToEnd = beginIter++;
1426 }
while (beginIter != endIter);
1443template <
class Container,
class Iter>
1447 Iter
const beginItr,
1451 size_t count = c.size();
1452 while (it != endItr)
1460 fail(
"Unexpected returned iterator from element erase");
1465 if (count != c.size())
1467 fail(
"Failed to erase element");
1475 fail(
"Erase of last element didn't produce end");
1489template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1499 typename Traits::ManualClock clock;
1500 typename Traits::template Cont<> c{clock};
1505 auto tempContainer(c);
1506 if (!
doElementErase(tempContainer, tempContainer.cbegin(), tempContainer.cend()))
1509 BEAST_EXPECT(tempContainer.empty());
1514 auto tempContainer(c);
1515 auto& chron(tempContainer.chronological);
1519 BEAST_EXPECT(tempContainer.empty());
1524 auto tempContainer(c);
1525 BEAST_EXPECT(tempContainer.size() > 2);
1528 ++tempContainer.begin(),
1532 BEAST_EXPECT(tempContainer.size() == 2);
1537 auto tempContainer(c);
1538 BEAST_EXPECT(tempContainer.size() > 2);
1539 auto& chron(tempContainer.chronological);
1541 tempContainer, ++chron.begin(),
nextToEndIter(chron.begin(), chron.end())))
1544 BEAST_EXPECT(tempContainer.size() == 2);
1548 auto tempContainer(c);
1549 BEAST_EXPECT(tempContainer.size() > 4);
1574template <
class Container,
class BeginEndSrc>
1578 BEAST_EXPECT(c.size() > 2);
1579 auto itBeginPlusOne(beginEndSrc.begin());
1580 auto const valueFront = *itBeginPlusOne;
1584 auto itBack(
nextToEndIter(itBeginPlusOne, beginEndSrc.end()));
1585 auto const valueBack = *itBack;
1588 auto const retIter = c.erase(itBeginPlusOne, itBack);
1590 BEAST_EXPECT(c.size() == 2);
1591 BEAST_EXPECT(valueFront == *(beginEndSrc.begin()));
1592 BEAST_EXPECT(valueBack == *(++beginEndSrc.begin()));
1593 BEAST_EXPECT(retIter == (++beginEndSrc.begin()));
1602template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1612 typename Traits::ManualClock clock;
1613 typename Traits::template Cont<> c{clock};
1618 auto tempContainer(c);
1622 auto tempContainer(c);
1623 doRangeErase(tempContainer, tempContainer.chronological);
1634template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1639 typename Traits::ManualClock clock;
1640 auto const v(Traits::values());
1645 typename Traits::template Cont<>
const c1(v.begin(), v.end(), clock);
1647 typename Traits::template Cont<> c2(v.begin(), v.end(), clock);
1648 c2.erase(c2.cbegin());
1665template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1670 typename Traits::ManualClock clock;
1675 typename Traits::template Cont<>
const c(clock);
1683template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1687 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
1688 typename Traits::ManualClock clock;
1693 typename Traits::template Cont<>
const c(clock);
1706template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1710 testConstructEmpty<IsUnordered, IsMulti, IsMap>();
1711 testConstructRange<IsUnordered, IsMulti, IsMap>();
1712 testConstructInitList<IsUnordered, IsMulti, IsMap>();
1713 testCopyMove<IsUnordered, IsMulti, IsMap>();
1714 testIterator<IsUnordered, IsMulti, IsMap>();
1715 testReverseIterator<IsUnordered, IsMulti, IsMap>();
1716 testModifiers<IsUnordered, IsMulti, IsMap>();
1717 testChronological<IsUnordered, IsMulti, IsMap>();
1718 testArrayCreate<IsUnordered, IsMulti, IsMap>();
1719 testElementErase<IsUnordered, IsMulti, IsMap>();
1720 testRangeErase<IsUnordered, IsMulti, IsMap>();
1721 testCompare<IsUnordered, IsMulti, IsMap>();
1722 testObservers<IsUnordered, IsMulti, IsMap>();
1737 "bad alias: aged_set");
1742 "bad alias: aged_multiset");
1746 "bad alias: aged_map");
1751 "bad alias: aged_multimap");
1757 "bad alias: aged_unordered_set");
1763 "bad alias: aged_unordered_multiset");
1769 "bad alias: aged_unordered_map");
1775 "bad alias: aged_unordered_multimap");
1780 testMaybeUnorderedMultiMap<false, false, false>();
1790 testMaybeUnorderedMultiMap<false, false, true>();
1800 testMaybeUnorderedMultiMap<false, true, false>();
1810 testMaybeUnorderedMultiMap<false, true, true>();
1820 testMaybeUnorderedMultiMap<true, false, false>();
1830 testMaybeUnorderedMultiMap<true, false, true>();
1840 testMaybeUnorderedMultiMap<true, true, false>();
1850 testMaybeUnorderedMultiMap<true, true, true>();
std::size_t operator()(T const &t) const
static std::string name_map_part()
static Base::Key const & extract(Value const &value)
static std::string name_map_part()
static Base::Key const & extract(Value const &value)
std::vector< Value > Values
static std::string name_multi_part()
static std::string name_multi_part()
static std::string name_ordered_part()
static std::string name_ordered_part()
std::enable_if< IsMap &&!IsMulti >::type testArrayCreate()
std::enable_if<!std::remove_reference< C >::type::is_unordered::value >::type checkUnorderedContentsRefRef(C &&, Values const &)
void checkInsertHintMove(Container &c, Values const &v)
void checkInsertCopy(Container &c, Values const &v)
std::enable_if<!IsUnordered >::type testReverseIterator()
std::enable_if<!(Container::is_map::value &&!Container::is_multi::value)>::type checkMapContents(Container, Values const &)
void checkInsertHintCopy(Container &c, Values const &v)
void checkContentsRefRef(C &&c, Values const &v)
void checkEmplace(Container &c, Values const &v)
static std::vector< typename Cont::value_type > make_list(Cont const &c)
std::enable_if< IsUnordered >::type testReverseIterator()
std::enable_if<!IsUnordered >::type testCompare()
std::enable_if< Container::is_map::value &&!Container::is_multi::value >::type checkMapContents(Container &c, Values const &v)
static std::string name(Cont const &)
std::enable_if<!IsUnordered >::type testConstructRange()
void testMaybeUnorderedMulti()
bool doElementErase(Container &c, Iter const beginItr, Iter const endItr)
std::enable_if< IsUnordered >::type testCompare()
std::enable_if<!IsUnordered >::type testObservers()
Iter nextToEndIter(Iter const beginIter, Iter const endItr)
void testMaybeUnorderedMultiMap()
std::enable_if<!IsUnordered >::type testConstructEmpty()
void reverseFillAgedContainer(Container &c, Values const &v)
std::enable_if< std::remove_reference< C >::type::is_unordered::value >::type checkUnorderedContentsRefRef(C &&c, Values const &v)
std::enable_if<!IsUnordered >::type testConstructInitList()
std::enable_if<!IsMap||IsMulti >::type testArrayCreate()
void testMaybeUnordered()
void checkContents(Cont &c, Values const &v)
void doRangeErase(Container &c, BeginEndSrc const &beginEndSrc)
void checkEmplaceHint(Container &c, Values const &v)
void checkInsertMove(Container &c, Values const &v)
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.
Manual clock implementation.
void pass()
Record a successful test condition.
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t testcase
Memberspace for declaring test cases.
bool expect(Condition const &shouldBeTrue)
Evaluate a test condition.
void fail(String const &reason, char const *file, int line)
Record a failure.
T * allocate(std::size_t n, T const *=0)
AllocT(AllocT< U > const &)
void deallocate(T *p, std::size_t)
bool operator==(AllocT< U > const &) const
bool operator!=(AllocT< U > const &o) const
AllocT(AllocT const &)=default
bool operator()(T const &lhs, T const &rhs) const
bool operator()(T const &lhs, T const &rhs) const
manual_clock< Clock > ManualClock
static std::string name()
bool operator()(typename Traits::Value const &lhs, typename Traits::Value const &rhs)