openPMD-api
HierarchyVisitorImpl.hpp
1 #pragma once
2 
3 #include "openPMD/backend/HierarchyVisitor.hpp"
4 
5 #include "openPMD/Iteration.hpp"
6 #include "openPMD/ParticleSpecies.hpp"
7 #include "openPMD/Series.hpp"
8 #include <type_traits>
9 
10 namespace openPMD
11 {
12 template <typename Lambda>
14 {
15  Lambda lambda;
16 
17  template <typename Arg>
18  HierarchyVisitorFromLambda(uint8_t /* constructor_tag */, Arg &&arg)
19  : lambda(std::forward<Arg>(arg))
20  {}
21 
22  template <typename Lambda_in>
23  friend auto makeHierarchyVisitorFromLambda(Lambda_in &&lambda);
24 
25 public:
26  void operator()(Iteration &obj) override
27  {
28  lambda(obj);
29  }
30  void operator()(Iterations &obj) override
31  {
32  lambda(obj);
33  }
34  void operator()(Mesh &obj) override
35  {
36  lambda(obj);
37  }
38  void operator()(MeshRecordComponent &obj) override
39  {
40  lambda(obj);
41  }
42  void operator()(Meshes &obj) override
43  {
44  lambda(obj);
45  }
46  void operator()(ParticlePatches &obj) override
47  {
48  lambda(obj);
49  }
50  void operator()(PatchRecord &obj) override
51  {
52  lambda(obj);
53  }
54  void operator()(ParticleSpecies &obj) override
55  {
56  lambda(obj);
57  }
58  void operator()(Particles &obj) override
59  {
60  lambda(obj);
61  }
62  void operator()(PatchRecordComponent &obj) override
63  {
64  lambda(obj);
65  }
66  void operator()(Record &obj) override
67  {
68  lambda(obj);
69  }
70  void operator()(RecordComponent &obj) override
71  {
72  lambda(obj);
73  }
74  void operator()(Series &obj) override
75  {
76  lambda(obj);
77  }
78 };
79 
80 template <typename Lambda>
81 auto makeHierarchyVisitorFromLambda(Lambda &&lambda)
82 {
84  return res_t{0, std::forward<Lambda>(lambda)};
85 }
86 
87 template <typename Lambda>
88 void Attributable::visitHierarchyFromLambda(Lambda &&lambda, bool recursive)
89 {
90  auto visitor = makeHierarchyVisitorFromLambda(std::forward<Lambda>(lambda));
91  this->visitHierarchy(visitor, recursive);
92 }
93 } // namespace openPMD
void visitHierarchyFromLambda(Lambda &&lambda, bool recursive)
Visitor pattern for the openPMD object hierarchy in postfix traversal, lambda version.
Definition: HierarchyVisitorImpl.hpp:88
virtual void visitHierarchy(HierarchyVisitor &visitor, bool recursive)
Visitor pattern for the openPMD object hierarchy in postfix traversal.
Definition: Attributable.cpp:300
Definition: HierarchyVisitorImpl.hpp:14
Definition: HierarchyVisitor.hpp:20
Logical compilation of data from one snapshot (e.g.
Definition: Iteration.hpp:172
Definition: Iteration.hpp:543
Container for N-dimensional, homogeneous Records.
Definition: Mesh.hpp:44
Definition: MeshRecordComponent.hpp:38
Definition: Iteration.hpp:152
Definition: ParticlePatches.hpp:32
Definition: ParticleSpecies.hpp:39
Definition: Iteration.hpp:158
Definition: PatchRecordComponent.hpp:47
Definition: PatchRecord.hpp:32
Definition: RecordComponent.hpp:118
Definition: Record.hpp:34
Implementation for the root level of the openPMD hierarchy.
Definition: Series.hpp:288
Public definitions of openPMD-api.
Definition: Date.cpp:29