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>
295 template <
class Compare = std::less<
typename Base::Key>,
class Allocator = std::allocator<
typename Base::Value>>
297 Base::is_multi::value,
301 typename Base::Clock,
307 template <
class Base>
315 Base::is_multi::value,
319 typename Base::Clock,
334 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
357 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
359 ContType<TestTraitsHelper<IsUnordered, IsMulti, IsMap>>
363 template <
class Cont>
370 template <
class Traits>
374 operator()(
typename Traits::Value
const& lhs,
typename Traits::Value
const& rhs)
376 return Traits::extract(lhs) == Traits::extract(rhs);
380 template <
class Cont>
389 template <
class Container,
class Values>
393 template <
class Container,
class Values>
394 typename std::enable_if<!(Container::is_map::value && !Container::is_multi::value)>::type
400 template <
class C,
class Values>
404 template <
class C,
class Values>
410 template <
class C,
class Values>
414 template <
class Cont,
class Values>
418 template <
class Cont>
425 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
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>
456 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
462 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
467 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
471 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
479 template <
class Container,
class Values>
483 template <
class Container,
class Values>
487 template <
class Container,
class Values>
491 template <
class Container,
class Values>
495 template <
class Container,
class Values>
499 template <
class Container,
class Values>
503 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
509 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
516 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
520 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
529 template <
class Container,
class Values>
533 template <
class Iter>
539 template <
class Container,
class Iter>
541 doElementErase(Container& c, Iter
const beginItr, Iter
const endItr);
543 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
549 template <
class Container,
class BeginEndSrc>
551 doRangeErase(Container& c, BeginEndSrc
const& beginEndSrc);
553 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
560 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
564 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
573 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
578 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
584 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
588 template <
bool IsUnordered,
bool IsMulti>
592 template <
bool IsUnordered>
601template <
class Container,
class Values>
607 BEAST_EXPECT(c.empty());
608 BEAST_EXPECT(c.size() == 0);
615 for (
auto const& e : v)
617 for (
auto const& e : v)
618 BEAST_EXPECT(c.operator[](e.first) == e.second);
622 fail(
"caught exception");
627template <
class C,
class Values>
633 using size_type =
typename Cont::size_type;
634 auto const hash(c.hash_function());
635 auto const key_eq(c.key_eq());
636 for (size_type i(0); i < c.bucket_count(); ++i)
638 auto const last(c.end(i));
639 for (
auto iter(c.begin(i)); iter != last; ++iter)
641 auto const match(
std::find_if(v.begin(), v.end(), [iter](
typename Values::value_type
const& e) {
642 return Traits::extract(*iter) == Traits::extract(e);
644 BEAST_EXPECT(match != v.end());
645 BEAST_EXPECT(key_eq(Traits::extract(*iter), Traits::extract(*match)));
646 BEAST_EXPECT(hash(Traits::extract(*iter)) == hash(Traits::extract(*match)));
651template <
class C,
class Values>
656 using size_type =
typename Cont::size_type;
658 BEAST_EXPECT(c.size() == v.size());
659 BEAST_EXPECT(size_type(
std::distance(c.begin(), c.end())) == v.size());
660 BEAST_EXPECT(size_type(
std::distance(c.cbegin(), c.cend())) == v.size());
661 BEAST_EXPECT(size_type(
std::distance(c.chronological.begin(), c.chronological.end())) == v.size());
662 BEAST_EXPECT(size_type(
std::distance(c.chronological.cbegin(), c.chronological.cend())) == v.size());
663 BEAST_EXPECT(size_type(
std::distance(c.chronological.rbegin(), c.chronological.rend())) == v.size());
664 BEAST_EXPECT(size_type(
std::distance(c.chronological.crbegin(), c.chronological.crend())) == v.size());
669template <
class Cont,
class Values>
683 using Values =
typename Traits::Values;
694template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
699 using Comp =
typename Traits::Comp;
700 using Alloc =
typename Traits::Alloc;
701 using MyComp =
typename Traits::MyComp;
702 using MyAlloc =
typename Traits::MyAlloc;
703 typename Traits::ManualClock clock;
709 typename Traits::template Cont<Comp, Alloc> c(clock);
714 typename Traits::template Cont<MyComp, Alloc> c(clock, MyComp(1));
719 typename Traits::template Cont<Comp, MyAlloc> c(clock, MyAlloc(1));
724 typename Traits::template Cont<MyComp, MyAlloc> c(clock, MyComp(1), MyAlloc(1));
730template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
734 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
735 using Hash =
typename Traits::Hash;
736 using Equal =
typename Traits::Equal;
737 using Alloc =
typename Traits::Alloc;
738 using MyHash =
typename Traits::MyHash;
739 using MyEqual =
typename Traits::MyEqual;
740 using MyAlloc =
typename Traits::MyAlloc;
741 typename Traits::ManualClock clock;
746 typename Traits::template Cont<Hash, Equal, Alloc> c(clock);
751 typename Traits::template Cont<MyHash, Equal, Alloc> c(clock, MyHash(1));
756 typename Traits::template Cont<Hash, MyEqual, Alloc> c(clock, MyEqual(1));
761 typename Traits::template Cont<Hash, Equal, MyAlloc> c(clock, MyAlloc(1));
766 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(clock, MyHash(1), MyEqual(1));
771 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(clock, MyHash(1), MyAlloc(1));
776 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(clock, MyEqual(1), MyAlloc(1));
781 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(clock, MyHash(1), MyEqual(1), MyAlloc(1));
787template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
792 using Comp =
typename Traits::Comp;
793 using Alloc =
typename Traits::Alloc;
794 using MyComp =
typename Traits::MyComp;
795 using MyAlloc =
typename Traits::MyAlloc;
796 typename Traits::ManualClock clock;
797 auto const v(Traits::values());
803 typename Traits::template Cont<Comp, Alloc> c(v.begin(), v.end(), clock);
808 typename Traits::template Cont<MyComp, Alloc> c(v.begin(), v.end(), clock, MyComp(1));
813 typename Traits::template Cont<Comp, MyAlloc> c(v.begin(), v.end(), clock, MyAlloc(1));
818 typename Traits::template Cont<MyComp, MyAlloc> c(v.begin(), v.end(), clock, MyComp(1), MyAlloc(1));
825 typename Traits::template Cont<Comp, Alloc> c1(v.begin(), v.end(), clock);
826 typename Traits::template Cont<Comp, Alloc> c2(clock);
833template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
837 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
838 using Hash =
typename Traits::Hash;
839 using Equal =
typename Traits::Equal;
840 using Alloc =
typename Traits::Alloc;
841 using MyHash =
typename Traits::MyHash;
842 using MyEqual =
typename Traits::MyEqual;
843 using MyAlloc =
typename Traits::MyAlloc;
844 typename Traits::ManualClock clock;
845 auto const v(Traits::values());
851 typename Traits::template Cont<Hash, Equal, Alloc> c(v.begin(), v.end(), clock);
856 typename Traits::template Cont<MyHash, Equal, Alloc> c(v.begin(), v.end(), clock, MyHash(1));
861 typename Traits::template Cont<Hash, MyEqual, Alloc> c(v.begin(), v.end(), clock, MyEqual(1));
866 typename Traits::template Cont<Hash, Equal, MyAlloc> c(v.begin(), v.end(), clock, MyAlloc(1));
871 typename Traits::template Cont<MyHash, MyEqual, Alloc> c(v.begin(), v.end(), clock, MyHash(1), MyEqual(1));
876 typename Traits::template Cont<MyHash, Equal, MyAlloc> c(v.begin(), v.end(), clock, MyHash(1), MyAlloc(1));
881 typename Traits::template Cont<Hash, MyEqual, MyAlloc> c(v.begin(), v.end(), clock, MyEqual(1), MyAlloc(1));
886 typename Traits::template Cont<MyHash, MyEqual, MyAlloc> c(
887 v.begin(), v.end(), clock, MyHash(1), MyEqual(1), MyAlloc(1));
893template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
898 typename Traits::ManualClock clock;
909template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
913 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
914 typename Traits::ManualClock clock;
929template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
934 using Alloc =
typename Traits::Alloc;
935 typename Traits::ManualClock clock;
936 auto const v(Traits::values());
944 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
945 typename Traits::template Cont<> c2(c);
948 BEAST_EXPECT(c == c2);
953 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
954 typename Traits::template Cont<> c2(c, Alloc());
957 BEAST_EXPECT(c == c2);
962 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
963 typename Traits::template Cont<> c2(clock);
967 BEAST_EXPECT(c == c2);
974 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
975 typename Traits::template Cont<> c2(std::move(c));
980 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
981 typename Traits::template Cont<> c2(std::move(c), Alloc());
986 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
987 typename Traits::template Cont<> c2(clock);
999template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1004 typename Traits::ManualClock clock;
1005 auto const v(Traits::values());
1010 typename Traits::template Cont<> c{clock};
1012 using iterator =
decltype(c.begin());
1013 using const_iterator =
decltype(c.cbegin());
1016 iterator nnIt_0{c.begin()};
1017 iterator nnIt_1{nnIt_0};
1018 BEAST_EXPECT(nnIt_0 == nnIt_1);
1021 BEAST_EXPECT(nnIt_1 == nnIt_2);
1025 const_iterator ccIt_0{c.cbegin()};
1026 const_iterator ccIt_1{ccIt_0};
1027 BEAST_EXPECT(ccIt_0 == ccIt_1);
1028 const_iterator ccIt_2;
1030 BEAST_EXPECT(ccIt_1 == ccIt_2);
1033 BEAST_EXPECT(nnIt_0 == ccIt_0);
1034 BEAST_EXPECT(ccIt_1 == nnIt_1);
1037 const_iterator ncIt_3{c.begin()};
1038 const_iterator ncIt_4{nnIt_0};
1039 BEAST_EXPECT(ncIt_3 == ncIt_4);
1040 const_iterator ncIt_5;
1042 BEAST_EXPECT(ncIt_5 == ncIt_4);
1055template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1060 typename Traits::ManualClock clock;
1061 auto const v(Traits::values());
1066 typename Traits::template Cont<> c{clock};
1068 using iterator =
decltype(c.begin());
1069 using reverse_iterator =
decltype(c.rbegin());
1070 using const_reverse_iterator =
decltype(c.crbegin());
1081 reverse_iterator rNrNit_0{c.rbegin()};
1082 reverse_iterator rNrNit_1{rNrNit_0};
1083 BEAST_EXPECT(rNrNit_0 == rNrNit_1);
1084 reverse_iterator xXrNit_2;
1085 xXrNit_2 = rNrNit_1;
1086 BEAST_EXPECT(rNrNit_1 == xXrNit_2);
1090 const_reverse_iterator rCrCit_0{c.crbegin()};
1091 const_reverse_iterator rCrCit_1{rCrCit_0};
1092 BEAST_EXPECT(rCrCit_0 == rCrCit_1);
1093 const_reverse_iterator xXrCit_2;
1094 xXrCit_2 = rCrCit_1;
1095 BEAST_EXPECT(rCrCit_1 == xXrCit_2);
1098 BEAST_EXPECT(rNrNit_0 == rCrCit_0);
1099 BEAST_EXPECT(rCrCit_1 == rNrNit_1);
1103 const_reverse_iterator rNrCit_0{c.rbegin()};
1104 const_reverse_iterator rNrCit_1{rNrNit_0};
1105 BEAST_EXPECT(rNrCit_0 == rNrCit_1);
1106 xXrCit_2 = rNrNit_1;
1107 BEAST_EXPECT(rNrCit_1 == xXrCit_2);
1115 reverse_iterator fNrNit_0{c.begin()};
1116 const_reverse_iterator fNrCit_0{c.begin()};
1117 BEAST_EXPECT(fNrNit_0 == fNrCit_0);
1118 const_reverse_iterator fCrCit_0{c.cbegin()};
1119 BEAST_EXPECT(fNrCit_0 == fCrCit_0);
1140template <
class Container,
class Values>
1144 for (
auto const& e : v)
1149template <
class Container,
class Values>
1155 c.insert(std::move(e));
1159template <
class Container,
class Values>
1163 for (
auto const& e : v)
1164 c.insert(c.cend(), e);
1168template <
class Container,
class Values>
1174 c.insert(c.cend(), std::move(e));
1178template <
class Container,
class Values>
1182 for (
auto const& e : v)
1187template <
class Container,
class Values>
1191 for (
auto const& e : v)
1192 c.emplace_hint(c.cend(), e);
1196template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1201 typename Traits::ManualClock clock;
1202 auto const v(Traits::values());
1209 typename Traits::template Cont<> c(clock);
1214 typename Traits::template Cont<> c(clock);
1219 typename Traits::template Cont<> c(clock);
1224 typename Traits::template Cont<> c(clock);
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);
1255template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1260 typename Traits::ManualClock clock;
1261 auto const v(Traits::values());
1266 typename Traits::template Cont<> c(v.begin(), v.end(), clock);
1272 for (
auto iter(v.crbegin()); iter != v.crend(); ++iter)
1274 using iterator =
typename decltype(c)::iterator;
1275 iterator found(c.find(Traits::extract(*iter)));
1277 BEAST_EXPECT(found != c.cend());
1278 if (found == c.cend())
1287 for (
auto iter(v.cbegin()); iter != v.cend(); ++iter)
1289 using const_iterator =
typename decltype(c)::const_iterator;
1290 const_iterator found(c.find(Traits::extract(*iter)));
1292 BEAST_EXPECT(found != c.cend());
1293 if (found == c.cend())
1316template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1321 typename Traits::ManualClock clock;
1322 auto v(Traits::values());
1329 typename Traits::template Cont<> c(clock);
1331 c[e.first] = e.second;
1337 typename Traits::template Cont<> c(clock);
1339 c[std::move(e.first)] = e.second;
1350template <
class Container,
class Values>
1360 ManualClock& clk(
dynamic_cast<ManualClock&
>(c.clock()));
1376template <
class Iter>
1380 if (beginIter == endIter)
1382 fail(
"Internal test failure. Cannot advance beginIter");
1387 Iter nextToEnd = beginIter;
1390 nextToEnd = beginIter++;
1391 }
while (beginIter != endIter);
1408template <
class Container,
class Iter>
1413 size_t count = c.size();
1414 while (it != endItr)
1422 fail(
"Unexpected returned iterator from element erase");
1427 if (count != c.size())
1429 fail(
"Failed to erase element");
1437 fail(
"Erase of last element didn't produce end");
1451template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1461 typename Traits::ManualClock clock;
1462 typename Traits::template Cont<> c{clock};
1467 auto tempContainer(c);
1468 if (!
doElementErase(tempContainer, tempContainer.cbegin(), tempContainer.cend()))
1471 BEAST_EXPECT(tempContainer.empty());
1476 auto tempContainer(c);
1477 auto& chron(tempContainer.chronological);
1481 BEAST_EXPECT(tempContainer.empty());
1486 auto tempContainer(c);
1487 BEAST_EXPECT(tempContainer.size() > 2);
1489 tempContainer, ++tempContainer.begin(),
nextToEndIter(tempContainer.begin(), tempContainer.end())))
1492 BEAST_EXPECT(tempContainer.size() == 2);
1497 auto tempContainer(c);
1498 BEAST_EXPECT(tempContainer.size() > 2);
1499 auto& chron(tempContainer.chronological);
1503 BEAST_EXPECT(tempContainer.size() == 2);
1507 auto tempContainer(c);
1508 BEAST_EXPECT(tempContainer.size() > 4);
1533template <
class Container,
class BeginEndSrc>
1537 BEAST_EXPECT(c.size() > 2);
1538 auto itBeginPlusOne(beginEndSrc.begin());
1539 auto const valueFront = *itBeginPlusOne;
1543 auto itBack(
nextToEndIter(itBeginPlusOne, beginEndSrc.end()));
1544 auto const valueBack = *itBack;
1547 auto const retIter = c.erase(itBeginPlusOne, itBack);
1549 BEAST_EXPECT(c.size() == 2);
1550 BEAST_EXPECT(valueFront == *(beginEndSrc.begin()));
1551 BEAST_EXPECT(valueBack == *(++beginEndSrc.begin()));
1552 BEAST_EXPECT(retIter == (++beginEndSrc.begin()));
1561template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1571 typename Traits::ManualClock clock;
1572 typename Traits::template Cont<> c{clock};
1577 auto tempContainer(c);
1581 auto tempContainer(c);
1582 doRangeErase(tempContainer, tempContainer.chronological);
1593template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1598 typename Traits::ManualClock clock;
1599 auto const v(Traits::values());
1604 typename Traits::template Cont<> c1(v.begin(), v.end(), clock);
1606 typename Traits::template Cont<> c2(v.begin(), v.end(), clock);
1607 c2.erase(c2.cbegin());
1624template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1629 typename Traits::ManualClock clock;
1634 typename Traits::template Cont<> c(clock);
1642template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1646 using Traits = TestTraits<IsUnordered, IsMulti, IsMap>;
1647 typename Traits::ManualClock clock;
1652 typename Traits::template Cont<> c(clock);
1665template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1669 testConstructEmpty<IsUnordered, IsMulti, IsMap>();
1670 testConstructRange<IsUnordered, IsMulti, IsMap>();
1671 testConstructInitList<IsUnordered, IsMulti, IsMap>();
1672 testCopyMove<IsUnordered, IsMulti, IsMap>();
1673 testIterator<IsUnordered, IsMulti, IsMap>();
1674 testReverseIterator<IsUnordered, IsMulti, IsMap>();
1675 testModifiers<IsUnordered, IsMulti, IsMap>();
1676 testChronological<IsUnordered, IsMulti, IsMap>();
1677 testArrayCreate<IsUnordered, IsMulti, IsMap>();
1678 testElementErase<IsUnordered, IsMulti, IsMap>();
1679 testRangeErase<IsUnordered, IsMulti, IsMap>();
1680 testCompare<IsUnordered, IsMulti, IsMap>();
1681 testObservers<IsUnordered, IsMulti, IsMap>();
1696 "bad alias: aged_set");
1700 "bad alias: aged_multiset");
1704 "bad alias: aged_map");
1708 "bad alias: aged_multimap");
1712 "bad alias: aged_unordered_set");
1716 "bad alias: aged_unordered_multiset");
1720 "bad alias: aged_unordered_map");
1724 "bad alias: aged_unordered_multimap");
1729 testMaybeUnorderedMultiMap<false, false, false>();
1739 testMaybeUnorderedMultiMap<false, false, true>();
1749 testMaybeUnorderedMultiMap<false, true, false>();
1759 testMaybeUnorderedMultiMap<false, true, true>();
1769 testMaybeUnorderedMultiMap<true, false, false>();
1779 testMaybeUnorderedMultiMap<true, false, true>();
1789 testMaybeUnorderedMultiMap<true, true, false>();
1799 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)