diff --git a/include/picongpu/plugins/binning/BinningFunctors.hpp b/include/picongpu/plugins/binning/BinningFunctors.hpp index 176a105030..356bdf452b 100644 --- a/include/picongpu/plugins/binning/BinningFunctors.hpp +++ b/include/picongpu/plugins/binning/BinningFunctors.hpp @@ -59,12 +59,11 @@ namespace picongpu auto binsDataspace = pmacc::DataSpace{}; bool validIdx = true; - binning::apply( - [&](auto const&... tupleArgs) + binning::applyIndexed( + [&](auto const& tuple, auto... idxs) { - uint32_t i = 0; // This assumes n_bins and getBinIdx exist - ((binsDataspace[i++] = tupleArgs.getBinIdx(domainInfo, worker, particle, validIdx)), ...); + ((binsDataspace[idxs] = pmacc::memory::tuple::get(tuple).getBinIdx(domainInfo, worker, particle, validIdx)), ...); }, std::move(axes)); diff --git a/include/picongpu/plugins/binning/utility.hpp b/include/picongpu/plugins/binning/utility.hpp index 1a6acd7129..6d75fd46e9 100644 --- a/include/picongpu/plugins/binning/utility.hpp +++ b/include/picongpu/plugins/binning/utility.hpp @@ -32,23 +32,43 @@ namespace picongpu namespace detail { template - HDINLINE constexpr auto apply_impl(TFunc&& f, TPmaccTuple&& t, std::index_sequence) + HDINLINE constexpr auto applyImpl(TFunc&& f, TPmaccTuple&& t, std::index_sequence) { - // @todo give Is as a param to f, so compiler has knowledge return std::forward(f)(pmacc::memory::tuple::get(std::forward(t))...); } + + template + HDINLINE constexpr auto applyIdxImpl(TFunc&& f, TPmaccTuple&& t, std::index_sequence) + { + return std::forward(f)( + std::forward(t), + std::integral_constant{}...); + } + + } // namespace detail // takes pmacc::memory::tuple::Tuple template HDINLINE constexpr auto apply(TFunc&& f, TPmaccTuple&& t) { - return detail::apply_impl( + return detail::applyImpl( std::forward(f), std::forward(t), std::make_index_sequence>{}); } + // takes pmacc::memory::tuple::Tuple + template + HDINLINE constexpr auto applyIndexed(TFunc&& f, TPmaccTuple&& t) + { + return detail::applyIdxImpl( + std::forward(f), + std::forward(t), + std::make_index_sequence>{}); + } + + namespace detail { template