Skip to content

Commit 73a6c69

Browse files
committed
Avoid object slicing when using records as scalar components
1 parent d53578e commit 73a6c69

File tree

8 files changed

+59
-0
lines changed

8 files changed

+59
-0
lines changed

include/openPMD/RecordComponent.hpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ namespace internal
109109
class BaseRecordData;
110110
} // namespace internal
111111

112+
template <typename>
113+
class BaseRecord;
114+
112115
class RecordComponent : public BaseRecordComponent
113116
{
114117
template <typename T, typename T_key, typename T_container>
@@ -134,6 +137,15 @@ class RecordComponent : public BaseRecordComponent
134137
AUTO
135138
}; // Allocation
136139

140+
/**
141+
* @brief Avoid object slicing when using a Record as a scalar Record
142+
* Component.
143+
*
144+
* It's still preferred to directly use the Record, or alternatively a
145+
* Record-Component-type reference to a Record.
146+
*/
147+
RecordComponent(BaseRecord<RecordComponent> const &);
148+
137149
RecordComponent &setUnitSI(double);
138150

139151
/**

include/openPMD/backend/BaseRecord.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,11 @@ class BaseRecord
212212
: public Container<T_elem>
213213
, public T_elem // T_RecordComponent
214214
{
215+
public:
215216
using T_RecordComponent = T_elem;
216217
using T_Container = Container<T_elem>;
218+
219+
private:
217220
using T_Self = BaseRecord<T_elem>;
218221
friend class Iteration;
219222
friend class ParticleSpecies;

include/openPMD/backend/BaseRecordComponent.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,9 @@ namespace internal
7474
};
7575
} // namespace internal
7676

77+
template <typename>
78+
class BaseRecord;
79+
7780
class BaseRecordComponent : virtual public Attributable
7881
{
7982
template <typename T, typename T_key, typename T_container>

include/openPMD/backend/MeshRecordComponent.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ class MeshRecordComponent : public RecordComponent
5252
public:
5353
~MeshRecordComponent() override = default;
5454

55+
/**
56+
* @brief Avoid object slicing when using a Record as a scalar Record
57+
* Component.
58+
*
59+
* It's still preferred to directly use the Record, or alternatively a
60+
* Record-Component-type reference to a Record.
61+
*/
62+
MeshRecordComponent(BaseRecord<MeshRecordComponent> const &);
63+
5564
/** Position on an element
5665
*
5766
* Relative on an element (node/cell/voxel) of the mesh

include/openPMD/backend/PatchRecordComponent.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,15 @@ class PatchRecordComponent : public BaseRecordComponent
8484
friend class internal::PatchRecordComponentData;
8585

8686
public:
87+
/**
88+
* @brief Avoid object slicing when using a Record as a scalar Record
89+
* Component.
90+
*
91+
* It's still preferred to directly use the Record, or alternatively a
92+
* Record-Component-type reference to a Record.
93+
*/
94+
PatchRecordComponent(BaseRecord<PatchRecordComponent> const &);
95+
8796
PatchRecordComponent &setUnitSI(double);
8897

8998
virtual PatchRecordComponent &resetDataset(Dataset);

src/RecordComponent.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include "openPMD/IO/Format.hpp"
2626
#include "openPMD/Series.hpp"
2727
#include "openPMD/auxiliary/Memory.hpp"
28+
#include "openPMD/backend/BaseRecord.hpp"
2829

2930
#include <algorithm>
3031
#include <climits>
@@ -48,6 +49,12 @@ RecordComponent::RecordComponent() : BaseRecordComponent(NoInit())
4849
RecordComponent::RecordComponent(NoInit) : BaseRecordComponent(NoInit())
4950
{}
5051

52+
RecordComponent::RecordComponent(BaseRecord<RecordComponent> const &baseRecord)
53+
: BaseRecordComponent(NoInit())
54+
{
55+
setData(baseRecord.m_recordComponentData);
56+
}
57+
5158
// We need to instantiate this somewhere otherwise there might be linker issues
5259
// despite this thing actually being constepxr
5360
constexpr char const *const RecordComponent::SCALAR;

src/backend/MeshRecordComponent.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
* If not, see <http://www.gnu.org/licenses/>.
2020
*/
2121
#include "openPMD/backend/MeshRecordComponent.hpp"
22+
#include "openPMD/backend/BaseRecord.hpp"
2223

2324
namespace openPMD
2425
{
@@ -28,6 +29,13 @@ MeshRecordComponent::MeshRecordComponent() : RecordComponent()
2829
MeshRecordComponent::MeshRecordComponent(NoInit) : RecordComponent(NoInit())
2930
{}
3031

32+
MeshRecordComponent::MeshRecordComponent(
33+
BaseRecord<MeshRecordComponent> const &baseRecord)
34+
: RecordComponent(NoInit())
35+
{
36+
setData(baseRecord.m_recordComponentData);
37+
}
38+
3139
void MeshRecordComponent::read()
3240
{
3341
using DT = Datatype;

src/backend/PatchRecordComponent.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
*/
2121
#include "openPMD/backend/PatchRecordComponent.hpp"
2222
#include "openPMD/auxiliary/Memory.hpp"
23+
#include "openPMD/backend/BaseRecord.hpp"
2324

2425
#include <algorithm>
2526

@@ -74,6 +75,13 @@ Extent PatchRecordComponent::getExtent() const
7475
}
7576
}
7677

78+
PatchRecordComponent::PatchRecordComponent(
79+
BaseRecord<PatchRecordComponent> const &baseRecord)
80+
: BaseRecordComponent(NoInit())
81+
{
82+
setData(baseRecord.m_patchRecordComponentData);
83+
}
84+
7785
PatchRecordComponent::PatchRecordComponent() : BaseRecordComponent(NoInit())
7886
{
7987
setData(std::make_shared<Data_t>());

0 commit comments

Comments
 (0)