16#ifndef ROOT7_RField_Record
17#define ROOT7_RField_Record
20#error "Please include RField.hxx!"
33namespace Experimental {
41 std::vector<std::unique_ptr<RFieldBase>>
itemFields,
49 std::vector<std::unique_ptr<RFieldBase>>
itemFields,
96 for (
unsigned i = 0; i <
N; ++i) {
119 return std::max<size_t>(1ul,
fSize);
138 const std::array<std::size_t, 2> &offsets);
147template <
typename T1,
typename T2>
149 using ContainerT =
typename std::pair<T1, T2>;
152 static std::array<std::unique_ptr<RFieldBase>, 2> BuildItemFields()
154 return {std::make_unique<RField<T1>>(
"_0"), std::make_unique<
RField<T2>>(
"_1")};
157 static std::array<std::size_t, 2> BuildItemOffsets()
159 auto pair = ContainerT();
160 auto offsetFirst =
reinterpret_cast<std::uintptr_t
>(&(pair.first)) -
reinterpret_cast<std::uintptr_t
>(&pair);
161 auto offsetSecond =
reinterpret_cast<std::uintptr_t
>(&(pair.second)) -
reinterpret_cast<std::uintptr_t
>(&pair);
167 explicit RField(std::string_view
name) : RPairField(
name, BuildItemFields(), BuildItemOffsets())
188 const std::vector<std::size_t> &offsets);
197template <
typename...
ItemTs>
199 using ContainerT =
typename std::tuple<
ItemTs...>;
203 static std::string BuildItemTypes()
206 if constexpr (
sizeof...(TailTs) > 0)
212 static void _BuildItemFields(std::vector<std::unique_ptr<RFieldBase>> &
itemFields,
unsigned int index = 0)
215 if constexpr (
sizeof...(TailTs) > 0)
218 static std::vector<std::unique_ptr<RFieldBase>> BuildItemFields()
220 std::vector<std::unique_ptr<RFieldBase>>
result;
225 template <
unsigned Index,
typename HeadT,
typename...
TailTs>
226 static void _BuildItemOffsets(std::vector<std::size_t> &offsets,
const ContainerT &
tuple)
229 reinterpret_cast<std::uintptr_t
>(&std::get<Index>(
tuple)) -
reinterpret_cast<std::uintptr_t
>(&
tuple);
230 offsets.emplace_back(
offset);
231 if constexpr (
sizeof...(TailTs) > 0)
232 _BuildItemOffsets<Index + 1,
TailTs...>(offsets,
tuple);
234 static std::vector<std::size_t> BuildItemOffsets()
236 std::vector<std::size_t>
result;
242 static std::string
TypeName() {
return "std::tuple<" + BuildItemTypes<
ItemTs...>() +
">"; }
243 explicit RField(std::string_view
name) : RTupleField(
name, BuildItemFields(), BuildItemOffsets())
ROOT::Experimental::RField< T > RField
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.
std::uint32_t fTraits
Properties of the type that allow for optimizations of collections of that type.
void Attach(std::unique_ptr< RFieldBase > child)
Add a new subfield to the list of nested fields.
@ 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()
Template specializations for C++ std::pair.
~RPairField() override=default
RPairField(std::string_view fieldName, std::array< std::unique_ptr< RFieldBase >, 2 > itemFields, const std::array< std::size_t, 2 > &offsets)
static std::string GetTypeList(const std::array< std::unique_ptr< RFieldBase >, 2 > &itemFields)
RPairField(RPairField &&other)=default
RPairField & operator=(RPairField &&other)=default
std::vector< std::size_t > fOffsets
void operator()(void *objPtr, bool dtorOnly) final
std::vector< std::unique_ptr< RDeleter > > fItemDeleters
RRecordDeleter(std::vector< std::unique_ptr< RDeleter > > itemDeleters, const std::vector< std::size_t > &offsets)
The field for an untyped record.
std::size_t fMaxAlignment
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
std::vector< std::size_t > fOffsets
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.
RRecordField(RRecordField &&other)=default
RRecordField(std::string_view name, const RRecordField &source)
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given a value for this field.
std::size_t GetItemPadding(std::size_t baseOffset, std::size_t itemAlignment) const
std::unique_ptr< RDeleter > GetDeleter() const final
~RRecordField() override=default
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
const std::vector< std::size_t > & GetOffsets() const
RRecordField & operator=(RRecordField &&other)=default
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void AcceptVisitor(Detail::RFieldVisitor &visitor) const 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 AttachItemFields(std::vector< std::unique_ptr< RFieldBase > > itemFields)
Template specializations for C++ std::tuple.
RTupleField & operator=(RTupleField &&other)=default
static std::string GetTypeList(const std::vector< std::unique_ptr< RFieldBase > > &itemFields)
~RTupleField() override=default
RTupleField(RTupleField &&other)=default
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
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...