14#ifndef ROOT_RField_Record
15#define ROOT_RField_Record
18#error "Please include RField.hxx!"
38 std::vector<std::unique_ptr<RFieldBase>>
itemFields,
46 std::vector<std::unique_ptr<RFieldBase>>
itemFields,
93 for (
unsigned i = 0; i <
N; ++i) {
116 return std::max<size_t>(1ul,
fSize);
135 const std::array<std::size_t, 2> &offsets);
144template <
typename T1,
typename T2>
146 using ContainerT =
typename std::pair<T1, T2>;
149 static std::array<std::unique_ptr<RFieldBase>, 2> BuildItemFields()
151 return {std::make_unique<RField<T1>>(
"_0"), std::make_unique<
RField<T2>>(
"_1")};
154 static std::array<std::size_t, 2> BuildItemOffsets()
156 auto pair = ContainerT();
157 auto offsetFirst =
reinterpret_cast<std::uintptr_t
>(&(pair.first)) -
reinterpret_cast<std::uintptr_t
>(&pair);
158 auto offsetSecond =
reinterpret_cast<std::uintptr_t
>(&(pair.second)) -
reinterpret_cast<std::uintptr_t
>(&pair);
164 explicit RField(std::string_view
name) : RPairField(
name, BuildItemFields(), BuildItemOffsets())
185 const std::vector<std::size_t> &offsets);
194template <
typename...
ItemTs>
196 using ContainerT =
typename std::tuple<
ItemTs...>;
200 static std::string BuildItemTypes()
203 if constexpr (
sizeof...(TailTs) > 0)
209 static void _BuildItemFields(std::vector<std::unique_ptr<RFieldBase>> &
itemFields,
unsigned int index = 0)
212 if constexpr (
sizeof...(TailTs) > 0)
215 static std::vector<std::unique_ptr<RFieldBase>> BuildItemFields()
217 std::vector<std::unique_ptr<RFieldBase>>
result;
222 template <
unsigned Index,
typename HeadT,
typename...
TailTs>
223 static void _BuildItemOffsets(std::vector<std::size_t> &offsets,
const ContainerT &
tuple)
226 reinterpret_cast<std::uintptr_t
>(&std::get<Index>(
tuple)) -
reinterpret_cast<std::uintptr_t
>(&
tuple);
227 offsets.emplace_back(
offset);
228 if constexpr (
sizeof...(TailTs) > 0)
229 _BuildItemOffsets<Index + 1,
TailTs...>(offsets,
tuple);
231 static std::vector<std::size_t> BuildItemOffsets()
233 std::vector<std::size_t>
result;
239 static std::string
TypeName() {
return "std::tuple<" + BuildItemTypes<
ItemTs...>() +
">"; }
240 explicit RField(std::string_view
name) : RTupleField(
name, BuildItemFields(), BuildItemOffsets())
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
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 Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h offset
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.
std::size_t fMaxAlignment
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.
void Attach(std::unique_ptr< RFieldBase > child)
Add a new subfield to the list of nested fields.
std::uint32_t fTraits
Properties of the type that allow for optimizations of collections of that type.
@ kTraitTrivialType
Shorthand for types that are both trivially constructible and destructible.
Classes with dictionaries that can be inspected by TClass.
RField & operator=(RField &&other)=default
static std::string TypeName()
RField(std::string_view name)
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Template specializations for C++ std::pair.
static std::string GetTypeList(const std::array< std::unique_ptr< RFieldBase >, 2 > &itemFields)
~RPairField() override=default
RPairField(std::string_view fieldName, std::array< std::unique_ptr< RFieldBase >, 2 > itemFields, const std::array< std::size_t, 2 > &offsets)
RPairField(RPairField &&other)=default
RPairField & operator=(RPairField &&other)=default
std::vector< std::size_t > fOffsets
RRecordDeleter(std::vector< std::unique_ptr< RDeleter > > itemDeleters, const std::vector< std::size_t > &offsets)
std::vector< std::unique_ptr< RDeleter > > fItemDeleters
void operator()(void *objPtr, bool dtorOnly) final
The field for an untyped record.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::size_t fMaxAlignment
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
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
RRecordField & operator=(RRecordField &&other)=default
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
RRecordField(std::string_view name, const RRecordField &source)
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::unique_ptr< RDeleter > GetDeleter() const final
void AttachItemFields(std::vector< std::unique_ptr< RFieldBase > > itemFields)
RRecordField(RRecordField &&other)=default
std::size_t GetItemPadding(std::size_t baseOffset, std::size_t itemAlignment) const
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
~RRecordField() override=default
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
std::vector< std::size_t > fOffsets
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
const std::vector< std::size_t > & GetOffsets() const
Template specializations for C++ std::tuple.
~RTupleField() override=default
RTupleField(RTupleField &&other)=default
static std::string GetTypeList(const std::vector< std::unique_ptr< RFieldBase > > &itemFields)
RTupleField & operator=(RTupleField &&other)=default
std::unique_ptr< RFieldBase > CreateEmulatedField(std::string_view fieldName, std::vector< std::unique_ptr< RFieldBase > > itemFields, std::string_view emulatedFromType)
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.