Skip to content

Commit 7aceab3

Browse files
Fix defer::to_opaque (#1872)
1 parent 2540d26 commit 7aceab3

2 files changed

Lines changed: 44 additions & 32 deletions

File tree

include/openPMD/auxiliary/Defer.hpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,26 +21,40 @@ struct defer_type
2121
std::move(functor)();
2222
}
2323

24-
auto to_opaque() && -> defer_type<std::function<void()>>
24+
explicit defer_type() = default;
25+
26+
struct forwarding_tag
27+
{};
28+
29+
template <typename F_>
30+
defer_type(forwarding_tag, F_ &&functor_in)
31+
: functor{std::forward<F_>(functor_in)}
32+
{}
33+
34+
template <typename F_>
35+
defer_type(defer_type<F_> &&other) : functor{std::move(other.functor)}
2536
{
26-
do_run_this = false;
27-
if (!do_run_this)
28-
{
29-
return defer_type<std::function<void()>>{{}, false};
30-
}
31-
else
32-
{
33-
return defer_type<std::function<void()>>{
34-
std::function<void()>{std::move(functor)}};
35-
}
37+
other.do_run_this = false;
38+
}
39+
40+
template <typename F_>
41+
auto operator=(defer_type<F_> &&other)
42+
{
43+
functor = std::move(other.functor);
44+
other.do_run_this = false;
3645
}
46+
47+
defer_type(defer_type const &) = delete;
48+
auto operator=(defer_type const &) -> defer_type & = delete;
3749
};
3850

3951
using opaque_defer_type = defer_type<std::function<void()>>;
4052

4153
template <typename F>
4254
auto defer(F &&functor) -> defer_type<std::remove_reference_t<F>>
4355
{
44-
return defer_type<std::remove_reference_t<F>>{std::forward<F>(functor)};
56+
using res_t = defer_type<std::remove_reference_t<F>>;
57+
using tag_t = typename res_t::forwarding_tag;
58+
return res_t{tag_t{}, std::forward<F>(functor)};
4559
}
4660
} // namespace openPMD::auxiliary

src/IO/HDF5/HDF5IOHandler.cpp

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1950,16 +1950,15 @@ void HDF5IOHandlerImpl::writeDataset(
19501950
memspace > 0,
19511951
"[HDF5] Internal error: Failed to create memspace during dataset "
19521952
"write");
1953-
defer_close_memspace =
1954-
auxiliary::defer([&]() {
1955-
status = H5Sclose(memspace); //
1956-
if (status != 0)
1957-
{
1958-
std::cerr << "[HDF5] Internal error: Failed to close "
1959-
"dataset memory space during dataset write"
1960-
<< std::endl;
1961-
}
1962-
}).to_opaque();
1953+
defer_close_memspace = auxiliary::defer([&]() {
1954+
status = H5Sclose(memspace); //
1955+
if (status != 0)
1956+
{
1957+
std::cerr << "[HDF5] Internal error: Failed to close "
1958+
"dataset memory space during dataset write"
1959+
<< std::endl;
1960+
}
1961+
});
19631962
}
19641963
else
19651964
{
@@ -1973,16 +1972,15 @@ void HDF5IOHandlerImpl::writeDataset(
19731972
block.push_back(static_cast<hsize_t>(val));
19741973
memspace = H5Screate_simple(
19751974
static_cast<int>(block.size()), block.data(), nullptr);
1976-
defer_close_memspace =
1977-
auxiliary::defer([&]() {
1978-
status = H5Sclose(memspace); //
1979-
if (status != 0)
1980-
{
1981-
std::cerr << "[HDF5] Internal error: Failed to close "
1982-
"dataset memory space during dataset write"
1983-
<< std::endl;
1984-
}
1985-
}).to_opaque();
1975+
defer_close_memspace = auxiliary::defer([&]() {
1976+
status = H5Sclose(memspace); //
1977+
if (status != 0)
1978+
{
1979+
std::cerr << "[HDF5] Internal error: Failed to close "
1980+
"dataset memory space during dataset write"
1981+
<< std::endl;
1982+
}
1983+
});
19861984
status = H5Sselect_hyperslab(
19871985
filespace,
19881986
H5S_SELECT_SET,

0 commit comments

Comments
 (0)