diff --git a/include/openPMD/auxiliary/Defer.hpp b/include/openPMD/auxiliary/Defer.hpp index a99bca1d37..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)} { - do_run_this = false; - if (!do_run_this) - { - return defer_type>{{}, false}; - } - else - { - 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,