From 7f81b6fc48a582e55860f851b330e9047efbf551 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20P=C3=B6schel?= Date: Mon, 20 Apr 2026 17:58:05 +0200 Subject: [PATCH 1/2] Fix defer::to_opaque --- include/openPMD/auxiliary/Defer.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/openPMD/auxiliary/Defer.hpp b/include/openPMD/auxiliary/Defer.hpp index a99bca1d37..541ca4af70 100644 --- a/include/openPMD/auxiliary/Defer.hpp +++ b/include/openPMD/auxiliary/Defer.hpp @@ -23,13 +23,13 @@ struct defer_type auto to_opaque() && -> defer_type> { - do_run_this = false; if (!do_run_this) { return defer_type>{{}, false}; } else { + do_run_this = false; return defer_type>{ std::function{std::move(functor)}}; } From 5fbe33c9fee2373371d0f8ae8463d2a827bdc674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franz=20P=C3=B6schel?= Date: Mon, 20 Apr 2026 19:20:13 +0200 Subject: [PATCH 2/2] Properly handle move constructor / operator retrigger ci --- include/openPMD/auxiliary/Defer.hpp | 38 ++++++++++++++++++++--------- src/IO/HDF5/HDF5IOHandler.cpp | 38 ++++++++++++++--------------- 2 files changed, 44 insertions(+), 32 deletions(-) diff --git a/include/openPMD/auxiliary/Defer.hpp b/include/openPMD/auxiliary/Defer.hpp index 541ca4af70..c6bc4e0533 100644 --- a/include/openPMD/auxiliary/Defer.hpp +++ b/include/openPMD/auxiliary/Defer.hpp @@ -21,19 +21,31 @@ struct defer_type std::move(functor)(); } - auto to_opaque() && -> defer_type> + explicit defer_type() = default; + + struct forwarding_tag + {}; + + template + defer_type(forwarding_tag, F_ &&functor_in) + : functor{std::forward(functor_in)} + {} + + template + defer_type(defer_type &&other) : functor{std::move(other.functor)} { - if (!do_run_this) - { - return defer_type>{{}, false}; - } - else - { - do_run_this = false; - return defer_type>{ - std::function{std::move(functor)}}; - } + other.do_run_this = false; + } + + template + auto operator=(defer_type &&other) + { + functor = std::move(other.functor); + other.do_run_this = false; } + + defer_type(defer_type const &) = delete; + auto operator=(defer_type const &) -> defer_type & = delete; }; using opaque_defer_type = defer_type>; @@ -41,6 +53,8 @@ using opaque_defer_type = defer_type>; template auto defer(F &&functor) -> defer_type> { - return defer_type>{std::forward(functor)}; + using res_t = defer_type>; + using tag_t = typename res_t::forwarding_tag; + return res_t{tag_t{}, std::forward(functor)}; } } // namespace openPMD::auxiliary diff --git a/src/IO/HDF5/HDF5IOHandler.cpp b/src/IO/HDF5/HDF5IOHandler.cpp index 9539c98708..d859ccc122 100644 --- a/src/IO/HDF5/HDF5IOHandler.cpp +++ b/src/IO/HDF5/HDF5IOHandler.cpp @@ -1950,16 +1950,15 @@ void HDF5IOHandlerImpl::writeDataset( memspace > 0, "[HDF5] Internal error: Failed to create memspace during dataset " "write"); - defer_close_memspace = - auxiliary::defer([&]() { - status = H5Sclose(memspace); // - if (status != 0) - { - std::cerr << "[HDF5] Internal error: Failed to close " - "dataset memory space during dataset write" - << std::endl; - } - }).to_opaque(); + defer_close_memspace = auxiliary::defer([&]() { + status = H5Sclose(memspace); // + if (status != 0) + { + std::cerr << "[HDF5] Internal error: Failed to close " + "dataset memory space during dataset write" + << std::endl; + } + }); } else { @@ -1973,16 +1972,15 @@ void HDF5IOHandlerImpl::writeDataset( block.push_back(static_cast(val)); memspace = H5Screate_simple( static_cast(block.size()), block.data(), nullptr); - defer_close_memspace = - auxiliary::defer([&]() { - status = H5Sclose(memspace); // - if (status != 0) - { - std::cerr << "[HDF5] Internal error: Failed to close " - "dataset memory space during dataset write" - << std::endl; - } - }).to_opaque(); + defer_close_memspace = auxiliary::defer([&]() { + status = H5Sclose(memspace); // + if (status != 0) + { + std::cerr << "[HDF5] Internal error: Failed to close " + "dataset memory space during dataset write" + << std::endl; + } + }); status = H5Sselect_hyperslab( filespace, H5S_SELECT_SET,