| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 | 
							
- #include <cstdint>
 
- #include <initializer_list>
 
- #include <iostream>
 
- #include <iterator>
 
- #include <limits>
 
- #include <set>
 
- #include <type_traits>
 
- #include <utility>
 
- #include <cmext/enum_set>
 
- namespace {
 
- int failed = 0;
 
- void testDeclaration()
 
- {
 
-   std::cout << "testDeclaration()" << std::endl;
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D
 
-     };
 
-     cm::enum_set<Test> testSet1;
 
-     cm::enum_set<Test> testSet2 = Test::A;
 
-     cm::enum_set<Test> testSet3 = Test::A | Test::C;
 
-     cm::enum_set<Test> testSet4 = Test::A + Test::C;
 
-     cm::enum_set<Test> testSet5{ Test::A, Test::C };
 
-     cm::enum_set<Test> testSet6 = testSet3;
 
-     if (!testSet1.empty()) {
 
-       ++failed;
 
-     }
 
-     if (testSet2.size() != 1) {
 
-       ++failed;
 
-     }
 
-     if (testSet3.size() != 2 || testSet4.size() != 2 || testSet5.size() != 2 ||
 
-         testSet6.size() != 2) {
 
-       ++failed;
 
-     }
 
-     if (testSet3 != testSet4 || testSet4 != testSet5 || testSet5 != testSet6) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D
 
-     };
 
-     cm::enum_set<Test> testSet1;
 
-     cm::enum_set<Test, 4> testSet2;
 
-     if (testSet1.size() != 0 ||
 
-         testSet1.max_size() !=
 
-           std::numeric_limits<
 
-             typename std::underlying_type<Test>::type>::digits) {
 
-       ++failed;
 
-     }
 
-     if (testSet2.size() != 0 || testSet2.max_size() != 4) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D,
 
-       cm_count = D
 
-     };
 
-     cm::enum_set<Test> testSet1;
 
-     if (testSet1.size() != 0 || testSet1.max_size() != 4) {
 
-       ++failed;
 
-     }
 
-   }
 
- }
 
- void testIteration()
 
- {
 
-   std::cout << "testIteration()" << std::endl;
 
-   enum class Test : std::uint8_t
 
-   {
 
-     A,
 
-     B,
 
-     C,
 
-     D,
 
-     cm_count = D
 
-   };
 
-   cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
 
-   if (testSet.size() != 3) {
 
-     ++failed;
 
-   }
 
-   std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
 
-                                     static_cast<std::uint8_t>(Test::B),
 
-                                     static_cast<std::uint8_t>(Test::C) };
 
-   std::set<std::uint8_t> s;
 
-   for (auto e : testSet) {
 
-     s.insert(static_cast<std::uint8_t>(e));
 
-   }
 
-   if (s != reference) {
 
-     ++failed;
 
-   }
 
-   s.clear();
 
-   for (auto rit = testSet.rbegin(); rit != testSet.rend(); rit++) {
 
-     s.insert(static_cast<std::uint8_t>(*rit));
 
-   }
 
-   if (s != reference) {
 
-     ++failed;
 
-   }
 
- }
 
- void testEdition()
 
- {
 
-   std::cout << "testEdition()" << std::endl;
 
-   enum class Test : std::uint8_t
 
-   {
 
-     A,
 
-     B,
 
-     C,
 
-     D,
 
-     E,
 
-     cm_count = E
 
-   };
 
-   {
 
-     cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
 
-     auto pos = testSet.insert(Test::E);
 
-     if (!pos.second || testSet.size() != 4 || *(pos.first) != Test::E ||
 
-         testSet.find(Test::E) == testSet.end()) {
 
-       ++failed;
 
-     }
 
-     testSet.insert(Test::E);
 
-     if (testSet.size() != 4 || testSet.find(Test::E) == testSet.end()) {
 
-       ++failed;
 
-     }
 
-     testSet.erase(Test::A);
 
-     if (testSet.size() != 3 || testSet.find(Test::A) != testSet.end()) {
 
-       ++failed;
 
-     }
 
-     testSet.erase(Test::A);
 
-     if (testSet.size() != 3 || testSet.find(Test::A) != testSet.end()) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     cm::enum_set<Test> testSet{ Test::A, Test::C, Test::B };
 
-     testSet += { Test::D, Test::E };
 
-     std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
 
-                                       static_cast<std::uint8_t>(Test::B),
 
-                                       static_cast<std::uint8_t>(Test::C),
 
-                                       static_cast<std::uint8_t>(Test::D),
 
-                                       static_cast<std::uint8_t>(Test::E) };
 
-     std::set<std::uint8_t> s;
 
-     for (auto e : testSet) {
 
-       s.insert(static_cast<std::uint8_t>(e));
 
-     }
 
-     if (s != reference) {
 
-       ++failed;
 
-     }
 
-     testSet -= { Test::D, Test::B };
 
-     reference.erase(static_cast<std::uint8_t>(Test::D));
 
-     reference.erase(static_cast<std::uint8_t>(Test::B));
 
-     s.clear();
 
-     for (auto e : testSet) {
 
-       s.insert(static_cast<std::uint8_t>(e));
 
-     }
 
-     if (s != reference) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     cm::enum_set<Test> testSet1{ Test::A, Test::C, Test::B };
 
-     cm::enum_set<Test> testSet2{ Test::A, Test::D, Test::E };
 
-     testSet1.insert(testSet2.cbegin(), testSet2.cend());
 
-     std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::A),
 
-                                       static_cast<std::uint8_t>(Test::B),
 
-                                       static_cast<std::uint8_t>(Test::C),
 
-                                       static_cast<std::uint8_t>(Test::D),
 
