13#ifndef ROOT_RField_STLMisc
14#define ROOT_RField_STLMisc
17#error "Please include RField.hxx!"
66template <
typename ItemT>
67class RField<std::atomic<ItemT>>
final :
public RAtomicField {
92 return std::make_unique<RBitsetField>(
newName, fN);
98 std::size_t
AppendImpl(
const void *from)
final;
105 const size_t wordSize = (fN <=
sizeof(
unsigned long) * 8) ?
sizeof(
unsigned long) :
sizeof(
unsigned long long);
107 const size_t wordSize =
sizeof(
unsigned long);
130 return WordSize() ==
sizeof(
unsigned long) ?
alignof(
unsigned long) :
alignof(
unsigned long long);
132 return alignof(
unsigned long);
139 std::size_t
GetN()
const {
return fN; }
142template <std::
size_t N>
143class RField<std::bitset<N>>
final :
public RBitsetField {
145 static std::string
TypeName() {
return "std::bitset<" + std::to_string(
N) +
">"; }
163 return std::make_unique<RField>(
newName);
192 bool fIsEvolvedFromInnerType =
false;
198 std::
size_t AppendNull();
199 std::
size_t AppendValue(
const void *from);
225 std::size_t fEngagementPtrOffset = 0;
239 const bool *GetEngagementPtr(
const void *
optionalPtr)
const;
245 std::unique_ptr<RFieldBase> CloneImpl(std::string_view
newName)
const final;
247 void ConstructValue(
void *
where)
const final;
248 std::unique_ptr<RDeleter> GetDeleter()
const final;
250 std::
size_t AppendImpl(
const void *from)
final;
291 const std::type_info *fPolymorphicTypeInfo =
nullptr;
297 std::unique_ptr<RFieldBase> CloneImpl(std::string_view
newName)
const final;
300 std::unique_ptr<RDeleter> GetDeleter()
const final;
302 std::
size_t AppendImpl(
const void *from)
final;
313 std::
size_t GetValueSize()
const final {
return sizeof(std::unique_ptr<char>); }
317template <
typename ItemT>
318class RField<std::unique_ptr<ItemT>>
final :
public RUniquePtrField {
320 static std::string TypeName() {
return "std::unique_ptr<" + RField<ItemT>::TypeName() +
">"; }
321 explicit RField(std::string_view
name) : RUniquePtrField(
name, std::make_unique<RField<
ItemT>>(
"_0")) {}
322 RField(RField &&
other) =
default;
323 RField &operator=(RField &&
other) =
default;
336 std::unique_ptr<RFieldBase> CloneImpl(std::string_view
newName)
const final
338 return std::make_unique<RField>(
newName);
341 const RColumnRepresentations &GetColumnRepresentations()
const final;
342 void GenerateColumns()
final;
346 std::unique_ptr<RDeleter> GetDeleter()
const final {
return std::make_unique<RTypedDeleter<std::string>>(); }
348 std::size_t AppendImpl(
const void *from)
final;
351 void CommitClusterImpl()
final { fIndex = 0; }
354 static std::string TypeName() {
return "std::string"; }
355 explicit RField(std::string_view
name)
359 RField(RField &&
other) =
default;
360 RField &operator=(RField &&
other) =
default;
363 std::
size_t GetValueSize()
const final {
return sizeof(std::string); }
364 std::size_t GetAlignment()
const final {
return alignof(std::string); }
379 static constexpr std::size_t kMaxVariants = 125;
399 size_t fMaxItemSize = 0;
400 size_t fMaxAlignment = 1;
402 size_t fTagOffset = 0;
404 size_t fVariantOffset = 0;
405 std::vector<ROOT::Internal::RColumnIndex::ValueType>
fNWritten;
417 std::unique_ptr<RFieldBase> CloneImpl(std::string_view
newName)
const final;
420 void GenerateColumns()
final;
426 std::
size_t AppendImpl(
const void *from)
final;
429 void CommitClusterImpl()
final;
447 static std::string BuildItemTypes()
450 if constexpr (
sizeof...(TailTs) > 0)
456 static void _BuildItemFields(std::vector<std::unique_ptr<RFieldBase>> &
itemFields,
unsigned int index = 0)
459 if constexpr (
sizeof...(TailTs) > 0)
462 static std::vector<std::unique_ptr<RFieldBase>> BuildItemFields()
464 std::vector<std::unique_ptr<RFieldBase>>
result;
470 static std::string TypeName() {
return "std::variant<" + BuildItemTypes<
ItemTs...>() +
">"; }
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
Template specializations for C++ std::atomic.
RAtomicField(RAtomicField &&other)=default
size_t GetValueSize() const final
What sizeof(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...
size_t GetAlignment() const final
What alignof(T) for this type returns.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
RAtomicField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::unique_ptr< RDeleter > GetDeleter() const final
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
~RAtomicField() override=default
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
RAtomicField & operator=(RAtomicField &&other)=default
Template specializations for C++ std::bitset.
std::size_t GetN() const
Get the number of bits in the bitset, i.e. the N in std::bitset<N>
size_t GetAlignment() const final
What alignof(T) for this type returns.
~RBitsetField() override=default
RBitsetField & operator=(RBitsetField &&other)=default
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
size_t GetValueSize() const final
What sizeof(T) for this type returns.
RBitsetField(RBitsetField &&other)=default
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.
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
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
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 ...
static std::unique_ptr< RDeleter > GetDeleterOf(const RFieldBase &other)
static std::size_t CallAppendOn(RFieldBase &other, const void *from)
Allow derived classes to call Append() and Read() on other (sub)fields.
virtual void CommitClusterImpl()
static void CallReadOn(RFieldBase &other, RNTupleLocalIndex localIndex, void *to)
static void CallConstructValueOn(const RFieldBase &other, void *where)
Allow derived classes to call ConstructValue(void *) and GetDeleter() on other (sub)fields.
Classes with dictionaries that can be inspected by TClass.
RField & operator=(RField &&other)=default
static std::string TypeName()
RField(std::string_view name)
The on-storage metadata of an RNTuple.
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Template specializations for C++ std::optional and std::unique_ptr.
~RNullableField() override=default
RNullableField & operator=(RNullableField &&other)=default
RNullableField(RNullableField &&other)=default
ROptionalDeleter(std::unique_ptr< RDeleter > itemDeleter, std::size_t engagementPtrOffset, std::size_t alignment)
std::unique_ptr< RDeleter > fItemDeleter
std::size_t GetEngagementPtrOffset() const
std::unique_ptr< RDeleter > fItemDeleter
std::unique_ptr< RDeleter > fItemDeleter
RUniquePtrDeleter(std::unique_ptr< RDeleter > itemDeleter)
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
std::unique_ptr< RDeleter > fItemDeleter
std::size_t GetAlignment() const final
What alignof(T) for this type returns.
std::vector< std::unique_ptr< RDeleter > > fItemDeleters
std::size_t fVariantOffset
RVariantDeleter(std::size_t tagOffset, std::size_t variantOffset, std::size_t alignment, std::vector< std::unique_ptr< RDeleter > > itemDeleters)
Template specializations for C++ std::variant.
std::vector< ROOT::Internal::RColumnIndex::ValueType > fNWritten
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.