Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RFieldSequenceContainer.hxx
Go to the documentation of this file.
1/// \file ROOT/RField/SequenceContainer.hxx
2/// \author Jakob Blomer <jblomer@cern.ch>
3/// \date 2018-10-09
4
5/*************************************************************************
6 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13#ifndef ROOT_RField_SequenceContainer
14#define ROOT_RField_SequenceContainer
15
16#ifndef ROOT_RField
17#error "Please include RField.hxx!"
18#endif
19
20#include <ROOT/RFieldBase.hxx>
21#include <ROOT/RNTupleTypes.hxx>
22#include <ROOT/RVec.hxx>
23
24#include <array>
25#include <memory>
26#include <vector>
27
28namespace ROOT {
29
30class RSoAField;
31
32namespace Detail {
33class RFieldVisitor;
34} // namespace Detail
35
36namespace Internal {
37std::unique_ptr<RFieldBase> CreateEmulatedVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField,
38 const RFieldDescriptor &emulatedFrom);
39}
40
41////////////////////////////////////////////////////////////////////////////////
42/// Template specializations for C++ std::array and C-style arrays
43////////////////////////////////////////////////////////////////////////////////
44
45/// The generic field for fixed size arrays, which do not need an offset column
46class RArrayField : public RFieldBase {
47private:
48 class RArrayDeleter : public RDeleter {
49 private:
50 std::size_t fItemSize = 0;
51 std::size_t fArrayLength = 0;
52 std::unique_ptr<RDeleter> fItemDeleter;
53
54 public:
55 RArrayDeleter(std::size_t itemSize, std::size_t arrayLength, std::size_t alignment,
56 std::unique_ptr<RDeleter> itemDeleter)
57 : RDeleter(alignment), fItemSize(itemSize), fArrayLength(arrayLength), fItemDeleter(std::move(itemDeleter))
58 {
59 }
60 void operator()(void *objPtr, bool dtorOnly) final;
61 };
62
63 std::size_t fItemSize;
64 std::size_t fArrayLength;
65
66protected:
67 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
68
69 void ConstructValue(void *where) const final;
70 std::unique_ptr<RDeleter> GetDeleter() const final;
71
72 std::size_t AppendImpl(const void *from) final;
73 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
74 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
75 std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final;
76
77 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
78
79public:
80 RArrayField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField, std::size_t arrayLength);
81 RArrayField(RArrayField &&other) = default;
82 RArrayField &operator=(RArrayField &&other) = default;
83 ~RArrayField() override = default;
84
85 std::vector<RValue> SplitValue(const RValue &value) const final;
86 size_t GetLength() const { return fArrayLength; }
87 size_t GetValueSize() const final { return fItemSize * fArrayLength; }
88 size_t GetAlignment() const final { return fSubfields[0]->GetAlignment(); }
89 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
90};
91
92template <typename ItemT, std::size_t N>
93class RField<std::array<ItemT, N>> : public RArrayField {
94public:
95 static std::string TypeName() { return "std::array<" + RField<ItemT>::TypeName() + "," + std::to_string(N) + ">"; }
96 explicit RField(std::string_view name) : RArrayField(name, std::make_unique<RField<ItemT>>("_0"), N) {}
97 RField(RField &&other) = default;
98 RField &operator=(RField &&other) = default;
99 ~RField() override = default;
100};
101
102template <typename ItemT, std::size_t N>
103class RField<ItemT[N]> final : public RField<std::array<ItemT, N>> {
104public:
105 explicit RField(std::string_view name) : RField<std::array<ItemT, N>>(name) {}
106 RField(RField &&other) = default;
107 RField &operator=(RField &&other) = default;
108 ~RField() final = default;
109};
110
111////////////////////////////////////////////////////////////////////////////////
112/// Template specializations for ROOT's RVec
113////////////////////////////////////////////////////////////////////////////////
114
115/// The type-erased field for a RVec<Type>
116class RRVecField : public RFieldBase {
117 friend class RArrayAsRVecField; // to use the RRVecDeleter and to call ResizeRVec()
118 friend class ROOT::RSoAField; // to call ResizeRVec()
119
120 // Ensures that the RVec pointed to by rvec has at least nItems valid elements
121 // Returns the possibly new "begin pointer" of the RVec, i.e. the pointer to the data area.
122 static unsigned char *
123 ResizeRVec(void *rvec, std::size_t nItems, std::size_t itemSize, const RFieldBase *itemField, RDeleter *itemDeleter);
124
125 class RRVecDeleter : public RDeleter {
126 private:
127 std::size_t fItemAlignment;
128 std::size_t fItemSize = 0;
129 std::unique_ptr<RDeleter> fItemDeleter;
130
131 public:
132 explicit RRVecDeleter(std::size_t itemAlignment)
133 : RDeleter(ROOT::Internal::EvalRVecAlignment(itemAlignment)), fItemAlignment(itemAlignment)
134 {
135 }
136 RRVecDeleter(std::size_t itemAlignment, std::size_t itemSize, std::unique_ptr<RDeleter> itemDeleter)
137 : RDeleter(ROOT::Internal::EvalRVecAlignment(itemAlignment)),
138 fItemAlignment(itemAlignment),
139 fItemSize(itemSize),
140 fItemDeleter(std::move(itemDeleter))
141 {
142 }
143 void operator()(void *objPtr, bool dtorOnly) final;
144 };
145
146 std::unique_ptr<RDeleter> fItemDeleter;
147
148protected:
149 std::size_t fItemSize;
151 std::size_t fValueSize;
152
153 // For bulk read optimzation
154 std::size_t fBulkNRepetition = 1;
155 /// May be a direct PoD subfield or a sub-subfield of a fixed-size array of PoD
156 RFieldBase *fBulkSubfield = nullptr;
157
158 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
160 void GenerateColumns() final;
161 void GenerateColumns(const ROOT::RNTupleDescriptor &desc) final;
162
163 void ConstructValue(void *where) const final;
164 std::unique_ptr<RDeleter> GetDeleter() const final;
165
166 std::size_t AppendImpl(const void *from) final;
167 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
168 std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final;
169
170 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final;
171 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
172
173 void CommitClusterImpl() final { fNWritten = 0; }
174
175public:
176 RRVecField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField);
177 RRVecField(RRVecField &&) = default;
179 RRVecField(const RRVecField &) = delete;
181 ~RRVecField() override = default;
182
183 std::vector<RValue> SplitValue(const RValue &value) const final;
184 size_t GetValueSize() const final;
185 size_t GetAlignment() const final;
186 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
187};
188
189template <typename ItemT>
190class RField<ROOT::VecOps::RVec<ItemT>> final : public RRVecField {
191public:
192 RField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField)
193 : RRVecField(fieldName, std::move(itemField))
194 {
195 }
196
197 explicit RField(std::string_view name) : RField(name, std::make_unique<RField<ItemT>>("_0")) {}
198 RField(RField &&other) = default;
199 RField &operator=(RField &&other) = default;
200 ~RField() final = default;
201
202 static std::string TypeName() { return "ROOT::VecOps::RVec<" + RField<ItemT>::TypeName() + ">"; }
203};
204
205////////////////////////////////////////////////////////////////////////////////
206/// Template specializations for C++ std::vector
207////////////////////////////////////////////////////////////////////////////////
208
209/// The generic field for a (nested) `std::vector<Type>` except for `std::vector<bool>`
210/// The field can be constructed as untyped collection through CreateUntyped().
211class RVectorField : public RFieldBase {
212 friend class RArrayAsVectorField; // to get access to the RVectorDeleter
213 friend std::unique_ptr<RFieldBase> Internal::CreateEmulatedVectorField(std::string_view fieldName,
214 std::unique_ptr<RFieldBase> itemField,
215 const RFieldDescriptor &emulatedFrom);
216
217 class RVectorDeleter : public RDeleter {
218 private:
219 std::size_t fItemSize = 0;
220 std::size_t fItemAlignment = 0;
221 std::unique_ptr<RDeleter> fItemDeleter;
222
223 public:
224 explicit RVectorDeleter(std::size_t itemAlignment);
225 RVectorDeleter(std::size_t itemSize, std::size_t itemAlignment, std::unique_ptr<RDeleter> itemDeleter);
226 void operator()(void *objPtr, bool dtorOnly) final;
227 };
228
229 std::size_t fItemSize;
231 std::unique_ptr<RDeleter> fItemDeleter;
232 // These are only valid if the record field is emulated (i.e. (fTraits & kTraitEmulatedField) != 0).
233 std::uint32_t fEmulatedTypeVersion = 0;
234 std::uint32_t fEmulatedTypeChecksum = 0;
235
236 // Ensures that the std::vector pointed to by vec has at least nItems valid elements.
237 static void ResizeVector(void *vec, std::size_t nItems, std::size_t itemSize, const RFieldBase &itemField,
238 RDeleter *itemDeleter);
239
240protected:
241 /// Creates a possibly-untyped VectorField.
242 /// If `emulatedFrom` is not null, the field is untyped. If emulatedFrom->GetTypeName() is empty, it is a "regular"
243 /// untyped vector field; otherwise, it was created as an emulated field from the given type name.
244 RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField,
245 const ROOT::RFieldDescriptor *emulatedFrom);
246
247 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
248
249 const RColumnRepresentations &GetColumnRepresentations() const final;
250 void GenerateColumns() final;
251 void GenerateColumns(const ROOT::RNTupleDescriptor &desc) final;
252
253 void ConstructValue(void *where) const final;
254 std::unique_ptr<RDeleter> GetDeleter() const final;
255
256 std::size_t AppendImpl(const void *from) final;
257 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
258
259 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final;
260 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
261
262 void CommitClusterImpl() final { fNWritten = 0; }
263
264public:
265 /// Maximum alignment of the vector's value type
266 static constexpr std::size_t kMaxItemAlignment = 4096;
267
268 RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField);
269 RVectorField(RVectorField &&other) = default;
271 ~RVectorField() override = default;
272
273 static std::unique_ptr<RVectorField>
274 CreateUntyped(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField);
275
276 std::vector<RValue> SplitValue(const RValue &value) const final;
277 std::size_t GetValueSize() const final;
278 std::size_t GetAlignment() const final;
279 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
280};
281
282template <typename ItemT>
283class RField<std::vector<ItemT>> final : public RVectorField {
284public:
285 static std::string TypeName() { return "std::vector<" + RField<ItemT>::TypeName() + ">"; }
286 explicit RField(std::string_view name) : RVectorField(name, std::make_unique<RField<ItemT>>("_0")) {}
287 RField(RField &&other) = default;
288 RField &operator=(RField &&other) = default;
289 ~RField() final = default;
290};
291
292// `std::vector<bool>` is a template specialization and needs special treatment
293template <>
294class RField<std::vector<bool>> final : public RFieldBase {
295private:
296 ROOT::Internal::RColumnIndex fNWritten{0};
297 /// If schema-evolved from an std::array, fOnDiskNRepetition is > 0 and there will be no
298 /// principal column.
299 std::size_t fOnDiskNRepetitions = 0;
300
301protected:
302 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final
303 {
304 return std::make_unique<RField>(newName);
305 }
306
307 const RColumnRepresentations &GetColumnRepresentations() const final;
308 void GenerateColumns() final;
309 void GenerateColumns(const ROOT::RNTupleDescriptor &desc) final;
310
311 void ConstructValue(void *where) const final { new (where) std::vector<bool>(); }
312 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RTypedDeleter<std::vector<bool>>>(); }
313
314 std::size_t AppendImpl(const void *from) final;
315 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
316 void ReadInClusterImpl(ROOT::RNTupleLocalIndex localIndex, void *to) final;
317
318 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
319
320 void CommitClusterImpl() final { fNWritten = 0; }
321
322public:
323 static std::string TypeName() { return "std::vector<bool>"; }
324 explicit RField(std::string_view name);
325 RField(RField &&other) = default;
326 RField &operator=(RField &&other) = default;
327 ~RField() final = default;
328
329 std::vector<RValue> SplitValue(const RValue &value) const final;
330
331 std::size_t GetValueSize() const final { return sizeof(std::vector<bool>); }
332 std::size_t GetAlignment() const final { return alignof(std::vector<bool>); }
333 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
334};
335
336////////////////////////////////////////////////////////////////////////////////
337/// Additional classes related to sequence containers
338////////////////////////////////////////////////////////////////////////////////
339
340/**
341\class ROOT::RArrayAsRVecField
342\brief A field for fixed-size arrays that are represented as RVecs in memory.
343\ingroup NTuple
344This class is used only for reading. In particular, it helps exposing
345arbitrarily-nested `std::array` on-disk fields as RVecs for usage in RDataFrame.
346*/
347class RArrayAsRVecField final : public RFieldBase {
348private:
349 std::unique_ptr<RDeleter> fItemDeleter; /// Sub field deleter or nullptr for simple fields
350 std::size_t fItemSize; /// The size of a child field's item
351 std::size_t fArrayLength; /// The length of the arrays in this field
352 std::size_t fValueSize; /// The size of a value of this field, i.e. an RVec
353
354protected:
355 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
356
357 void GenerateColumns() final { throw RException(R__FAIL("RArrayAsRVec fields must only be used for reading")); }
358 using RFieldBase::GenerateColumns;
359
360 void ConstructValue(void *where) const final;
361 /// Returns an RRVecField::RRVecDeleter
362 std::unique_ptr<RDeleter> GetDeleter() const final;
363
364 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
365 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
366
367 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
368
369public:
370 /**
371 Constructor of the field. The `itemField` argument represents the inner
372 item of the on-disk array, i.e. for an `std::array<float>` it is the `float`
373 field and not the `std::array` itself.
374 */
375 RArrayAsRVecField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField, std::size_t arrayLength);
376 RArrayAsRVecField(const RArrayAsRVecField &other) = delete;
377 RArrayAsRVecField &operator=(const RArrayAsRVecField &other) = delete;
379 RArrayAsRVecField &operator=(RArrayAsRVecField &&other) = default;
380 ~RArrayAsRVecField() final = default;
381
382 std::size_t GetValueSize() const final { return fValueSize; }
383 std::size_t GetAlignment() const final;
384
385 std::vector<RFieldBase::RValue> SplitValue(const RFieldBase::RValue &value) const final;
386 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
387};
388
389/**
390\class ROOT::RArrayAsVectorField
391\brief A field for fixed-size arrays that are represented as std::vector in memory.
392\ingroup NTuple
393This class is used only for reading. In particular, it helps for schema evolution of fixed-size arrays into vectors.
394*/
395class RArrayAsVectorField final : public RFieldBase {
396private:
397 std::unique_ptr<RDeleter> fItemDeleter; /// Sub field deleter or nullptr for simple fields
398 std::size_t fItemSize; /// The size of a child field's item
399 std::size_t fArrayLength; /// The length of the arrays in this field
400
401protected:
402 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
403
404 void GenerateColumns() final;
405 using RFieldBase::GenerateColumns;
406
407 void ConstructValue(void *where) const final;
408 /// Returns an RVectorField::RVectorDeleter
409 std::unique_ptr<RDeleter> GetDeleter() const final;
410
411 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
412 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
413
414 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
415
416public:
417 /// The `itemField` argument represents the inner item of the on-disk array,
418 /// i.e. for an `std::array<float>` it is the `float`
419 RArrayAsVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField, std::size_t arrayLength);
421 RArrayAsVectorField &operator=(const RArrayAsVectorField &other) = delete;
423 RArrayAsVectorField &operator=(RArrayAsVectorField &&other) = default;
424 ~RArrayAsVectorField() final = default;
425
426 std::size_t GetValueSize() const final;
427 std::size_t GetAlignment() const final;
428
429 std::vector<RFieldBase::RValue> SplitValue(const RFieldBase::RValue &value) const final;
430 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
431};
432
433} // namespace ROOT
434
435#endif
size_t fValueSize
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
Definition RError.hxx:322
#define N
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char name[80]
Definition TGX11.cxx:142
TCanvas * alignment()
Definition alignment.C:1
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
Abstract interface to read data from an ntuple.
Additional classes related to sequence containers.
std::unique_ptr< RDeleter > fItemDeleter
std::size_t fArrayLength
The size of a child field's item.
std::size_t fItemSize
Sub field deleter or nullptr for simple fields.
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
std::size_t fValueSize
The length of the arrays in this field.
A field for fixed-size arrays that are represented as std::vector in memory.
std::unique_ptr< RDeleter > fItemDeleter
std::size_t fArrayLength
The size of a child field's item.
std::size_t fItemSize
Sub field deleter or nullptr for simple fields.
std::unique_ptr< RDeleter > fItemDeleter
void operator()(void *objPtr, bool dtorOnly) final
RArrayDeleter(std::size_t itemSize, std::size_t arrayLength, std::size_t alignment, std::unique_ptr< RDeleter > itemDeleter)
Template specializations for C++ std::array and C-style arrays.
std::unique_ptr< RDeleter > GetDeleter() const final
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
size_t GetValueSize() const final
What sizeof(T) for this type returns.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
size_t GetAlignment() const final
What alignof(T) for this type returns.
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::unique_ptr< RFieldBase > BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final
Called by ConnectPageSource() before connecting; derived classes may override this as appropriate,...
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::size_t GetAlignment() const final
What alignof(T) for this type returns.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::size_t GetValueSize() const final
What sizeof(T) for this type returns.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.hxx:216
Base class for all ROOT issued exceptions.
Definition RError.hxx:78
The list of column representations a field can have.
A functor to release the memory acquired by CreateValue() (memory and constructor).
Points to an object with RNTuple I/O support and keeps a pointer to the corresponding field.
A field translates read and write calls from/to underlying columns to/from tree values.
std::vector< std::unique_ptr< RFieldBase > > fSubfields
Collections and classes own subfields.
virtual const RColumnRepresentations & GetColumnRepresentations() const
Implementations in derived classes should return a static RColumnRepresentations object.
virtual void GenerateColumns()
Implementations in derived classes should create the backing columns corresponding to the field type ...
virtual void CommitClusterImpl()
virtual std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec)
General implementation of bulk read.
Metadata stored for every field of an RNTuple.
RField(RField &&other)=default
~RField() final=default
RField & operator=(RField &&other)=default
RField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
RField & operator=(RField &&other)=default
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:342
~RField() final=default
RField & operator=(RField &&other)=default
static std::string TypeName()
Definition RField.hxx:344
RField(std::string_view name)
Definition RField.hxx:345
The on-storage metadata of an RNTuple.
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
RRVecDeleter(std::size_t itemAlignment, std::size_t itemSize, std::unique_ptr< RDeleter > itemDeleter)
std::unique_ptr< RDeleter > fItemDeleter
RRVecDeleter(std::size_t itemAlignment)
Template specializations for ROOT's RVec.
RRVecField & operator=(RRVecField &&)=default
~RRVecField() override=default
RRVecField(const RRVecField &)=delete
ROOT::Internal::RColumnIndex fNWritten
std::unique_ptr< RDeleter > fItemDeleter
RRVecField(RRVecField &&)=default
RRVecField & operator=(RRVecField &)=delete
The SoA field provides I/O for an in-memory SoA layout linked to an on-disk collection of the underly...
Definition RFieldSoA.hxx:54
Template specializations for C++ std::vector.
RVectorField(RVectorField &&other)=default
~RVectorField() override=default
std::unique_ptr< RDeleter > fItemDeleter
ROOT::Internal::RColumnIndex fNWritten
RVectorField & operator=(RVectorField &&other)=default
A "std::vector"-like collection of values implementing handy operation to analyse them.
Definition RVec.hxx:1509
std::unique_ptr< RFieldBase > CreateEmulatedVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, const RFieldDescriptor &emulatedFrom)
Definition RField.cxx:598
std::size_t EvalRVecAlignment(std::size_t alignOfSubfield)
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().