Compare commits

...

2 Commits

Author SHA1 Message Date
cyborg1811m 5441e8a03c fixed and cleaned up operator= 2024-01-16 14:07:23 +01:00
cyborg1811m 5c93794d68 corrected typo 2024-01-15 11:52:00 +01:00
1 changed files with 132 additions and 183 deletions

View File

@ -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<int> VI_I_LIST1 = VI_TEST_ARR1;
static constexpr std::initializer_list<int> 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<char> VC_I_LIST1 = VC_TEST_ARR1;
static constexpr std::initializer_list<char> 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<const char *> VS_I_LIST1 = VS_TEST_ARR1;
static constexpr std::initializer_list<const char *> 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<TestStruct> VO_I_LIST1 = VO_TEST_ARR1;
static constexpr std::initializer_list<TestStruct> VO_I_LIST2 = VO_TEST_ARR2;
template<typename T>
struct get_test_def {
template<unsigned long long int nr>
static consteval auto& get_arr_for_type();
template<typename T>
struct get {
template<std::size_t nr>
static consteval auto& i_list();
template<std::size_t nr>
static consteval auto & arr();
template<unsigned long long int nr>
static consteval unsigned long long int get_arr_len_for_type();
};
template<std::size_t nr>
static consteval std::size_t arr_len();
template<std::size_t nr>
static consteval std::size_t capacity();
};
};
using int_defs = test_defs::get_test_def<int>;
using char_defs = test_defs::get_test_def<char>;
using string_defs = test_defs::get_test_def<const char *>;
using obj_defs = test_defs::get_test_def<TestStruct>;
template<typename T>
template<std::size_t nr>
consteval auto & test_defs::get<T>::i_list() { return nullptr; }
template<typename T>
template<std::size_t nr>
consteval auto & test_defs::get<T>::arr() { return nullptr; }
template<typename T>
template<std::size_t nr>
consteval std::size_t test_defs::get<T>::arr_len() { return 0; }
template<typename T>
template<std::size_t nr>
consteval std::size_t test_defs::get<T>::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<int>::i_list<1>() { return VI_I_LIST1; }
template<> template<> consteval auto & test_defs::get<int>::i_list<2>() { return VI_I_LIST2; }
template<> template<> consteval auto & test_defs::get<char>::i_list<1>() { return VC_I_LIST1; }
template<> template<> consteval auto & test_defs::get<char>::i_list<2>() { return VC_I_LIST2; }
template<> template<> consteval auto & test_defs::get<const char *>::i_list<1>() { return VS_I_LIST1; }
template<> template<> consteval auto & test_defs::get<const char *>::i_list<2>() { return VS_I_LIST2; }
template<> template<> consteval auto & test_defs::get<TestStruct>::i_list<1>() { return VO_I_LIST1; }
template<> template<> consteval auto & test_defs::get<TestStruct>::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<int>::arr<1>() { return C_VI_TEST_ARR1; }
template<> template<> consteval auto & test_defs::get<int>::arr<2>() { return C_VI_TEST_ARR2; }
template<> template<> consteval auto & test_defs::get<char>::arr<1>() { return C_VC_TEST_ARR1; }
template<> template<> consteval auto & test_defs::get<char>::arr<2>() { return C_VC_TEST_ARR2; }
template<> template<> consteval auto & test_defs::get<const char*>::arr<1>() { return C_VS_TEST_ARR1; }
template<> template<> consteval auto & test_defs::get<const char*>::arr<2>() { return C_VS_TEST_ARR2; }
template<> template<> consteval auto & test_defs::get<TestStruct>::arr<1>() { return C_VO_TEST_ARR1; }
template<> template<> consteval auto & test_defs::get<TestStruct>::arr<2>() { return C_VO_TEST_ARR2; }
template<> template<> consteval std::size_t test_defs::get<int>::arr_len<1>() { return VI_TEST_ARR1_LEN; }
template<> template<> consteval std::size_t test_defs::get<int>::arr_len<2>() { return VI_TEST_ARR2_LEN; }
template<> template<> consteval std::size_t test_defs::get<char>::arr_len<1>() { return VC_TEST_ARR1_LEN; }
template<> template<> consteval std::size_t test_defs::get<char>::arr_len<2>() { return VC_TEST_ARR2_LEN; }
template<> template<> consteval std::size_t test_defs::get<const char *>::arr_len<1>() { return VS_TEST_ARR1_LEN; }
template<> template<> consteval std::size_t test_defs::get<const char *>::arr_len<2>() { return VS_TEST_ARR2_LEN; }
template<> template<> consteval std::size_t test_defs::get<TestStruct>::arr_len<1>() { return VO_TEST_ARR1_LEN; }
template<> template<> consteval std::size_t test_defs::get<TestStruct>::arr_len<2>() { return VO_TEST_ARR2_LEN; }
template<> template<> consteval std::size_t test_defs::get<int>::capacity<1>() { return TEST_VEC1_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<int>::capacity<2>() { return TEST_VEC2_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<char>::capacity<1>() { return TEST_VEC1_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<char>::capacity<2>() { return TEST_VEC2_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<const char *>::capacity<1>() { return TEST_VEC1_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<const char *>::capacity<2>() { return TEST_VEC2_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<TestStruct>::capacity<1>() { return TEST_VEC1_CAPACITY; }
template<> template<> consteval std::size_t test_defs::get<TestStruct>::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<int, 5> v1cd;
cc::const_vector<int, 10> v2cd;
decltype(v1o) v1m;
decltype(v2o) v2m;
cc::const_vector<int, 5> v1a;
cc::const_vector<int, 10> v2a;
cc::const_vector<int, 5> v1i;
cc::const_vector<int, 10> v2i;
} ret;
ret.v1cs = v1o;
ret.v2cs = v2o;
ret.v1cd = v1o;
ret.v2cd = v2o;
ret.v1m = const_cast<cc::const_vector<decltype(v1o)::value_type, decltype(v1o)::_len> &&>(v1o);
ret.v2m = const_cast<cc::const_vector<decltype(v2o)::value_type, decltype(v2o)::_len> &&>(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<char, 5> v1cd;
cc::const_vector<char, 10> v2cd;
decltype(v1o) v1m;
decltype(v2o) v2m;
cc::const_vector<char, 5> v1a;
cc::const_vector<char, 10> v2a;
cc::const_vector<char, 5> v1i;
cc::const_vector<char, 10> v2i;
} ret;
ret.v1cs = v1o;
ret.v2cs = v2o;
ret.v1cd = v1o;
ret.v2cd = v2o;
ret.v1m = const_cast<cc::const_vector<decltype(v1o)::value_type, decltype(v1o)::_len> &&>(v1o);
ret.v2m = const_cast<cc::const_vector<decltype(v2o)::value_type, decltype(v2o)::_len> &&>(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<const char *, 5> v1cd;
cc::const_vector<const char *, 10> v2cd;
decltype(v1o) v1m;
decltype(v2o) v2m;
cc::const_vector<const char *, 5> v1a;
cc::const_vector<const char *, 10> v2a;
cc::const_vector<const char *, 5> v1i;
cc::const_vector<const char *, 10> v2i;
} ret;
ret.v1cs = v1o;
ret.v2cs = v2o;
ret.v1cd = v1o;
ret.v2cd = v2o;
ret.v1m = const_cast<cc::const_vector<decltype(v1o)::value_type, decltype(v1o)::_len> &&>(v1o);
ret.v2m = const_cast<cc::const_vector<decltype(v2o)::value_type, decltype(v2o)::_len> &&>(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<TestStruct, 5> v1cd;
cc::const_vector<TestStruct, 10> v2cd;
decltype(v1o) v1m;
decltype(v2o) v2m;
cc::const_vector<TestStruct, 5> v1a;
cc::const_vector<TestStruct, 10> v2a;
cc::const_vector<TestStruct, 5> v1i;
cc::const_vector<TestStruct, 10> v2i;
} ret;
ret.v1cs = v1o;
ret.v2cs = v2o;
ret.v1cd = v1o;
ret.v2cd = v2o;
ret.v1m = const_cast<cc::const_vector<decltype(v1o)::value_type, decltype(v1o)::_len> &&>(v1o);
ret.v2m = const_cast<cc::const_vector<decltype(v2o)::value_type, decltype(v2o)::_len> &&>(v2o);
ret.v1a = arr1;
ret.v2a = arr2;
ret.v1i = VO_TEST_ARR1;
ret.v2i = VO_TEST_ARR2;
return ret;
};
constexpr auto applicator = [] <typename T> () consteval {
constexpr auto &arr1 = test_defs::get<T>::template arr<1>();
constexpr auto &arr2 = test_defs::get<T>::template arr<2>();
constexpr auto arr1_len = test_defs::get<T>::template arr_len<1>();
constexpr auto arr2_len = test_defs::get<T>::template arr_len<2>();
constexpr auto arr1_cap = test_defs::get<T>::template capacity<1>();
constexpr auto arr2_cap = test_defs::get<T>::template capacity<2>();
cc::const_vector v1o(arr1);
cc::const_vector v2o(arr2);
struct {
decltype(v1o) v1cs;
decltype(v2o) v2cs;
cc::const_vector<T, arr1_cap> v1cd;
cc::const_vector<T, arr2_cap> v2cd;
decltype(v1o) v1m;
decltype(v2o) v2m;
cc::const_vector<T, arr1_cap> v1a;
cc::const_vector<T, arr2_cap> v2a;
cc::const_vector<T, arr1_cap> v1i;
cc::const_vector<T, arr2_cap> v2i;
} ret;
ret.v1cs = v1o;
ret.v2cs = v2o;
ret.v1cd = v1o;
ret.v2cd = v2o;
ret.v1m = const_cast<cc::const_vector<typename decltype(v1o)::value_type, decltype(v1o)::_len> &&>(v1o);
ret.v2m = const_cast<cc::const_vector<typename decltype(v2o)::value_type, decltype(v2o)::_len> &&>(v2o);
ret.v1a = arr1;
ret.v2a = arr2;
ret.v1i = test_defs::get<T>::template i_list<1>();
ret.v2i = test_defs::get<T>::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()<int>();
constexpr auto char_res = applicator.operator()<char>();
constexpr auto string_res = applicator.operator()<const char *>();
constexpr auto obj_res = applicator.operator()<TestStruct>();
ASSERT(int_res.v1cs._len == VI_TEST_ARR1_LEN)
ASSERT(int_res.v2cs._len == VI_TEST_ARR2_LEN)
@ -1011,7 +960,7 @@ int main(int, char *[])
std::cout << "Test of constructor 'const_vector(InputIt first, InputIt last)': " << test_const_vector::test_constructor_iterator() << std::endl;
std::cout << "Test of copy constructors: " << test_const_vector::test_constructor_copy() << std::endl;
std::cout << "Test of move constructor: " << test_const_vector::test_constructor_move() << std::endl;
std::cout << "Test of move constructor: " << test_const_vector::test_operator_eq() << std::endl;
std::cout << "Test of operator=: " << test_const_vector::test_operator_eq() << std::endl;
return 0;
}