Skip to content

Commit 14740bf

Browse files
committed
Implement lambda visitor in terms of explicit visitor
1 parent 48d4465 commit 14740bf

3 files changed

Lines changed: 113 additions & 31 deletions

File tree

include/openPMD/backend/Attributable.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,10 @@ class Attributable
404404

405405
virtual void visitHierarchy(HierarchyVisitor &);
406406

407+
// definition inside include/openPMD/backend/HierarchyVisitorImpl.hpp
408+
template <typename Lambda>
409+
void visitHierarchyFromLambda(Lambda &&lambda);
410+
407411
[[nodiscard]] OpenpmdStandard openPMDStandard() const;
408412

409413
// clang-format off

include/openPMD/backend/HierarchyVisitorImpl.hpp

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,81 @@
55
#include "openPMD/Iteration.hpp"
66
#include "openPMD/ParticleSpecies.hpp"
77
#include "openPMD/Series.hpp"
8+
#include <type_traits>
9+
10+
namespace openPMD
11+
{
12+
template <typename Lambda>
13+
class HierarchyVisitorFromLambda : public HierarchyVisitor
14+
{
15+
Lambda lambda;
16+
17+
public:
18+
template <typename Arg>
19+
HierarchyVisitorFromLambda(uint8_t /* constructor_tag */, Arg &&arg)
20+
: lambda(std::forward<Arg>(arg))
21+
{}
22+
void operator()(Iteration &obj) override
23+
{
24+
lambda(obj);
25+
}
26+
void operator()(Iterations &obj) override
27+
{
28+
lambda(obj);
29+
}
30+
void operator()(Mesh &obj) override
31+
{
32+
lambda(obj);
33+
}
34+
void operator()(MeshRecordComponent &obj) override
35+
{
36+
lambda(obj);
37+
}
38+
void operator()(Meshes &obj) override
39+
{
40+
lambda(obj);
41+
}
42+
void operator()(ParticlePatches &obj) override
43+
{
44+
lambda(obj);
45+
}
46+
void operator()(ParticleSpecies &obj) override
47+
{
48+
lambda(obj);
49+
}
50+
void operator()(Particles &obj) override
51+
{
52+
lambda(obj);
53+
}
54+
void operator()(PatchRecordComponent &obj) override
55+
{
56+
lambda(obj);
57+
}
58+
void operator()(Record &obj) override
59+
{
60+
lambda(obj);
61+
}
62+
void operator()(RecordComponent &obj) override
63+
{
64+
lambda(obj);
65+
}
66+
void operator()(Series &obj) override
67+
{
68+
lambda(obj);
69+
}
70+
};
71+
72+
template <typename Lambda>
73+
auto makeHierarchyVisitorFromLambda(Lambda &&lambda)
74+
{
75+
using res_t = HierarchyVisitorFromLambda<std::remove_reference_t<Lambda>>;
76+
return res_t{0, std::forward<Lambda>(lambda)};
77+
}
78+
79+
template <typename Lambda>
80+
void Attributable::visitHierarchyFromLambda(Lambda &&lambda)
81+
{
82+
auto visitor = makeHierarchyVisitorFromLambda(std::forward<Lambda>(lambda));
83+
this->visitHierarchy(visitor);
84+
}
85+
} // namespace openPMD

src/Iteration.cpp

Lines changed: 31 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "openPMD/auxiliary/Variant.hpp"
3535
#include "openPMD/backend/Attributable.hpp"
3636
#include "openPMD/backend/BaseRecordComponent.hpp"
37+
#include "openPMD/backend/HierarchyVisitorImpl.hpp"
3738
#include "openPMD/backend/Variant_internal.hpp"
3839
#include "openPMD/backend/Writable.hpp"
3940
#include "openPMD/backend/scientific_defaults/ConfigAttribute.hpp"
@@ -247,37 +248,36 @@ bool Iteration::closedByWriter() const
247248
void Iteration::populateDefaultMetadata()
248249
{
249250
auto standard = IOHandler()->m_standard;
250-
// visitHierarchy([standard](auto &component) {
251-
// using ComponentType = std::remove_reference_t<decltype(component)>;
252-
// if constexpr (auxiliary::IsTemplateBaseOf_v<BaseRecord,
253-
// ComponentType>)
254-
// {
255-
// if (component.empty() && !component.datasetDefined())
256-
// {
257-
// std::cerr
258-
// << "Cannot flush Record without any contained components:
259-
// '"
260-
// << component.myPath().openPMDPath() << "'. Will ignore.";
261-
// if (component.written())
262-
// {
263-
// std::cerr
264-
// << "\n(Note: The Record seems to have been written "
265-
// "previously?)";
266-
// }
267-
// std::cerr << std::endl;
268-
// return;
269-
// }
270-
// }
271-
272-
// if constexpr (
273-
// !std::is_same_v<ComponentType, Container<Mesh>> &&
274-
// !std::is_same_v<ComponentType, Container<Record>> &&
275-
// !std::is_same_v<ComponentType, Container<PatchRecord>> &&
276-
// !std::is_same_v<ComponentType, Container<ParticleSpecies>>)
277-
// {
278-
// component.writeDefaults(standard);
279-
// }
280-
// });
251+
visitHierarchyFromLambda([standard](auto &component) {
252+
using ComponentType = std::remove_reference_t<decltype(component)>;
253+
if constexpr (auxiliary::IsTemplateBaseOf_v<BaseRecord, ComponentType>)
254+
{
255+
if (component.empty() && !component.datasetDefined())
256+
{
257+
std::cerr
258+
<< "Cannot flush Record without any contained components:'"
259+
<< component.myPath().openPMDPath() << "'. Will ignore.";
260+
if (component.written())
261+
{
262+
std::cerr
263+
<< "\n(Note: The Record seems to have been written "
264+
"previously?)";
265+
}
266+
std::cerr << std::endl;
267+
return;
268+
}
269+
}
270+
271+
if constexpr (
272+
!std::is_same_v<ComponentType, Iterations> &&
273+
!std::is_same_v<ComponentType, Meshes> &&
274+
!std::is_same_v<ComponentType, ParticlePatches> &&
275+
!std::is_same_v<ComponentType, Particles> &&
276+
!std::is_same_v<ComponentType, Series>)
277+
{
278+
component.writeDefaults(standard);
279+
}
280+
});
281281
}
282282

283283
void Iteration::flushFileBased(

0 commit comments

Comments
 (0)