| 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;
- }
|