From 5441e8a03ce6bd16f3c8b517db352c1cd349ee7d Mon Sep 17 00:00:00 2001 From: cyborg1811m Date: Tue, 16 Jan 2024 14:07:23 +0100 Subject: [PATCH] fixed and cleaned up operator= --- test/test_main.cpp | 313 +++++++++++++++++++-------------------------- 1 file changed, 131 insertions(+), 182 deletions(-) diff --git a/test/test_main.cpp b/test/test_main.cpp index 51a4047..6bea652 100644 --- a/test/test_main.cpp +++ b/test/test_main.cpp @@ -40,9 +40,7 @@ struct TestStruct { }; -class test_defs { - -public: +struct test_defs { #define GEN_TEST_STRUCT_ARR(nr, i) TestStruct(C_VI_TEST_ARR##nr[i], C_VC_TEST_ARR##nr[i], C_VS_TEST_ARR##nr[i]) @@ -80,65 +78,106 @@ public: GEN_TEST_STRUCT_ARR(2, 6), \ GEN_TEST_STRUCT_ARR(2, 7) } - static constexpr const int C_VI_TEST_ARR1[] = VI_TEST_ARR1; - static constexpr const int C_VI_TEST_ARR2[] = VI_TEST_ARR2; - static constexpr const std::array STD_VI_TEST_ARR1 = VI_TEST_ARR1; - static constexpr const std::array STD_VI_TEST_ARR2 = VI_TEST_ARR2; - static constexpr const std::size_t VI_TEST_ARR1_LEN = C_ARR_LEN(C_VI_TEST_ARR1); - static constexpr const std::size_t VI_TEST_ARR2_LEN = C_ARR_LEN(C_VI_TEST_ARR2); - static constexpr const char C_VC_TEST_ARR1[] = VC_TEST_ARR1; - static constexpr const char C_VC_TEST_ARR2[] = VC_TEST_ARR2; - static constexpr const std::array STD_VC_TEST_ARR1 = VC_TEST_ARR1; - static constexpr const std::array STD_VC_TEST_ARR2 = VC_TEST_ARR2; - static constexpr const std::size_t VC_TEST_ARR1_LEN = C_ARR_LEN(C_VC_TEST_ARR1); - static constexpr const std::size_t VC_TEST_ARR2_LEN = C_ARR_LEN(C_VC_TEST_ARR2); - static constexpr const char * C_VS_TEST_ARR1[] = VS_TEST_ARR1; - static constexpr const char * C_VS_TEST_ARR2[] = VS_TEST_ARR2; - static constexpr const std::array STD_VS_TEST_ARR1 = VS_TEST_ARR1; - static constexpr const std::array STD_VS_TEST_ARR2 = VS_TEST_ARR2; - static constexpr const std::size_t VS_TEST_ARR1_LEN = C_ARR_LEN(C_VS_TEST_ARR1); - static constexpr const std::size_t VS_TEST_ARR2_LEN = C_ARR_LEN(C_VS_TEST_ARR2); - static constexpr TestStruct C_VO_TEST_ARR1[] = VO_TEST_ARR1; - static constexpr TestStruct C_VO_TEST_ARR2[] = VO_TEST_ARR2; - static constexpr const std::array STD_VO_TEST_ARR1 = VO_TEST_ARR1; - static constexpr const std::array STD_VO_TEST_ARR2 = VO_TEST_ARR2; - static constexpr const std::size_t VO_TEST_ARR1_LEN = C_ARR_LEN(C_VO_TEST_ARR1); - static constexpr const std::size_t VO_TEST_ARR2_LEN = C_ARR_LEN(C_VO_TEST_ARR2); + static constexpr std::initializer_list VI_I_LIST1 = VI_TEST_ARR1; + static constexpr std::initializer_list VI_I_LIST2 = VI_TEST_ARR2; + static constexpr const int C_VI_TEST_ARR1[] = VI_TEST_ARR1; + static constexpr const int C_VI_TEST_ARR2[] = VI_TEST_ARR2; + static constexpr const std::array STD_VI_TEST_ARR1 = VI_TEST_ARR1; + static constexpr const std::array STD_VI_TEST_ARR2 = VI_TEST_ARR2; + static constexpr const std::size_t VI_TEST_ARR1_LEN = C_ARR_LEN(C_VI_TEST_ARR1); + static constexpr const std::size_t VI_TEST_ARR2_LEN = C_ARR_LEN(C_VI_TEST_ARR2); + static constexpr std::initializer_list VC_I_LIST1 = VC_TEST_ARR1; + static constexpr std::initializer_list VC_I_LIST2 = VC_TEST_ARR2; + static constexpr const char C_VC_TEST_ARR1[] = VC_TEST_ARR1; + static constexpr const char C_VC_TEST_ARR2[] = VC_TEST_ARR2; + static constexpr const std::array STD_VC_TEST_ARR1 = VC_TEST_ARR1; + static constexpr const std::array STD_VC_TEST_ARR2 = VC_TEST_ARR2; + static constexpr const std::size_t VC_TEST_ARR1_LEN = C_ARR_LEN(C_VC_TEST_ARR1); + static constexpr const std::size_t VC_TEST_ARR2_LEN = C_ARR_LEN(C_VC_TEST_ARR2); + static constexpr std::initializer_list VS_I_LIST1 = VS_TEST_ARR1; + static constexpr std::initializer_list VS_I_LIST2 = VS_TEST_ARR2; + static constexpr const char * C_VS_TEST_ARR1[] = VS_TEST_ARR1; + static constexpr const char * C_VS_TEST_ARR2[] = VS_TEST_ARR2; + static constexpr const std::array STD_VS_TEST_ARR1 = VS_TEST_ARR1; + static constexpr const std::array STD_VS_TEST_ARR2 = VS_TEST_ARR2; + static constexpr const std::size_t VS_TEST_ARR1_LEN = C_ARR_LEN(C_VS_TEST_ARR1); + static constexpr const std::size_t VS_TEST_ARR2_LEN = C_ARR_LEN(C_VS_TEST_ARR2); + static constexpr TestStruct C_VO_TEST_ARR1[] = VO_TEST_ARR1; + static constexpr TestStruct C_VO_TEST_ARR2[] = VO_TEST_ARR2; + static constexpr const std::array STD_VO_TEST_ARR1 = VO_TEST_ARR1; + static constexpr const std::array STD_VO_TEST_ARR2 = VO_TEST_ARR2; + static constexpr const std::size_t VO_TEST_ARR1_LEN = C_ARR_LEN(C_VO_TEST_ARR1); + static constexpr const std::size_t VO_TEST_ARR2_LEN = C_ARR_LEN(C_VO_TEST_ARR2); + static constexpr std::initializer_list VO_I_LIST1 = VO_TEST_ARR1; + static constexpr std::initializer_list VO_I_LIST2 = VO_TEST_ARR2; - template - struct get_test_def { - template - static consteval auto& get_arr_for_type(); + template + struct get { + template + static consteval auto& i_list(); + + template + static consteval auto & arr(); - template - static consteval unsigned long long int get_arr_len_for_type(); - }; + template + static consteval std::size_t arr_len(); + + template + static consteval std::size_t capacity(); + + }; }; -using int_defs = test_defs::get_test_def; -using char_defs = test_defs::get_test_def; -using string_defs = test_defs::get_test_def; -using obj_defs = test_defs::get_test_def; +template +template +consteval auto & test_defs::get::i_list() { return nullptr; } +template +template +consteval auto & test_defs::get::arr() { return nullptr; } +template +template +consteval std::size_t test_defs::get::arr_len() { return 0; } +template +template +consteval std::size_t test_defs::get::capacity() { return 0; } -template<> template<> consteval auto& int_defs::get_arr_for_type<1>() { return C_VI_TEST_ARR1; } -template<> template<> consteval auto& int_defs::get_arr_for_type<2>() { return C_VI_TEST_ARR2; } -template<> template<> consteval auto& char_defs::get_arr_for_type<1>() { return C_VC_TEST_ARR1; } -template<> template<> consteval auto& char_defs::get_arr_for_type<2>() { return C_VC_TEST_ARR2; } -template<> template<> consteval auto& string_defs::get_arr_for_type<1>() { return C_VS_TEST_ARR1; } -template<> template<> consteval auto& string_defs::get_arr_for_type<2>() { return C_VS_TEST_ARR2; } -template<> template<> consteval auto& obj_defs::get_arr_for_type<1>() { return C_VO_TEST_ARR1; } -template<> template<> consteval auto& obj_defs::get_arr_for_type<2>() { return C_VO_TEST_ARR2; } +template<> template<> consteval auto & test_defs::get::i_list<1>() { return VI_I_LIST1; } +template<> template<> consteval auto & test_defs::get::i_list<2>() { return VI_I_LIST2; } +template<> template<> consteval auto & test_defs::get::i_list<1>() { return VC_I_LIST1; } +template<> template<> consteval auto & test_defs::get::i_list<2>() { return VC_I_LIST2; } +template<> template<> consteval auto & test_defs::get::i_list<1>() { return VS_I_LIST1; } +template<> template<> consteval auto & test_defs::get::i_list<2>() { return VS_I_LIST2; } +template<> template<> consteval auto & test_defs::get::i_list<1>() { return VO_I_LIST1; } +template<> template<> consteval auto & test_defs::get::i_list<2>() { return VO_I_LIST2; } -template<> template<> consteval std::size_t int_defs::get_arr_len_for_type<1>() { return VI_TEST_ARR1_LEN; } -template<> template<> consteval std::size_t int_defs::get_arr_len_for_type<2>() { return VI_TEST_ARR2_LEN; } -template<> template<> consteval std::size_t char_defs::get_arr_len_for_type<1>() { return VC_TEST_ARR1_LEN; } -template<> template<> consteval std::size_t char_defs::get_arr_len_for_type<2>() { return VC_TEST_ARR2_LEN; } -template<> template<> consteval std::size_t string_defs::get_arr_len_for_type<1>() { return VS_TEST_ARR1_LEN; } -template<> template<> consteval std::size_t string_defs::get_arr_len_for_type<2>() { return VS_TEST_ARR2_LEN; } -template<> template<> consteval std::size_t obj_defs::get_arr_len_for_type<1>() { return VO_TEST_ARR1_LEN; } -template<> template<> consteval std::size_t obj_defs::get_arr_len_for_type<2>() { return VO_TEST_ARR2_LEN; } +template<> template<> consteval auto & test_defs::get::arr<1>() { return C_VI_TEST_ARR1; } +template<> template<> consteval auto & test_defs::get::arr<2>() { return C_VI_TEST_ARR2; } +template<> template<> consteval auto & test_defs::get::arr<1>() { return C_VC_TEST_ARR1; } +template<> template<> consteval auto & test_defs::get::arr<2>() { return C_VC_TEST_ARR2; } +template<> template<> consteval auto & test_defs::get::arr<1>() { return C_VS_TEST_ARR1; } +template<> template<> consteval auto & test_defs::get::arr<2>() { return C_VS_TEST_ARR2; } +template<> template<> consteval auto & test_defs::get::arr<1>() { return C_VO_TEST_ARR1; } +template<> template<> consteval auto & test_defs::get::arr<2>() { return C_VO_TEST_ARR2; } + +template<> template<> consteval std::size_t test_defs::get::arr_len<1>() { return VI_TEST_ARR1_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<2>() { return VI_TEST_ARR2_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<1>() { return VC_TEST_ARR1_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<2>() { return VC_TEST_ARR2_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<1>() { return VS_TEST_ARR1_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<2>() { return VS_TEST_ARR2_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<1>() { return VO_TEST_ARR1_LEN; } +template<> template<> consteval std::size_t test_defs::get::arr_len<2>() { return VO_TEST_ARR2_LEN; } + +template<> template<> consteval std::size_t test_defs::get::capacity<1>() { return TEST_VEC1_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<2>() { return TEST_VEC2_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<1>() { return TEST_VEC1_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<2>() { return TEST_VEC2_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<1>() { return TEST_VEC1_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<2>() { return TEST_VEC2_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<1>() { return TEST_VEC1_CAPACITY; } +template<> template<> consteval std::size_t test_defs::get::capacity<2>() { return TEST_VEC2_CAPACITY; } @@ -739,135 +778,45 @@ class test_const_vector : public test_defs { #pragma message("Testing operator=") - constexpr auto int_applicator = []()consteval { - constexpr auto &arr1 = int_defs::get_arr_for_type<1>(); - constexpr auto &arr2 = int_defs::get_arr_for_type<2>(); - constexpr auto arr1_len = int_defs::get_arr_len_for_type<1>(); - constexpr auto arr2_len = int_defs::get_arr_len_for_type<2>(); - cc::const_vector v1o(arr1); - cc::const_vector v2o(arr2); - struct { - decltype(v1o) v1cs; - decltype(v2o) v2cs; - cc::const_vector v1cd; - cc::const_vector v2cd; - decltype(v1o) v1m; - decltype(v2o) v2m; - cc::const_vector v1a; - cc::const_vector v2a; - cc::const_vector v1i; - cc::const_vector v2i; - } ret; - ret.v1cs = v1o; - ret.v2cs = v2o; - ret.v1cd = v1o; - ret.v2cd = v2o; - ret.v1m = const_cast &&>(v1o); - ret.v2m = const_cast &&>(v2o); - ret.v1a = arr1; - ret.v2a = arr2; - ret.v1i = VI_TEST_ARR1; - ret.v2i = VI_TEST_ARR2; - return ret; - }; - constexpr auto char_applicator = []()consteval { - constexpr auto &arr1 = char_defs::get_arr_for_type<1>(); - constexpr auto &arr2 = char_defs::get_arr_for_type<2>(); - constexpr auto arr1_len = char_defs::get_arr_len_for_type<1>(); - constexpr auto arr2_len = char_defs::get_arr_len_for_type<2>(); - cc::const_vector v1o(arr1); - cc::const_vector v2o(arr2); - struct { - decltype(v1o) v1cs; - decltype(v2o) v2cs; - cc::const_vector v1cd; - cc::const_vector v2cd; - decltype(v1o) v1m; - decltype(v2o) v2m; - cc::const_vector v1a; - cc::const_vector v2a; - cc::const_vector v1i; - cc::const_vector v2i; - } ret; - ret.v1cs = v1o; - ret.v2cs = v2o; - ret.v1cd = v1o; - ret.v2cd = v2o; - ret.v1m = const_cast &&>(v1o); - ret.v2m = const_cast &&>(v2o); - ret.v1a = arr1; - ret.v2a = arr2; - ret.v1i = VC_TEST_ARR1; - ret.v2i = VC_TEST_ARR2; - return ret; - }; - constexpr auto string_applicator = []()consteval { - constexpr auto &arr1 = string_defs::get_arr_for_type<1>(); - constexpr auto &arr2 = string_defs::get_arr_for_type<2>(); - constexpr auto arr1_len = string_defs::get_arr_len_for_type<1>(); - constexpr auto arr2_len = string_defs::get_arr_len_for_type<2>(); - cc::const_vector v1o(arr1); - cc::const_vector v2o(arr2); - struct { - decltype(v1o) v1cs; - decltype(v2o) v2cs; - cc::const_vector v1cd; - cc::const_vector v2cd; - decltype(v1o) v1m; - decltype(v2o) v2m; - cc::const_vector v1a; - cc::const_vector v2a; - cc::const_vector v1i; - cc::const_vector v2i; - } ret; - ret.v1cs = v1o; - ret.v2cs = v2o; - ret.v1cd = v1o; - ret.v2cd = v2o; - ret.v1m = const_cast &&>(v1o); - ret.v2m = const_cast &&>(v2o); - ret.v1a = arr1; - ret.v2a = arr2; - ret.v1i = VS_TEST_ARR1; - ret.v2i = VS_TEST_ARR2; - return ret; - }; - constexpr auto obj_applicator = []()consteval { - constexpr auto &arr1 = obj_defs::get_arr_for_type<1>(); - constexpr auto &arr2 = obj_defs::get_arr_for_type<2>(); - constexpr auto arr1_len = obj_defs::get_arr_len_for_type<1>(); - constexpr auto arr2_len = obj_defs::get_arr_len_for_type<2>(); - cc::const_vector v1o(arr1); - cc::const_vector v2o(arr2); - struct { - decltype(v1o) v1cs; - decltype(v2o) v2cs; - cc::const_vector v1cd; - cc::const_vector v2cd; - decltype(v1o) v1m; - decltype(v2o) v2m; - cc::const_vector v1a; - cc::const_vector v2a; - cc::const_vector v1i; - cc::const_vector v2i; - } ret; - ret.v1cs = v1o; - ret.v2cs = v2o; - ret.v1cd = v1o; - ret.v2cd = v2o; - ret.v1m = const_cast &&>(v1o); - ret.v2m = const_cast &&>(v2o); - ret.v1a = arr1; - ret.v2a = arr2; - ret.v1i = VO_TEST_ARR1; - ret.v2i = VO_TEST_ARR2; - return ret; - }; + constexpr auto applicator = [] () consteval { + constexpr auto &arr1 = test_defs::get::template arr<1>(); + constexpr auto &arr2 = test_defs::get::template arr<2>(); + constexpr auto arr1_len = test_defs::get::template arr_len<1>(); + constexpr auto arr2_len = test_defs::get::template arr_len<2>(); + constexpr auto arr1_cap = test_defs::get::template capacity<1>(); + constexpr auto arr2_cap = test_defs::get::template capacity<2>(); + cc::const_vector v1o(arr1); + cc::const_vector v2o(arr2); + struct { + decltype(v1o) v1cs; + decltype(v2o) v2cs; + cc::const_vector v1cd; + cc::const_vector v2cd; + decltype(v1o) v1m; + decltype(v2o) v2m; + cc::const_vector v1a; + cc::const_vector v2a; + cc::const_vector v1i; + cc::const_vector v2i; + } ret; + ret.v1cs = v1o; + ret.v2cs = v2o; + ret.v1cd = v1o; + ret.v2cd = v2o; + ret.v1m = const_cast &&>(v1o); + ret.v2m = const_cast &&>(v2o); + ret.v1a = arr1; + ret.v2a = arr2; + ret.v1i = test_defs::get::template i_list<1>(); + ret.v2i = test_defs::get::template i_list<2>(); + + return ret; + }; - constexpr auto int_res = int_applicator(); - constexpr auto char_res = char_applicator(); - constexpr auto string_res = string_applicator(); - constexpr auto obj_res = obj_applicator(); + constexpr auto int_res = applicator.operator()(); + constexpr auto char_res = applicator.operator()(); + constexpr auto string_res = applicator.operator()(); + constexpr auto obj_res = applicator.operator()(); ASSERT(int_res.v1cs._len == VI_TEST_ARR1_LEN) ASSERT(int_res.v2cs._len == VI_TEST_ARR2_LEN)