-                                       static_cast<std::uint8_t>(Test::E) };
 
-     std::set<std::uint8_t> s;
 
-     for (auto e : testSet1) {
 
-       s.insert(static_cast<std::uint8_t>(e));
 
-     }
 
-     if (s != reference) {
 
-       ++failed;
 
-     }
 
-     testSet1.erase(testSet2);
 
-     reference.erase(static_cast<std::uint8_t>(Test::A));
 
-     reference.erase(static_cast<std::uint8_t>(Test::D));
 
-     reference.erase(static_cast<std::uint8_t>(Test::E));
 
-     s.clear();
 
-     for (auto e : testSet1) {
 
-       s.insert(static_cast<std::uint8_t>(e));
 
-     }
 
-     if (s != reference) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     cm::enum_set<Test> testSet1{ Test::A, Test::C, Test::B };
 
-     cm::enum_set<Test> testSet2{ Test::C, Test::E };
 
-     testSet1.flip(Test::A);
 
-     if (testSet1.size() != 2 || testSet1.contains(Test::A)) {
 
-       ++failed;
 
-     }
 
-     testSet1.flip(testSet2);
 
-     std::set<std::uint8_t> reference{ static_cast<std::uint8_t>(Test::B),
 
-                                       static_cast<std::uint8_t>(Test::E) };
 
-     std::set<std::uint8_t> s;
 
-     for (auto e : testSet1) {
 
-       s.insert(static_cast<std::uint8_t>(e));
 
-     }
 
-     if (s != reference) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     cm::enum_set<Test> testSet1;
 
-     auto testSet2 = Test::A + Test::C + Test::B;
 
-     testSet1.set({ Test::A, Test::C, Test::B });
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.reset();
 
-     testSet1.set(Test::A | Test::C | Test::B);
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.reset();
 
-     testSet1.set(Test::A + Test::C + Test::B);
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.reset();
 
-     testSet1 = { Test::A, Test::C, Test::B };
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.reset();
 
-     testSet1 = Test::A | Test::C | Test::B;
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.clear();
 
-     testSet1 = Test::A + Test::C + Test::B;
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.clear();
 
-     testSet1 |= Test::A;
 
-     testSet1 |= Test::C | Test::B;
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     cm::enum_set<Test> testSet1;
 
-     cm::enum_set<Test> testSet2{ Test::A, Test::C, Test::B };
 
-     testSet1.set();
 
-     if (testSet1.size() != 5 || testSet1.size() != testSet1.max_size()) {
 
-       ++failed;
 
-     }
 
-     testSet1.flip(Test::D | Test::E);
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1.flip(Test::D);
 
-     testSet2 += Test::D;
 
-     if (testSet1.size() != 4 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1 ^= { Test::A, Test::B, Test::E, Test::D };
 
-     testSet2 = Test::C + Test::E;
 
-     if (testSet1.size() != 2 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-     testSet1 ^= Test::A | Test::B | Test::E;
 
-     testSet2 = { Test::A, Test::B, Test::C };
 
-     if (testSet1.size() != 3 || testSet1 != testSet2) {
 
-       ++failed;
 
-     }
 
-   }
 
- }
 
- void testChecks()
 
- {
 
-   std::cout << "testChecks()" << std::endl;
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D,
 
-       cm_count = D
 
-     };
 
-     cm::enum_set<Test> testSet;
 
-     if (!testSet.empty()) {
 
-       ++failed;
 
-     }
 
-     testSet = Test::A;
 
-     if (testSet.empty()) {
 
-       ++failed;
 
-     }
 
-     if (!testSet) {
 
-       ++failed;
 
-     }
 
-     if (!testSet.contains(Test::A)) {
 
-       ++failed;
 
-     }
 
-     if (testSet.find(Test::A) == testSet.end()) {
 
-       ++failed;
 
-     }
 
-     if (testSet.find(Test::C) != testSet.end()) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D,
 
-       cm_count = D
 
-     };
 
-     cm::enum_set<Test> testSet;
 
-     if (!testSet.none()) {
 
-       ++failed;
 
-     }
 
-     if (testSet.any() || testSet.all()) {
 
-       ++failed;
 
-     }
 
-     testSet = Test::A;
 
-     if (!testSet.any() || testSet.none() || testSet.all()) {
 
-       ++failed;
 
-     }
 
-     testSet.set();
 
-     if (!testSet.all() || !testSet.any() || testSet.none()) {
 
-       ++failed;
 
-     }
 
-   }
 
-   {
 
-     enum class Test : std::uint8_t
 
-     {
 
-       A,
 
-       B,
 
-       C,
 
-       D,
 
-       cm_count = D
 
-     };
 
-     cm::enum_set<Test> testSet1;
 
-     cm::enum_set<Test> testSet2{ Test::A, Test::C };
 
-     if (!testSet1.none_of(testSet2) || testSet1.any_of(testSet2) ||
 
-         testSet1.all_of(testSet2)) {
 
-       ++failed;
 
-     }
 
-     testSet1 = Test::A | Test::D;
 
-     if (testSet1.none_of(testSet2) || !testSet1.any_of(testSet2) ||
 
-         testSet1.all_of(testSet2)) {
 
-       ++failed;
 
-     }
 
-     testSet1 |= Test::C;
 
-     if (testSet1.none_of(testSet2) || !testSet1.any_of(testSet2) ||
 
-         !testSet1.all_of(testSet2)) {
 
-       ++failed;
 
-     }
 
-   }
 
- }
 
- }
 
- int testCMExtEnumSet(int /*unused*/, char* /*unused*/[])
 
- {
 
-   testDeclaration();
 
-   testIteration();
 
-   testEdition();
 
-   testChecks();
 
-   return failed;
 
- }
 
 
  |