20 #include <ripple/beast/clock/manual_clock.h>
21 #include <ripple/beast/unit_test.h>
23 #include <ripple/beast/container/aged_set.h>
24 #include <ripple/beast/container/aged_map.h>
25 #include <ripple/beast/container/aged_multiset.h>
26 #include <ripple/beast/container/aged_multimap.h>
27 #include <ripple/beast/container/aged_unordered_set.h>
28 #include <ripple/beast/container/aged_unordered_map.h>
29 #include <ripple/beast/container/aged_unordered_multiset.h>
30 #include <ripple/beast/container/aged_unordered_multimap.h>
35 #ifndef BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
37 # define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 0
39 # define BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR 1
43 #ifndef BEAST_CONTAINER_EXTRACT_NOREF
45 # define BEAST_CONTAINER_EXTRACT_NOREF 1
47 # define BEAST_CONTAINER_EXTRACT_NOREF 1
105 return m_eq (lhs, rhs);
146 return !(*
this == o);
152 return static_cast <T*
> (
153 ::operator
new (n *
sizeof(T)));
158 ::operator
delete (p);
161 #if ! BEAST_AGED_UNORDERED_NO_ALLOC_DEFAULTCTOR
174 template <
class Base,
bool IsUnordered>
189 template <
class Base>
206 template <
class Base,
bool IsMulti>
218 template <
class Base>
230 template <
class Base,
bool IsMap>
263 template <
class Base>
300 bool IsUnordered = Base::is_unordered::value
309 Base::is_multi::value, Base::is_map::value,
typename Base::Key,
310 typename Base::T,
typename Base::Clock, Compare, Allocator>;
325 Base::is_multi::value, Base::is_map::value,
326 typename Base::Key,
typename Base::T,
typename Base::Clock,
327 Hash, KeyEqual, Allocator>;
339 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
342 TestTraitsBase, IsMap>, IsMulti>, IsUnordered>
367 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
370 ,
ContType <TestTraitsHelper <IsUnordered, IsMulti, IsMap>>
374 template <
class Cont>
383 template <
class Traits>
387 typename Traits::Value
const& rhs)
389 return Traits::extract (lhs) == Traits::extract (rhs);
393 template <
class Cont>
409 Container::is_map::value && ! Container::is_multi::value>::type
417 (Container::is_map::value && ! Container::is_multi::value)>::type
441 template <
class C,
class Values>
444 template <
class Cont,
class Values>
447 template <
class Cont>
453 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
458 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
463 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
468 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
473 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
478 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
484 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
490 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
495 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
499 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
507 template <
class Container,
class Values>
510 template <
class Container,
class Values>
513 template <
class Container,
class Values>
516 template <
class Container,
class Values>
519 template <
class Container,
class Values>
522 template <
class Container,
class Values>
525 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
530 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
537 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
541 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
550 template <
class Container,
class Values>
553 template <
class Iter>
554 Iter
nextToEndIter (Iter
const beginIter, Iter
const endItr);
558 template <
class Container,
class Iter>
559 bool doElementErase (Container& c, Iter
const beginItr, Iter
const endItr);
561 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
566 template <
class Container,
class BeginEndSrc>
567 void doRangeErase (Container& c, BeginEndSrc
const& beginEndSrc);
569 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
575 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
579 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
588 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
593 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
599 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
602 template <
bool IsUnordered,
bool IsMulti>
605 template <
bool IsUnordered>
618 Container::is_map::value && ! Container::is_multi::value>::type
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");
655 Cont::is_unordered::value,
656 Cont::is_multi::value,
659 using size_type =
typename Cont::size_type;
660 auto const hash (c.hash_function());
661 auto const key_eq (c.key_eq());
662 for (size_type i (0); i < c.bucket_count(); ++i)
664 auto const last (c.end(i));
665 for (
auto iter (c.begin (i)); iter != last; ++iter)
668 [iter](
typename Values::value_type
const& e)
670 return Traits::extract (*iter) ==
673 BEAST_EXPECT(match != v.end());
674 BEAST_EXPECT(key_eq (Traits::extract (*iter),
675 Traits::extract (*match)));
676 BEAST_EXPECT(hash (Traits::extract (*iter)) ==
677 hash (Traits::extract (*match)));
682 template <
class C,
class Values>
689 Cont::is_unordered::value,
690 Cont::is_multi::value,
693 using size_type =
typename Cont::size_type;
695 BEAST_EXPECT(c.size() == v.size());
697 c.begin(), c.end())) == v.size());
699 c.cbegin(), c.cend())) == v.size());
701 c.chronological.begin(), c.chronological.end())) == v.size());
703 c.chronological.cbegin(), c.chronological.cend())) == v.size());
705 c.chronological.rbegin(), c.chronological.rend())) == v.size());
707 c.chronological.crbegin(), c.chronological.crend())) == v.size());
712 template <
class Cont,
class Values>
722 template <
class Cont>
728 Cont::is_unordered::value,
729 Cont::is_multi::value,
732 using Values =
typename Traits::Values;
743 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
749 using Value =
typename Traits::Value;
750 using Key =
typename Traits::Key;
751 using T =
typename Traits::T;
752 using Clock =
typename Traits::Clock;
753 using Comp =
typename Traits::Comp;
754 using Alloc =
typename Traits::Alloc;
755 using MyComp =
typename Traits::MyComp;
756 using MyAlloc =
typename Traits::MyAlloc;
757 typename Traits::ManualClock clock;
763 typename Traits::template Cont <Comp, Alloc> c (
769 typename Traits::template Cont <MyComp, Alloc> c (
775 typename Traits::template Cont <Comp, MyAlloc> c (
781 typename Traits::template Cont <MyComp, MyAlloc> c (
782 clock, MyComp(1), MyAlloc(1));
788 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
793 using Traits = TestTraits <IsUnordered, IsMulti, IsMap>;
794 using Value =
typename Traits::Value;
795 using Key =
typename Traits::Key;
796 using T =
typename Traits::T;
797 using Clock =
typename Traits::Clock;
798 using Hash =
typename Traits::Hash;
799 using Equal =
typename Traits::Equal;
800 using Alloc =
typename Traits::Alloc;
801 using MyHash =
typename Traits::MyHash;
802 using MyEqual =
typename Traits::MyEqual;
803 using MyAlloc =
typename Traits::MyAlloc;
804 typename Traits::ManualClock clock;
809 typename Traits::template Cont <Hash, Equal, Alloc> c (
815 typename Traits::template Cont <MyHash, Equal, Alloc> c (
821 typename Traits::template Cont <Hash, MyEqual, Alloc> c (
827 typename Traits::template Cont <Hash, Equal, MyAlloc> c (
833 typename Traits::template Cont <MyHash, MyEqual, Alloc> c (
834 clock, MyHash(1), MyEqual(1));
839 typename Traits::template Cont <MyHash, Equal, MyAlloc> c (
840 clock, MyHash(1), MyAlloc(1));
845 typename Traits::template Cont <Hash, MyEqual, MyAlloc> c (
846 clock, MyEqual(1), MyAlloc(1));
851 typename Traits::template Cont <MyHash, MyEqual, MyAlloc> c (
852 clock, MyHash(1), MyEqual(1), MyAlloc(1));
858 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
864 using Value =
typename Traits::Value;
865 using Key =
typename Traits::Key;
866 using T =
typename Traits::T;
867 using Clock =
typename Traits::Clock;
868 using Comp =
typename Traits::Comp;
869 using Alloc =
typename Traits::Alloc;
870 using MyComp =
typename Traits::MyComp;
871 using MyAlloc =
typename Traits::MyAlloc;
872 typename Traits::ManualClock clock;
873 auto const v (Traits::values());
879 typename Traits::template Cont <Comp, Alloc> c (
886 typename Traits::template Cont <MyComp, Alloc> c (
893 typename Traits::template Cont <Comp, MyAlloc> c (
900 typename Traits::template Cont <MyComp, MyAlloc> c (
902 clock, MyComp(1), MyAlloc(1));
910 typename Traits::template Cont <Comp, Alloc> c1 (
913 typename Traits::template Cont <Comp, Alloc> c2 (
921 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
926 using Traits = TestTraits <IsUnordered, IsMulti, IsMap>;
927 using Value =
typename Traits::Value;
928 using Key =
typename Traits::Key;
929 using T =
typename Traits::T;
930 using Clock =
typename Traits::Clock;
931 using Hash =
typename Traits::Hash;
932 using Equal =
typename Traits::Equal;
933 using Alloc =
typename Traits::Alloc;
934 using MyHash =
typename Traits::MyHash;
935 using MyEqual =
typename Traits::MyEqual;
936 using MyAlloc =
typename Traits::MyAlloc;
937 typename Traits::ManualClock clock;
938 auto const v (Traits::values());
944 typename Traits::template Cont <Hash, Equal, Alloc> c (
951 typename Traits::template Cont <MyHash, Equal, Alloc> c (
958 typename Traits::template Cont <Hash, MyEqual, Alloc> c (
965 typename Traits::template Cont <Hash, Equal, MyAlloc> c (
972 typename Traits::template Cont <MyHash, MyEqual, Alloc> c (
974 clock, MyHash(1), MyEqual(1));
979 typename Traits::template Cont <MyHash, Equal, MyAlloc> c (
981 clock, MyHash(1), MyAlloc(1));
986 typename Traits::template Cont <Hash, MyEqual, MyAlloc> c (
988 clock, MyEqual(1), MyAlloc(1));
993 typename Traits::template Cont <MyHash, MyEqual, MyAlloc> c (
995 clock, MyHash(1), MyEqual(1), MyAlloc(1));
1001 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1007 using Value =
typename Traits::Value;
1008 using Key =
typename Traits::Key;
1009 using T =
typename Traits::T;
1010 using Clock =
typename Traits::Clock;
1011 using Comp =
typename Traits::Comp;
1012 using Alloc =
typename Traits::Alloc;
1013 using MyComp =
typename Traits::MyComp;
1014 using MyAlloc =
typename Traits::MyAlloc;
1015 typename Traits::ManualClock clock;
1018 testcase (
"init-list");
1026 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1031 using Traits = TestTraits <IsUnordered, IsMulti, IsMap>;
1032 using Value =
typename Traits::Value;
1033 using Key =
typename Traits::Key;
1034 using T =
typename Traits::T;
1035 using Clock =
typename Traits::Clock;
1036 using Hash =
typename Traits::Hash;
1037 using Equal =
typename Traits::Equal;
1038 using Alloc =
typename Traits::Alloc;
1039 using MyHash =
typename Traits::MyHash;
1040 using MyEqual =
typename Traits::MyEqual;
1041 using MyAlloc =
typename Traits::MyAlloc;
1042 typename Traits::ManualClock clock;
1045 testcase (
"init-list");
1057 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1063 using Value =
typename Traits::Value;
1064 using Alloc =
typename Traits::Alloc;
1065 typename Traits::ManualClock clock;
1066 auto const v (Traits::values());
1069 testcase (
"copy/move");
1074 typename Traits::template Cont <> c (
1075 v.begin(), v.end(), clock);
1076 typename Traits::template Cont <> c2 (c);
1079 BEAST_EXPECT(c == c2);
1080 unexpected (c != c2);
1084 typename Traits::template Cont <> c (
1085 v.begin(), v.end(), clock);
1086 typename Traits::template Cont <> c2 (c, Alloc());
1089 BEAST_EXPECT(c == c2);
1090 unexpected (c != c2);
1094 typename Traits::template Cont <> c (
1095 v.begin(), v.end(), clock);
1096 typename Traits::template Cont <> c2 (
1101 BEAST_EXPECT(c == c2);
1102 unexpected (c != c2);
1108 typename Traits::template Cont <> c (
1109 v.begin(), v.end(), clock);
1110 typename Traits::template Cont <> c2 (
1116 typename Traits::template Cont <> c (
1117 v.begin(), v.end(), clock);
1118 typename Traits::template Cont <> c2 (
1119 std::move (c), Alloc());
1124 typename Traits::template Cont <> c (
1125 v.begin(), v.end(), clock);
1126 typename Traits::template Cont <> c2 (
1139 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1145 using Value =
typename Traits::Value;
1146 using Alloc =
typename Traits::Alloc;
1147 typename Traits::ManualClock clock;
1148 auto const v (Traits::values());
1151 testcase (
"iterator");
1153 typename Traits::template Cont <> c {clock};
1155 using iterator = decltype (c.begin());
1156 using const_iterator = decltype (c.cbegin());
1159 iterator nnIt_0 {c.begin()};
1160 iterator nnIt_1 {nnIt_0};
1161 BEAST_EXPECT(nnIt_0 == nnIt_1);
1164 BEAST_EXPECT(nnIt_1 == nnIt_2);
1168 const_iterator ccIt_0 {c.cbegin()};
1169 const_iterator ccIt_1 {ccIt_0};
1170 BEAST_EXPECT(ccIt_0 == ccIt_1);
1171 const_iterator ccIt_2;
1173 BEAST_EXPECT(ccIt_1 == ccIt_2);
1176 BEAST_EXPECT(nnIt_0 == ccIt_0);
1177 BEAST_EXPECT(ccIt_1 == nnIt_1);
1180 const_iterator ncIt_3 {c.begin()};
1181 const_iterator ncIt_4 {nnIt_0};
1182 BEAST_EXPECT(ncIt_3 == ncIt_4);
1183 const_iterator ncIt_5;
1185 BEAST_EXPECT(ncIt_5 == ncIt_4);
1198 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1204 using Value =
typename Traits::Value;
1205 using Alloc =
typename Traits::Alloc;
1206 typename Traits::ManualClock clock;
1207 auto const v (Traits::values());
1210 testcase (
"reverse_iterator");
1212 typename Traits::template Cont <> c {clock};
1214 using iterator = decltype (c.begin());
1215 using const_iterator = decltype (c.cbegin());
1216 using reverse_iterator = decltype (c.rbegin());
1217 using const_reverse_iterator = decltype (c.crbegin());
1228 reverse_iterator rNrNit_0 {c.rbegin()};
1229 reverse_iterator rNrNit_1 {rNrNit_0};
1230 BEAST_EXPECT(rNrNit_0 == rNrNit_1);
1231 reverse_iterator xXrNit_2;
1232 xXrNit_2 = rNrNit_1;
1233 BEAST_EXPECT(rNrNit_1 == xXrNit_2);
1237 const_reverse_iterator rCrCit_0 {c.crbegin()};
1238 const_reverse_iterator rCrCit_1 {rCrCit_0};
1239 BEAST_EXPECT(rCrCit_0 == rCrCit_1);
1240 const_reverse_iterator xXrCit_2;
1241 xXrCit_2 = rCrCit_1;
1242 BEAST_EXPECT(rCrCit_1 == xXrCit_2);
1245 BEAST_EXPECT(rNrNit_0 == rCrCit_0);
1246 BEAST_EXPECT(rCrCit_1 == rNrNit_1);
1250 const_reverse_iterator rNrCit_0 {c.rbegin()};
1251 const_reverse_iterator rNrCit_1 {rNrNit_0};
1252 BEAST_EXPECT(rNrCit_0 == rNrCit_1);
1253 xXrCit_2 = rNrNit_1;
1254 BEAST_EXPECT(rNrCit_1 == xXrCit_2);
1261 reverse_iterator fNrNit_0 {c.begin()};
1262 const_reverse_iterator fNrCit_0 {c.begin()};
1263 BEAST_EXPECT(fNrNit_0 == fNrCit_0);
1264 const_reverse_iterator fCrCit_0 {c.cbegin()};
1265 BEAST_EXPECT(fNrCit_0 == fCrCit_0);
1287 template <
class Container,
class Values>
1292 for (
auto const& e : v)
1297 template <
class Container,
class Values>
1304 c.insert (std::move (e));
1308 template <
class Container,
class Values>
1313 for (
auto const& e : v)
1314 c.insert (c.cend(), e);
1318 template <
class Container,
class Values>
1325 c.insert (c.cend(), std::move (e));
1329 template <
class Container,
class Values>
1334 for (
auto const& e : v)
1339 template <
class Container,
class Values>
1344 for (
auto const& e : v)
1345 c.emplace_hint (c.cend(), e);
1349 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1355 typename Traits::ManualClock clock;
1356 auto const v (Traits::values());
1360 testcase (
"modify");
1363 typename Traits::template Cont <> c (clock);
1368 typename Traits::template Cont <> c (clock);
1373 typename Traits::template Cont <> c (clock);
1378 typename Traits::template Cont <> c (clock);
1383 typename Traits::template Cont <> c (clock);
1388 typename Traits::template Cont <> c (clock);
1393 typename Traits::template Cont <> c (clock);
1398 typename Traits::template Cont <> c (clock);
1409 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1415 using Value =
typename Traits::Value;
1416 typename Traits::ManualClock clock;
1417 auto const v (Traits::values());
1420 testcase (
"chronological");
1422 typename Traits::template Cont <> c (
1423 v.begin(), v.end(), clock);
1426 c.chronological.cbegin(), c.chronological.cend(),
1430 for (
auto iter (v.crbegin()); iter != v.crend(); ++iter)
1432 using iterator =
typename decltype (c)::iterator;
1433 iterator found (c.find (Traits::extract (*iter)));
1435 BEAST_EXPECT(found != c.cend());
1436 if (found == c.cend())
1442 c.chronological.cbegin(), c.chronological.cend(),
1446 for (
auto iter (v.cbegin()); iter != v.cend(); ++iter)
1448 using const_iterator =
typename decltype (c)::const_iterator;
1449 const_iterator found (c.find (Traits::extract (*iter)));
1451 BEAST_EXPECT(found != c.cend());
1452 if (found == c.cend())
1458 c.chronological.cbegin(), c.chronological.cend(),
1476 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1482 typename Traits::ManualClock clock;
1483 auto v (Traits::values());
1486 testcase (
"array create");
1490 typename Traits::template Cont <> c (clock);
1492 c [e.first] = e.second;
1498 typename Traits::template Cont <> c (clock);
1500 c [std::move (e.first)] = e.second;
1511 template <
class Container,
class Values>
1522 ManualClock& clk (
dynamic_cast <ManualClock&
> (c.clock()));
1525 Values rev (values);
1538 template <
class Iter>
1543 if (beginIter == endIter)
1545 fail (
"Internal test failure. Cannot advance beginIter");
1550 Iter nextToEnd = beginIter;
1553 nextToEnd = beginIter++;
1554 }
while (beginIter != endIter);
1571 template <
class Container,
class Iter>
1576 size_t count = c.size();
1577 while (it != endItr)
1585 fail (
"Unexpected returned iterator from element erase");
1590 if (count != c.size())
1592 fail (
"Failed to erase element");
1600 fail (
"Erase of last element didn't produce end");
1614 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1622 testcase (
"element erase");
1625 typename Traits::ManualClock clock;
1626 typename Traits::template Cont <> c {clock};
1631 auto tempContainer (c);
1633 tempContainer.cbegin(), tempContainer.cend()))
1636 BEAST_EXPECT(tempContainer.empty());
1641 auto tempContainer (c);
1642 auto& chron (tempContainer.chronological);
1643 if (!
doElementErase (tempContainer, chron.begin(), chron.end()))
1646 BEAST_EXPECT(tempContainer.empty());
1651 auto tempContainer (c);
1652 BEAST_EXPECT(tempContainer.size() > 2);
1654 nextToEndIter (tempContainer.begin(), tempContainer.end())))
1657 BEAST_EXPECT(tempContainer.size() == 2);
1662 auto tempContainer (c);
1663 BEAST_EXPECT(tempContainer.size() > 2);
1664 auto& chron (tempContainer.chronological);
1669 BEAST_EXPECT(tempContainer.size() == 2);
1673 auto tempContainer (c);
1674 BEAST_EXPECT(tempContainer.size() > 4);
1699 template <
class Container,
class BeginEndSrc>
1704 BEAST_EXPECT(c.size () > 2);
1705 auto itBeginPlusOne (beginEndSrc.begin ());
1706 auto const valueFront = *itBeginPlusOne;
1710 auto itBack (
nextToEndIter (itBeginPlusOne, beginEndSrc.end ()));
1711 auto const valueBack = *itBack;
1714 auto const retIter = c.erase (itBeginPlusOne, itBack);
1716 BEAST_EXPECT(c.size() == 2);
1717 BEAST_EXPECT(valueFront == *(beginEndSrc.begin()));
1718 BEAST_EXPECT(valueBack == *(++beginEndSrc.begin()));
1719 BEAST_EXPECT(retIter == (++beginEndSrc.begin()));
1728 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1736 testcase (
"range erase");
1739 typename Traits::ManualClock clock;
1740 typename Traits::template Cont <> c {clock};
1745 auto tempContainer (c);
1749 auto tempContainer (c);
1750 doRangeErase (tempContainer, tempContainer.chronological);
1761 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1767 using Value =
typename Traits::Value;
1768 typename Traits::ManualClock clock;
1769 auto const v (Traits::values());
1772 testcase (
"array create");
1774 typename Traits::template Cont <> c1 (
1775 v.begin(), v.end(), clock);
1777 typename Traits::template Cont <> c2 (
1778 v.begin(), v.end(), clock);
1779 c2.erase (c2.cbegin());
1782 unexpected (c1 == c2);
1785 unexpected (c1 > c2);
1786 unexpected (c1 >= c2);
1796 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1802 typename Traits::ManualClock clock;
1805 testcase (
"observers");
1807 typename Traits::template Cont <> c (clock);
1815 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1820 using Traits = TestTraits <IsUnordered, IsMulti, IsMap>;
1821 typename Traits::ManualClock clock;
1824 testcase (
"observers");
1826 typename Traits::template Cont <> c (clock);
1839 template <
bool IsUnordered,
bool IsMulti,
bool IsMap>
1846 testConstructEmpty <IsUnordered, IsMulti, IsMap> ();
1847 testConstructRange <IsUnordered, IsMulti, IsMap> ();
1848 testConstructInitList <IsUnordered, IsMulti, IsMap> ();
1849 testCopyMove <IsUnordered, IsMulti, IsMap> ();
1850 testIterator <IsUnordered, IsMulti, IsMap> ();
1851 testReverseIterator <IsUnordered, IsMulti, IsMap> ();
1852 testModifiers <IsUnordered, IsMulti, IsMap> ();
1853 testChronological <IsUnordered, IsMulti, IsMap> ();
1854 testArrayCreate <IsUnordered, IsMulti, IsMap> ();
1855 testElementErase <IsUnordered, IsMulti, IsMap> ();
1856 testRangeErase <IsUnordered, IsMulti, IsMap> ();
1857 testCompare <IsUnordered, IsMulti, IsMap> ();
1858 testObservers <IsUnordered, IsMulti, IsMap> ();
1874 "bad alias: aged_set");
1879 "bad alias: aged_multiset");
1884 "bad alias: aged_map");
1889 "bad alias: aged_multimap");
1894 "bad alias: aged_unordered_set");
1899 "bad alias: aged_unordered_multiset");
1904 "bad alias: aged_unordered_map");
1909 "bad alias: aged_unordered_multimap");
1913 testMaybeUnorderedMultiMap <false, false, false>();
1922 testMaybeUnorderedMultiMap <false, false, true>();
1931 testMaybeUnorderedMultiMap <false, true, false>();
1940 testMaybeUnorderedMultiMap <false, true, true>();
1950 testMaybeUnorderedMultiMap <true, false, false>();
1959 testMaybeUnorderedMultiMap <true, false, true>();
1968 testMaybeUnorderedMultiMap <true, true, false>();
1977 testMaybeUnorderedMultiMap <true, true, true>();