added REPEAT_FOR_TYPES_N
This commit is contained in:
parent
3413dadfae
commit
dde9be29fc
|
|
@ -292,6 +292,26 @@ constexpr auto _repeat_for_types(auto f) {
|
||||||
return rets;
|
return rets;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <std::size_t _N, typename ...Ts, std::size_t N = _N - 1>
|
||||||
|
constexpr auto _repeat_for_types_n(auto f) {
|
||||||
|
std::array rets = {
|
||||||
|
[&]<typename T, std::size_t ...Ns>(std::index_sequence<Ns...>) constexpr {
|
||||||
|
return std::array { f.template operator()<T, Ns+1>()... };
|
||||||
|
}.template operator()<Ts>(std::make_index_sequence<N>())...
|
||||||
|
};
|
||||||
|
// Clion does not accept this as a constant expression
|
||||||
|
// even though it compiles and works as intended
|
||||||
|
//return rets | std::ranges::views::join;
|
||||||
|
std::array<ret_val_s, sizeof...(Ts) * N> arr;
|
||||||
|
auto arr_it = std::begin(arr);
|
||||||
|
for (auto&& rp : rets) {
|
||||||
|
for (ret_val_s& r : rp) {
|
||||||
|
*(arr_it++) = r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
#define REPEAT_FOR_TYPES(func, ...) { \
|
#define REPEAT_FOR_TYPES(func, ...) { \
|
||||||
auto r = _repeat_for_types<__VA_ARGS__>(func); \
|
auto r = _repeat_for_types<__VA_ARGS__>(func); \
|
||||||
auto it = std::ranges::find_if(r, [](auto&& e) constexpr { return e.val == ReturnCode::FAILED; }); \
|
auto it = std::ranges::find_if(r, [](auto&& e) constexpr { return e.val == ReturnCode::FAILED; }); \
|
||||||
|
|
@ -300,6 +320,13 @@ constexpr auto _repeat_for_types(auto f) {
|
||||||
} \
|
} \
|
||||||
} static_assert(true, "")
|
} static_assert(true, "")
|
||||||
|
|
||||||
|
#define REPEAT_FOR_TYPES_N(func, N, ...) { \
|
||||||
|
auto r = _repeat_for_types_n<N, __VA_ARGS__>(func); \
|
||||||
|
auto it = std::ranges::find_if(r, [](auto&& e) constexpr { return e.val == ReturnCode::FAILED; }); \
|
||||||
|
if (it != std::ranges::end(r)) { \
|
||||||
|
return *it; \
|
||||||
|
} \
|
||||||
|
} static_assert(true, "")
|
||||||
|
|
||||||
#define CREATE_FROM_IL(type, il, len) \
|
#define CREATE_FROM_IL(type, il, len) \
|
||||||
([]<std::size_t N, typename ArgType>(std::initializer_list<ArgType> args) { \
|
([]<std::size_t N, typename ArgType>(std::initializer_list<ArgType> args) { \
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue