Skip to content

Commit ca3226e

Browse files
committed
replace custom tuple unpacking code with std::apply
clang-tidy recomments replacing `enable_if` with C++20 `requires`. However, the code can be simplified with `std::apply`.
1 parent 949fe85 commit ca3226e

File tree

1 file changed

+17
-39
lines changed

1 file changed

+17
-39
lines changed

include/mp/proxy-types.h

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -389,30 +389,17 @@ struct ClientParam
389389

390390
struct BuildParams : IterateFieldsHelper<BuildParams, sizeof...(Types)>
391391
{
392-
template <typename... Args>
393-
void handleField(Args&&... args)
394-
{
395-
callBuild<0>(std::forward<Args>(args)...);
396-
}
397-
398-
// TODO Possible optimization to speed up compile time:
399-
// https://stackoverflow.com/a/7858971 Using enable_if below to check
400-
// position when unpacking tuple might be slower than pattern matching
401-
// approach in the stack overflow solution
402-
template <size_t I, typename... Args>
403-
auto callBuild(Args&&... args) -> std::enable_if_t<(I < sizeof...(Types))>
404-
{
405-
callBuild<I + 1>(std::forward<Args>(args)..., std::get<I>(m_client_param->m_values));
406-
}
407-
408-
template <size_t I, typename Params, typename ParamList, typename... Values>
409-
auto callBuild(ClientInvokeContext& invoke_context, Params& params, ParamList, Values&&... values) ->
410-
std::enable_if_t<(I == sizeof...(Types))>
392+
template <typename Params, typename ParamList>
393+
void handleField(ClientInvokeContext& invoke_context, Params& params, ParamList)
411394
{
412-
MaybeBuildField(std::integral_constant<bool, Accessor::in>(), ParamList(), invoke_context,
413-
Make<StructField, Accessor>(params), std::forward<Values>(values)...);
414-
MaybeSetWant(
415-
ParamList(), Priority<1>(), std::forward<Values>(values)..., Make<StructField, Accessor>(params));
395+
auto const fun = [&]<typename... Values>(Values&&... values) {
396+
MaybeBuildField(std::integral_constant<bool, Accessor::in>(), ParamList(), invoke_context,
397+
Make<StructField, Accessor>(params), std::forward<Values>(values)...);
398+
MaybeSetWant(
399+
ParamList(), Priority<1>(), std::forward<Values>(values)..., Make<StructField, Accessor>(params));
400+
};
401+
402+
std::apply(fun, m_client_param->m_values);
416403
}
417404

418405
BuildParams(ClientParam* client_param) : m_client_param(client_param) {}
@@ -421,24 +408,15 @@ struct ClientParam
421408

422409
struct ReadResults : IterateFieldsHelper<ReadResults, sizeof...(Types)>
423410
{
424-
template <typename... Args>
425-
void handleField(Args&&... args)
426-
{
427-
callRead<0>(std::forward<Args>(args)...);
428-
}
429-
430-
template <int I, typename... Args>
431-
auto callRead(Args&&... args) -> std::enable_if_t<(I < sizeof...(Types))>
411+
template <typename Results, typename... Params>
412+
void handleField(ClientInvokeContext& invoke_context, Results& results, TypeList<Params...>)
432413
{
433-
callRead<I + 1>(std::forward<Args>(args)..., std::get<I>(m_client_param->m_values));
434-
}
414+
auto const fun = [&]<typename... Values>(Values&&... values) {
415+
MaybeReadField(std::integral_constant<bool, Accessor::out>(), TypeList<Decay<Params>...>(), invoke_context,
416+
Make<StructField, Accessor>(results), ReadDestUpdate(values)...);
417+
};
435418

436-
template <int I, typename Results, typename... Params, typename... Values>
437-
auto callRead(ClientInvokeContext& invoke_context, Results& results, TypeList<Params...>, Values&&... values)
438-
-> std::enable_if_t<I == sizeof...(Types)>
439-
{
440-
MaybeReadField(std::integral_constant<bool, Accessor::out>(), TypeList<Decay<Params>...>(), invoke_context,
441-
Make<StructField, Accessor>(results), ReadDestUpdate(values)...);
419+
std::apply(fun, m_client_param->m_values);
442420
}
443421

444422
ReadResults(ClientParam* client_param) : m_client_param(client_param) {}

0 commit comments

Comments
 (0)