added CREATE_FROM_IL

This commit is contained in:
Patrick 2024-07-22 20:36:19 +02:00
parent 46bf398a78
commit 297c42b176
3 changed files with 21 additions and 10 deletions

View File

@ -247,9 +247,14 @@ inline std::ostream& operator<<(std::ostream& os, ReturnCode rc) {
}
}
template <template<typename T, std::initializer_list<T> il> typename Callee>
constexpr void expand_from_ilist() {
return Callee { };
}
#define CREATE_FROM_IL(type, il, len) \
([]<std::size_t N, typename ArgType>(std::initializer_list<ArgType> args) { \
auto creator = [&args] <std::size_t ..._idx> (std::index_sequence<_idx...>) { \
return type { (*std::next(std::begin(args), _idx))... }; \
}; \
return creator(std::make_index_sequence<N>()); \
}).operator()<len>(il)
#endif //CONST_CONTAINER_TEST_HPP_

View File

@ -272,8 +272,8 @@ constexpr test_suite tests = define_tests("Tests")
ASSERT_RANGE_VEC_EQ(vi4, test_defs::get<int>::arr_len<2>(), test_defs::get<int>::capacity<2>(), int());
cc::const_vector vc1(test_defs::get<char>::i_list<1>);
cc::const_vector vc2(test_defs::get<char>::i_list<2>);
auto vc1 = CREATE_FROM_IL(cc::const_vector, test_defs::get<char>::i_list<1>, test_defs::get<char>::il_len<1>());
auto vc2 = CREATE_FROM_IL(cc::const_vector, test_defs::get<char>::i_list<2>, test_defs::get<char>::il_len<2>());
cc::const_vector<char, test_defs::get<int>::capacity<1>()> vc3(test_defs::get<char>::i_list<1>);
cc::const_vector<char, test_defs::get<int>::capacity<2>()> vc4(test_defs::get<char>::i_list<2>);
@ -293,8 +293,8 @@ constexpr test_suite tests = define_tests("Tests")
ASSERT_RANGE_VEC_EQ(vc4, test_defs::get<char>::arr_len<2>(), test_defs::get<int>::capacity<2>(), char());
cc::const_vector vs1(test_defs::get<const char *>::i_list<1>);
cc::const_vector vs2(test_defs::get<const char *>::i_list<2>);
auto vs1 = CREATE_FROM_IL(cc::const_vector, test_defs::get<const char*>::i_list<1>, test_defs::get<const char*>::il_len<1>());
auto vs2 = CREATE_FROM_IL(cc::const_vector, test_defs::get<const char*>::i_list<2>, test_defs::get<const char*>::il_len<2>());
cc::const_vector<const char *, test_defs::get<int>::capacity<1>()> vs3(test_defs::get<const char *>::i_list<1>);
cc::const_vector<const char *, test_defs::get<int>::capacity<2>()> vs4(test_defs::get<const char *>::i_list<2>);
@ -312,8 +312,8 @@ constexpr test_suite tests = define_tests("Tests")
ASSERT_RANGE_VEC_ARR_EQ(vs4, 0, test_defs::get<const char *>::arr_len<2>(), test_defs::get<const char *>::i_list<2>);
cc::const_vector vo1(test_defs::get<TestStruct>::i_list<1>);
cc::const_vector vo2(test_defs::get<TestStruct>::i_list<2>);
auto vo1 = CREATE_FROM_IL(cc::const_vector, test_defs::get<TestStruct>::i_list<1>, test_defs::get<TestStruct>::il_len<1>());
auto vo2 = CREATE_FROM_IL(cc::const_vector, test_defs::get<TestStruct>::i_list<2>, test_defs::get<TestStruct>::il_len<2>());
cc::const_vector<TestStruct, test_defs::get<int>::capacity<1>()> vo3(test_defs::get<TestStruct>::i_list<1>);
cc::const_vector<TestStruct, test_defs::get<int>::capacity<2>()> vo4(test_defs::get<TestStruct>::i_list<2>);

View File

@ -58,6 +58,9 @@ struct test_defs {
template<std::size_t nr>
static consteval std::size_t arr_len();
template<std::size_t nr>
static consteval std::size_t il_len();
template<std::size_t nr>
static consteval std::size_t capacity();
@ -117,6 +120,9 @@ template<std::size_t nr>
consteval std::size_t test_defs::get<T>::arr_len() { return C_ARR_LEN(arr<nr>); }
template<typename T>
template<std::size_t nr>
consteval std::size_t test_defs::get<T>::il_len() { return i_list<nr>.size(); }
template<typename T>
template<std::size_t nr>
consteval std::size_t test_defs::get<T>::capacity() { return 0; }
template<typename T>
template<std::size_t nr>