From 32b8ee4eb520d9c5d4daabbf38d0d9bddcc67146 Mon Sep 17 00:00:00 2001 From: Mike Bloom Date: Mon, 7 Sep 2026 23:05:01 +0000 Subject: [PATCH] Add constexpr call to is_valid in constructor --- include/etl/const_map.h | 11 + test/test_const_map_constexpr.cpp | 352 ++++++++++++++++++++---------- 2 files changed, 249 insertions(+), 114 deletions(-) diff --git a/include/etl/const_map.h b/include/etl/const_map.h index f96f616b..d624b5ac 100644 --- a/include/etl/const_map.h +++ b/include/etl/const_map.h @@ -484,6 +484,11 @@ namespace etl size_type max_elements; }; + namespace etl_priv + { + inline void const_map_elements_are_not_sorted() {} // non-constexpr -> not usable in a constant expression + } // namespace etl_priv + //********************************************************************* /// Map type designed for constexpr. //********************************************************************* @@ -519,6 +524,12 @@ namespace etl { static_assert((etl::are_all_same...>::value), "All elements must be value_type"); static_assert(sizeof...(elements) <= Size, "Number of elements exceeds capacity"); + + if (!this->is_valid()) + { + etl_priv::const_map_elements_are_not_sorted(); + // runtime assert here for run time variables? + } } private: diff --git a/test/test_const_map_constexpr.cpp b/test/test_const_map_constexpr.cpp index 77a4b736..f45475ec 100644 --- a/test/test_const_map_constexpr.cpp +++ b/test/test_const_map_constexpr.cpp @@ -249,8 +249,8 @@ namespace value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; etl::const_map check{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, + value_type{Key('I'), 8}, value_type{Key('J'), 9}}; CHECK_TRUE(data.is_valid()); CHECK_TRUE(data.size() == Max_Size); @@ -288,9 +288,15 @@ namespace //************************************************************************* TEST(test_end) { + #ifdef TEST_GREATER_THAN + static constexpr Data data{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else static constexpr Data data{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr const_iterator end_itr = data.end(); @@ -1279,6 +1285,23 @@ namespace //************************************************************************* TEST(test_equal) { + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data2 data4{value_type{Key('K'), 10}, value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, + value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; @@ -1294,6 +1317,7 @@ namespace static constexpr Data2 data4{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}, value_type{Key('K'), 10}}; + #endif static constexpr bool equal12 = (data1 == data2); static constexpr bool equal13 = (data1 == data3); @@ -1307,6 +1331,24 @@ namespace //************************************************************************* TEST(test_equal_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN + static constexpr DataTransparentComparator data1{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data2{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator2 data4{value_type{Key('K'), 10}, value_type{Key('J'), 9}, value_type{Key('I'), 8}, + value_type{Key('H'), 6}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; @@ -1323,6 +1365,7 @@ namespace value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}, value_type{Key('K'), 10}}; + #endif static constexpr bool equal12 = (data1 == data2); static constexpr bool equal13 = (data1 == data3); @@ -1336,6 +1379,23 @@ namespace //************************************************************************* TEST(test_not_equal) { + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data2 data4{value_type{Key('K'), 10}, value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, + value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; @@ -1351,6 +1411,7 @@ namespace static constexpr Data2 data4{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}, value_type{Key('K'), 10}}; + #endif static constexpr bool not_equal12 = (data1 != data2); static constexpr bool not_equal13 = (data1 != data3); @@ -1364,6 +1425,24 @@ namespace //************************************************************************* TEST(test_not_equal_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN + static constexpr DataTransparentComparator data1{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data2{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{ + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 6}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator2 data4{value_type{Key('K'), 10}, value_type{Key('J'), 9}, value_type{Key('I'), 8}, + value_type{Key('H'), 6}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; @@ -1380,6 +1459,7 @@ namespace value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}, value_type{Key('K'), 10}}; + #endif static constexpr bool not_equal12 = (data1 != data2); static constexpr bool not_equal13 = (data1 != data3); @@ -1393,83 +1473,107 @@ namespace //************************************************************************* TEST(test_less_than) { - static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, + value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, + value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool less_than12 = (data1 < data2); static constexpr bool less_than23 = (data2 < data3); static constexpr bool less_than21 = (data2 < data1); static constexpr bool less_than32 = (data3 < data2); - #ifdef TEST_GREATER_THAN - CHECK_FALSE(less_than12); - CHECK_FALSE(less_than23); - CHECK_TRUE(less_than21); - CHECK_TRUE(less_than32); - #else CHECK_TRUE(less_than12); CHECK_TRUE(less_than23); CHECK_FALSE(less_than21); CHECK_FALSE(less_than32); - #endif } //************************************************************************* TEST(test_less_than_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN static constexpr DataTransparentComparator data1{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; - static constexpr DataTransparentComparator data2{ + static constexpr DataTransparentComparator data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr DataTransparentComparator data3{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr DataTransparentComparator data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + + static constexpr DataTransparentComparator data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, + value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, + value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool less_than12 = (data1 < data2); static constexpr bool less_than23 = (data2 < data3); static constexpr bool less_than21 = (data2 < data1); static constexpr bool less_than32 = (data3 < data2); - #ifdef TEST_GREATER_THAN - CHECK_FALSE(less_than12); - CHECK_FALSE(less_than23); - CHECK_TRUE(less_than21); - CHECK_TRUE(less_than32); - #else CHECK_TRUE(less_than12); CHECK_TRUE(less_than23); CHECK_FALSE(less_than21); CHECK_FALSE(less_than32); - #endif } //************************************************************************* TEST(test_less_than_equal) { - static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, + value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, + value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool less_than_equal12 = (data1 <= data2); static constexpr bool less_than_equal23 = (data2 <= data3); @@ -1477,35 +1581,41 @@ namespace static constexpr bool less_than_equal32 = (data3 <= data2); static constexpr bool less_than_equal11 = (data1 <= data1); - #ifdef TEST_GREATER_THAN - CHECK_FALSE(less_than_equal12); - CHECK_FALSE(less_than_equal23); - CHECK_TRUE(less_than_equal21); - CHECK_TRUE(less_than_equal32); - CHECK_TRUE(less_than_equal11); - #else CHECK_TRUE(less_than_equal12); CHECK_TRUE(less_than_equal23); CHECK_FALSE(less_than_equal21); CHECK_FALSE(less_than_equal32); CHECK_TRUE(less_than_equal11); - #endif } //************************************************************************* TEST(test_less_than_equal_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN static constexpr DataTransparentComparator data1{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; - static constexpr DataTransparentComparator data2{ + static constexpr DataTransparentComparator data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr DataTransparentComparator data3{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr DataTransparentComparator data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + + static constexpr DataTransparentComparator data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, + value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, + value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool less_than_equal12 = (data1 <= data2); static constexpr bool less_than_equal23 = (data2 <= data3); @@ -1513,101 +1623,117 @@ namespace static constexpr bool less_than_equal32 = (data3 <= data2); static constexpr bool less_than_equal11 = (data1 <= data1); - #ifdef TEST_GREATER_THAN - CHECK_FALSE(less_than_equal12); - CHECK_FALSE(less_than_equal23); - CHECK_TRUE(less_than_equal21); - CHECK_TRUE(less_than_equal32); - CHECK_TRUE(less_than_equal11); - #else CHECK_TRUE(less_than_equal12); CHECK_TRUE(less_than_equal23); CHECK_FALSE(less_than_equal21); CHECK_FALSE(less_than_equal32); CHECK_TRUE(less_than_equal11); - #endif } //************************************************************************* TEST(test_greater_than) { - static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, + value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, + value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool greater_than12 = (data1 > data2); static constexpr bool greater_than23 = (data2 > data3); static constexpr bool greater_than21 = (data2 > data1); static constexpr bool greater_than32 = (data3 > data2); - #ifdef TEST_GREATER_THAN - CHECK_TRUE(greater_than12); - CHECK_TRUE(greater_than23); - CHECK_FALSE(greater_than21); - CHECK_FALSE(greater_than32); - #else CHECK_FALSE(greater_than12); CHECK_FALSE(greater_than23); CHECK_TRUE(greater_than21); CHECK_TRUE(greater_than32); - #endif } //************************************************************************* TEST(test_greater_than_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN static constexpr DataTransparentComparator data1{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; - static constexpr DataTransparentComparator data2{ + static constexpr DataTransparentComparator data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr DataTransparentComparator data3{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr DataTransparentComparator data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + + static constexpr DataTransparentComparator data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, + value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, + value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool greater_than12 = (data1 > data2); static constexpr bool greater_than23 = (data2 > data3); static constexpr bool greater_than21 = (data2 > data1); static constexpr bool greater_than32 = (data3 > data2); - #ifdef TEST_GREATER_THAN - CHECK_TRUE(greater_than12); - CHECK_TRUE(greater_than23); - CHECK_FALSE(greater_than21); - CHECK_FALSE(greater_than32); - #else CHECK_FALSE(greater_than12); CHECK_FALSE(greater_than23); CHECK_TRUE(greater_than21); CHECK_TRUE(greater_than32); - #endif } //************************************************************************* TEST(test_greater_than_equal) { - static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, + #ifdef TEST_GREATER_THAN + static constexpr Data data1{value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr Data data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, value_type{Key('E'), 4}, + value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr Data data1{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, - value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, - value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr Data data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, + value_type{Key('G'), 6}, value_type{Key('H'), 6}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool greater_than_equal12 = (data1 >= data2); static constexpr bool greater_than_equal23 = (data2 >= data3); @@ -1615,35 +1741,41 @@ namespace static constexpr bool greater_than_equal32 = (data3 >= data2); static constexpr bool greater_than_equal11 = (data1 >= data1); - #ifdef TEST_GREATER_THAN - CHECK_TRUE(greater_than_equal12); - CHECK_TRUE(greater_than_equal23); - CHECK_FALSE(greater_than_equal21); - CHECK_FALSE(greater_than_equal32); - CHECK_TRUE(greater_than_equal11); - #else CHECK_FALSE(greater_than_equal12); CHECK_FALSE(greater_than_equal23); CHECK_TRUE(greater_than_equal21); CHECK_TRUE(greater_than_equal32); CHECK_TRUE(greater_than_equal11); - #endif } //************************************************************************* TEST(test_greater_than_equal_with_transparent_comparator) { + #ifdef TEST_GREATER_THAN static constexpr DataTransparentComparator data1{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('B'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + value_type{Key('J'), 9}, value_type{Key('I'), 8}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; - static constexpr DataTransparentComparator data2{ + static constexpr DataTransparentComparator data2{value_type{Key('J'), 9}, value_type{Key('H'), 7}, value_type{Key('G'), 6}, + value_type{Key('F'), 5}, value_type{Key('E'), 4}, value_type{Key('D'), 3}, + value_type{Key('C'), 2}, value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + + static constexpr DataTransparentComparator data3{value_type{Key('J'), 9}, value_type{Key('G'), 6}, value_type{Key('F'), 5}, + value_type{Key('E'), 4}, value_type{Key('D'), 3}, value_type{Key('C'), 2}, + value_type{Key('B'), 1}, value_type{Key('A'), 0}}; + #else + static constexpr DataTransparentComparator data1{ value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; - static constexpr DataTransparentComparator data3{ - value_type{Key('A'), 0}, value_type{Key('B'), 1}, value_type{Key('D'), 2}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, - value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + static constexpr DataTransparentComparator data2{value_type{Key('A'), 0}, value_type{Key('C'), 2}, value_type{Key('D'), 3}, + value_type{Key('E'), 4}, value_type{Key('F'), 5}, value_type{Key('G'), 6}, + value_type{Key('H'), 7}, value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + + static constexpr DataTransparentComparator data3{value_type{Key('A'), 0}, value_type{Key('D'), 3}, value_type{Key('E'), 4}, + value_type{Key('F'), 5}, value_type{Key('G'), 6}, value_type{Key('H'), 6}, + value_type{Key('I'), 8}, value_type{Key('J'), 9}}; + #endif static constexpr bool greater_than_equal12 = (data1 >= data2); static constexpr bool greater_than_equal23 = (data2 >= data3); @@ -1651,19 +1783,11 @@ namespace static constexpr bool greater_than_equal32 = (data3 >= data2); static constexpr bool greater_than_equal11 = (data1 >= data1); - #ifdef TEST_GREATER_THAN - CHECK_TRUE(greater_than_equal12); - CHECK_TRUE(greater_than_equal23); - CHECK_FALSE(greater_than_equal21); - CHECK_FALSE(greater_than_equal32); - CHECK_TRUE(greater_than_equal11); - #else CHECK_FALSE(greater_than_equal12); CHECK_FALSE(greater_than_equal23); CHECK_TRUE(greater_than_equal21); CHECK_TRUE(greater_than_equal32); CHECK_TRUE(greater_than_equal11); - #endif } } } // namespace