From 250e9fcc299cfba38bdc156a9ba102c00a0b6242 Mon Sep 17 00:00:00 2001 From: Tapish Date: Tue, 4 Feb 2025 15:28:04 +0100 Subject: [PATCH] Fix forwarding of custom tuple and add indexed apply --- include/picongpu/plugins/binning/Binner.hpp | 4 +- .../plugins/binning/BinningFunctors.hpp | 16 ++++---- include/picongpu/plugins/binning/utility.hpp | 41 +++++++++++++------ include/pmacc/memory/STLTuple.hpp | 11 +++++ 4 files changed, 51 insertions(+), 21 deletions(-) diff --git a/include/picongpu/plugins/binning/Binner.hpp b/include/picongpu/plugins/binning/Binner.hpp index 2e43a1e675..51a61651e4 100644 --- a/include/picongpu/plugins/binning/Binner.hpp +++ b/include/picongpu/plugins/binning/Binner.hpp @@ -115,7 +115,7 @@ namespace picongpu { pmacc::DataSpace const nDIdx = pmacc::math::mapToND(extentsDataspace, linearTid); float_X factor = 1.; - apply( + binning::apply( [&](auto const&... binWidthsKernel) { // uses bin width for axes without dimensions as well should those be ignored? @@ -246,7 +246,7 @@ namespace picongpu this->histBuffer->getDeviceBuffer().getDataBox()); // change output dimensions - apply( + std::apply( [&](auto const&... tupleArgs) { ((dimensionSubtraction(outputUnits, tupleArgs.units)), ...); }, binningData.axisTuple); diff --git a/include/picongpu/plugins/binning/BinningFunctors.hpp b/include/picongpu/plugins/binning/BinningFunctors.hpp index ebb057b0af..209192bf6d 100644 --- a/include/picongpu/plugins/binning/BinningFunctors.hpp +++ b/include/picongpu/plugins/binning/BinningFunctors.hpp @@ -53,19 +53,21 @@ namespace picongpu auto binsDataspace = pmacc::DataSpace{}; bool validIdx = true; - apply( - [&](auto const&... tupleArgs) + binning::applyIndexed( + [&](auto const& tuple, auto... idxs) { - uint32_t i = 0; // This assumes n_bins and getBinIdx exist validIdx - = (( + = ( [&] { - auto [isValid, binIdx] = tupleArgs.getBinIdx(domainInfo, worker, particle); - binsDataspace[i++] = binIdx; + auto [isValid, binIdx] = pmacc::memory::tuple::get(tuple).getBinIdx( + domainInfo, + worker, + particle); + binsDataspace[idxs] = binIdx; return isValid; - }()) + }() && ...); }, axes); diff --git a/include/picongpu/plugins/binning/utility.hpp b/include/picongpu/plugins/binning/utility.hpp index a6ae9ae2ac..c7ef59eabf 100644 --- a/include/picongpu/plugins/binning/utility.hpp +++ b/include/picongpu/plugins/binning/utility.hpp @@ -31,26 +31,43 @@ namespace picongpu { namespace detail { - template - HDINLINE constexpr auto apply_impl( - TFunc&& f, - pmacc::memory::tuple::Tuple&& t, - std::index_sequence) + template + HDINLINE constexpr decltype(auto) applyImpl(TFunc&& f, TPmaccTuple&& t, std::index_sequence) { - // @todo give Is as a param to f, so compiler has knowledge - return f(pmacc::memory::tuple::get(std::forward&&>(t))...); + return std::forward(f)(pmacc::memory::tuple::get(std::forward(t))...); } + + template + HDINLINE constexpr decltype(auto) applyIdxImpl(TFunc&& f, TPmaccTuple&& t, std::index_sequence) + { + return std::forward( + f)(std::forward(t), std::integral_constant{}...); + } + + } // namespace detail - template - HDINLINE constexpr auto apply(TFunc&& f, pmacc::memory::tuple::Tuple t) + // takes pmacc::memory::tuple::Tuple + template + HDINLINE constexpr decltype(auto) apply(TFunc&& f, TPmaccTuple&& t) { - return detail::apply_impl( + return detail::applyImpl( std::forward(f), - std::forward&&>(t), - std::make_index_sequence{}); + std::forward(t), + std::make_index_sequence>{}); } + // takes pmacc::memory::tuple::Tuple + template + HDINLINE constexpr decltype(auto) applyIndexed(TFunc&& f, TPmaccTuple&& t) + { + return detail::applyIdxImpl( + std::forward(f), + std::forward(t), + std::make_index_sequence>{}); + } + + namespace detail { template diff --git a/include/pmacc/memory/STLTuple.hpp b/include/pmacc/memory/STLTuple.hpp index 95edcac546..677c9266cc 100644 --- a/include/pmacc/memory/STLTuple.hpp +++ b/include/pmacc/memory/STLTuple.hpp @@ -193,6 +193,17 @@ static constexpr size_t size(Tuple&) { return sizeof...(Args); } + // Handles cv-qualifiers and refs +template +struct tuple_size : tuple_size> {}; + +template +struct tuple_size> : std::integral_constant{ +}; + +template +constexpr std::size_t tuple_size_v = tuple_size::value; + /// @struct IndexList /// @brief Creates a list of index from the elements in the tuple /// @tparam Is... a list of index from [0 to sizeof...(tuple elements))