Skip to content

Commit 8a4a359

Browse files
committed
process dimension
1 parent 1abb2a7 commit 8a4a359

File tree

1 file changed

+43
-36
lines changed

1 file changed

+43
-36
lines changed

src/process/dimension.h

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,49 +28,56 @@ namespace ns::process
2828
{
2929
namespace dimension_implementation
3030
{
31+
template <template <std::size_t> typename Dimension, typename F, std::size_t... N>
32+
using ReturnType = std::common_type_t<decltype(std::declval<F>()(Dimension<N>()))...>;
33+
3134
[[noreturn]] void dimension_not_supported_error(unsigned dimension);
3235

33-
template <template <std::size_t> typename Dimension, typename T, std::size_t... N>
34-
auto apply(const std::size_t dimension, const T& f, std::index_sequence<N...>&&)
36+
template <template <std::size_t> typename Dimension, typename F, std::size_t... N>
37+
requires (std::is_same_v<void, ReturnType<Dimension, F, N...>>)
38+
void apply(const std::size_t dimension, const F& f, std::index_sequence<N...>&&)
3539
{
36-
using ReturnType = std::common_type_t<decltype(f(Dimension<N>()))...>;
40+
const bool r = ((
41+
[&]
42+
{
43+
if (N == dimension)
44+
{
45+
f(Dimension<N>());
46+
return true;
47+
}
48+
return false;
49+
}()
50+
|| ...));
3751

38-
if constexpr (std::is_same_v<void, ReturnType>)
52+
if (r)
3953
{
40-
const bool r = ((
41-
[&]
42-
{
43-
if (N == dimension)
44-
{
45-
f(Dimension<N>());
46-
return true;
47-
}
48-
return false;
49-
}()
50-
|| ...));
51-
if (r)
52-
{
53-
return;
54-
}
54+
return;
5555
}
56-
else
57-
{
58-
std::optional<ReturnType> r;
59-
static_cast<void>((
60-
[&]
61-
{
62-
if (N == dimension)
63-
{
64-
r.emplace(f(Dimension<N>()));
65-
return true;
66-
}
67-
return false;
68-
}()
69-
|| ...));
70-
if (r)
56+
57+
dimension_not_supported_error(dimension);
58+
}
59+
60+
template <template <std::size_t> typename Dimension, typename F, std::size_t... N>
61+
requires (!std::is_same_v<void, ReturnType<Dimension, F, N...>>)
62+
auto apply(const std::size_t dimension, const F& f, std::index_sequence<N...>&&)
63+
{
64+
std::optional<ReturnType<Dimension, F, N...>> r;
65+
66+
static_cast<void>((
67+
[&]
7168
{
72-
return std::move(*r);
73-
}
69+
if (N == dimension)
70+
{
71+
r.emplace(f(Dimension<N>()));
72+
return true;
73+
}
74+
return false;
75+
}()
76+
|| ...));
77+
78+
if (r)
79+
{
80+
return std::move(*r);
7481
}
7582

7683
dimension_not_supported_error(dimension);

0 commit comments

Comments
 (0)