Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
RNTupleSerialize.hxx
Go to the documentation of this file.
1/// \file ROOT/RNTupleSerialize.hxx
2/// \ingroup NTuple
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \author Javier Lopez-Gomez <javier.lopez.gomez@cern.ch>
5/// \date 2021-08-02
6
7/*************************************************************************
8 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
9 * All rights reserved. *
10 * *
11 * For the licensing terms see $ROOTSYS/LICENSE. *
12 * For the list of contributors see $ROOTSYS/README/CREDITS. *
13 *************************************************************************/
14
15#ifndef ROOT_RNTupleSerialize
16#define ROOT_RNTupleSerialize
17
18#include <ROOT/RError.hxx>
19#include <ROOT/RNTupleUtil.hxx>
20#include <ROOT/RSpan.hxx>
21
22#include <Rtypes.h>
23
24#include <cstdint>
25#include <limits>
26#include <map>
27#include <string>
28#include <unordered_map>
29#include <vector>
30
32
33namespace ROOT {
34
35class RNTupleDescriptor;
36class RClusterDescriptor;
37enum class EExtraTypeInfoIds;
38
39namespace Internal {
40
41class RClusterDescriptorBuilder;
42class RNTupleDescriptorBuilder;
43
44// clang-format off
45/**
46\class ROOT::Internal::RNTupleSerializer
47\ingroup NTuple
48\brief A helper class for serializing and deserialization of the RNTuple binary format
49
50All serialization and deserialization routines return the number of bytes processed (written or read).
51
52The serialization routines can be called with a nullptr buffer, in which case only the size required to perform
53a serialization is returned. Deserialization routines must be called with a buffer that is sufficiently large.
54
55Deserialization errors throw exceptions. Only when indicated or when passed as a parameter is the buffer size checked.
56*/
57// clang-format on
60 DeserializePageListRaw(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId,
61 const RNTupleDescriptor &desc);
62
63public:
64 static constexpr std::uint16_t kEnvelopeTypeHeader = 0x01;
65 static constexpr std::uint16_t kEnvelopeTypeFooter = 0x02;
66 static constexpr std::uint16_t kEnvelopeTypePageList = 0x03;
67
68 static constexpr std::uint16_t kFlagRepetitiveField = 0x01;
69 static constexpr std::uint16_t kFlagProjectedField = 0x02;
70 static constexpr std::uint16_t kFlagHasTypeChecksum = 0x04;
71
72 static constexpr std::uint16_t kFlagDeferredColumn = 0x01;
73 static constexpr std::uint16_t kFlagHasValueRange = 0x02;
74
75 static constexpr ROOT::DescriptorId_t kZeroFieldId = std::uint64_t(-2);
76
77 static constexpr int64_t kSuppressedColumnMarker = std::numeric_limits<std::int64_t>::min();
78
79 // In the page sink and the streamer field, the seen streamer infos are stored in a map
80 // with the unique streamer info number being the key. Sorted by unique number.
81 using StreamerInfoMap_t = std::map<Int_t, TVirtualStreamerInfo *>;
82
84 std::uint64_t fLength = 0;
86 };
87
89 std::uint64_t fFirstEntry = 0;
90 std::uint64_t fNEntries = 0;
91 std::uint8_t fFlags = 0;
92 };
93
95 std::uint64_t fMinEntry = 0;
96 std::uint64_t fEntrySpan = 0;
97 std::uint32_t fNClusters = 0;
99 };
100
101 /// The serialization context is used for the piecewise serialization of a descriptor. During header serialization,
102 /// the mapping of in-memory field and column IDs to on-disk IDs is built so that it can be used for the
103 /// footer serialization in a second step.
104 class RContext {
105 private:
106 std::uint64_t fHeaderSize = 0;
107 std::uint64_t fHeaderXxHash3 = 0;
108 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskFieldIDs;
109 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskColumnIDs;
110 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskClusterIDs;
111 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskClusterGroupIDs;
112 std::vector<ROOT::DescriptorId_t> fOnDisk2MemFieldIDs;
113 std::vector<ROOT::DescriptorId_t> fOnDisk2MemColumnIDs;
114 std::vector<ROOT::DescriptorId_t> fOnDisk2MemClusterIDs;
115 std::vector<ROOT::DescriptorId_t> fOnDisk2MemClusterGroupIDs;
116
117 public:
118 void SetHeaderSize(std::uint64_t size) { fHeaderSize = size; }
119 std::uint64_t GetHeaderSize() const { return fHeaderSize; }
121 std::uint64_t GetHeaderXxHash3() const { return fHeaderXxHash3; }
122 /// Map an in-memory field ID to its on-disk counterpart. It is allowed to call this function multiple times for
123 /// the same `memId`, in which case the return value is the on-disk ID assigned on the first call.
125 {
126 auto onDiskId = fOnDisk2MemFieldIDs.size();
127 const auto &p = fMem2OnDiskFieldIDs.try_emplace(memId, onDiskId);
128 if (p.second)
129 fOnDisk2MemFieldIDs.push_back(memId);
130 return (*p.first).second;
131 }
132 /// Map an in-memory column ID to its on-disk counterpart. It is allowed to call this function multiple times for
133 /// the same `memId`, in which case the return value is the on-disk ID assigned on the first call.
134 /// Note that we only map physical column IDs. Logical column IDs of alias columns are shifted before the
135 /// serialization of the extension header. Also, we only need to query physical column IDs for the page list
136 /// serialization.
138 {
139 auto onDiskId = fOnDisk2MemColumnIDs.size();
140 const auto &p = fMem2OnDiskColumnIDs.try_emplace(memId, onDiskId);
141 if (p.second)
142 fOnDisk2MemColumnIDs.push_back(memId);
143 return (*p.first).second;
144 }
159 /// Map in-memory field and column IDs to their on-disk counterparts. This function is unconditionally called
160 /// during header serialization. This function must be manually called after an incremental schema update as page
161 /// list serialization requires all columns to be mapped.
162 void MapSchema(const RNTupleDescriptor &desc, bool forHeaderExtension);
163
190
191 /// Return a vector containing the in-memory field ID for each on-disk counterpart, in order, i.e. the `i`-th
192 /// value corresponds to the in-memory field ID for `i`-th on-disk ID
193 const std::vector<ROOT::DescriptorId_t> &GetOnDiskFieldList() const { return fOnDisk2MemFieldIDs; }
194 };
195
196 /// Writes a XxHash-3 64bit checksum of the byte range given by data and length.
197 static std::uint32_t
198 SerializeXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3, void *buffer);
199 /// Expects an xxhash3 checksum in the 8 bytes following data + length and verifies it.
200 static RResult<void> VerifyXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3);
201 static RResult<void> VerifyXxHash3(const unsigned char *data, std::uint64_t length);
202
203 static std::uint32_t SerializeInt16(std::int16_t val, void *buffer);
204 static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val);
205 static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer);
206 static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val);
207
208 static std::uint32_t SerializeInt32(std::int32_t val, void *buffer);
209 static std::uint32_t DeserializeInt32(const void *buffer, std::int32_t &val);
210 static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer);
211 static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val);
212
213 static std::uint32_t SerializeInt64(std::int64_t val, void *buffer);
214 static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val);
215 static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer);
216 static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val);
217
218 static std::uint32_t SerializeString(const std::string &val, void *buffer);
219 static RResult<std::uint32_t> DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val);
220
221 /// While we could just interpret the enums as ints, we make the translation explicit
222 /// in order to avoid accidentally changing the on-disk numbers when adjusting the enum classes.
226 static RResult<std::uint32_t> DeserializeFieldStructure(const void *buffer, ROOT::ENTupleStructure &structure);
229
230 static std::uint32_t SerializeEnvelopePreamble(std::uint16_t envelopeType, void *buffer);
231 static RResult<std::uint32_t> SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size);
233 SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size, std::uint64_t &xxhash3);
234 // The bufSize must include the 8 bytes for the final xxhash3 checksum.
236 DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType);
238 DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType, std::uint64_t &xxhash3);
239
240 static std::uint32_t SerializeRecordFramePreamble(void *buffer);
241 static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer);
242 static RResult<std::uint32_t> SerializeFramePostscript(void *frame, std::uint64_t size);
244 DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems);
246 DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize);
247
248 // An empty flags vector will be serialized as a single, zero feature flag
249 // The most significant bit in every flag is reserved and must _not_ be set
250 static RResult<std::uint32_t> SerializeFeatureFlags(const std::vector<std::uint64_t> &flags, void *buffer);
252 DeserializeFeatureFlags(const void *buffer, std::uint64_t bufSize, std::vector<std::uint64_t> &flags);
253
255 static RResult<std::uint32_t> SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer);
256 static RResult<std::uint32_t> DeserializeLocator(const void *buffer, std::uint64_t bufSize, RNTupleLocator &locator);
258 DeserializeEnvelopeLink(const void *buffer, std::uint64_t bufSize, REnvelopeLink &envelopeLink);
259
260 static RResult<std::uint32_t> SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer);
261 static RResult<std::uint32_t> SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer);
263 DeserializeClusterSummary(const void *buffer, std::uint64_t bufSize, RClusterSummary &clusterSummary);
265 DeserializeClusterGroup(const void *buffer, std::uint64_t bufSize, RClusterGroup &clusterGroup);
266
267 /// Serialize the schema description in `desc` into `buffer`. If `forHeaderExtension` is true, serialize only the
268 /// fields and columns tagged as part of the header extension (see `RNTupleDescriptorBuilder::BeginHeaderExtension`).
270 const RContext &context, bool forHeaderExtension = false);
271 static RResult<std::uint32_t> DeserializeSchemaDescription(const void *buffer, std::uint64_t bufSize,
273
274 static RResult<RContext> SerializeHeader(void *buffer, const RNTupleDescriptor &desc);
275 static RResult<std::uint32_t> SerializePageList(void *buffer, const RNTupleDescriptor &desc,
276 std::span<ROOT::DescriptorId_t> physClusterIDs,
277 const RContext &context);
278 static RResult<std::uint32_t> SerializeFooter(void *buffer, const RNTupleDescriptor &desc, const RContext &context);
279
280 static RResult<void>
282 static RResult<void>
284
286 /// Deserializes the descriptor as-is without performing any additional fixup. The produced descriptor is
287 /// unsuitable for reading or writing, but it's a faithful representation of the on-disk information.
288 kRaw,
289 /// Deserializes the descriptor and performs fixup on the suppressed column ranges. This produces a descriptor
290 /// that is suitable for writing, but not reading.
292 /// Deserializes the descriptor and performs fixup on the suppressed column ranges and on clusters, taking
293 /// into account the header extension. This produces a descriptor that is suitable for reading.
295 };
296 // The clusters vector must be initialized with the cluster summaries corresponding to the page list
297 static RResult<void> DeserializePageList(const void *buffer, std::uint64_t bufSize,
300
301 // Helper functions to (de-)serialize the streamer info type extra information
302 static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos);
304}; // class RNTupleSerializer
305
306} // namespace Internal
307} // namespace ROOT
308
309#endif // ROOT_RNTupleSerialize
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void data
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 length
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 Atom_t Int_t ULong_t nitems
Option_t Option_t TPoint TPoint const char mode
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 Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
The available trivial, native content types of a column.
A helper class for piece-wise construction of an RNTupleDescriptor.
The serialization context is used for the piecewise serialization of a descriptor.
ROOT::DescriptorId_t GetOnDiskClusterGroupId(ROOT::DescriptorId_t memId) const
std::map< ROOT::DescriptorId_t, ROOT::DescriptorId_t > fMem2OnDiskClusterIDs
ROOT::DescriptorId_t GetOnDiskFieldId(ROOT::DescriptorId_t memId) const
ROOT::DescriptorId_t GetMemColumnId(ROOT::DescriptorId_t onDiskId) const
ROOT::DescriptorId_t GetMemClusterGroupId(ROOT::DescriptorId_t onDiskId) const
std::vector< ROOT::DescriptorId_t > fOnDisk2MemColumnIDs
std::map< ROOT::DescriptorId_t, ROOT::DescriptorId_t > fMem2OnDiskColumnIDs
ROOT::DescriptorId_t GetOnDiskClusterId(ROOT::DescriptorId_t memId) const
std::map< ROOT::DescriptorId_t, ROOT::DescriptorId_t > fMem2OnDiskFieldIDs
std::map< ROOT::DescriptorId_t, ROOT::DescriptorId_t > fMem2OnDiskClusterGroupIDs
std::vector< ROOT::DescriptorId_t > fOnDisk2MemFieldIDs
ROOT::DescriptorId_t GetOnDiskColumnId(ROOT::DescriptorId_t memId) const
void MapSchema(const RNTupleDescriptor &desc, bool forHeaderExtension)
Map in-memory field and column IDs to their on-disk counterparts.
std::vector< ROOT::DescriptorId_t > fOnDisk2MemClusterGroupIDs
ROOT::DescriptorId_t MapClusterId(ROOT::DescriptorId_t memId)
std::vector< ROOT::DescriptorId_t > fOnDisk2MemClusterIDs
ROOT::DescriptorId_t MapPhysicalColumnId(ROOT::DescriptorId_t memId)
Map an in-memory column ID to its on-disk counterpart.
ROOT::DescriptorId_t GetMemClusterId(ROOT::DescriptorId_t onDiskId) const
const std::vector< ROOT::DescriptorId_t > & GetOnDiskFieldList() const
Return a vector containing the in-memory field ID for each on-disk counterpart, in order,...
ROOT::DescriptorId_t GetMemFieldId(ROOT::DescriptorId_t onDiskId) const
ROOT::DescriptorId_t MapClusterGroupId(ROOT::DescriptorId_t memId)
ROOT::DescriptorId_t MapFieldId(ROOT::DescriptorId_t memId)
Map an in-memory field ID to its on-disk counterpart.
A helper class for serializing and deserialization of the RNTuple binary format.
static std::uint32_t SerializeXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3, void *buffer)
Writes a XxHash-3 64bit checksum of the byte range given by data and length.
static constexpr std::uint16_t kFlagDeferredColumn
static RResult< std::vector< ROOT::Internal::RClusterDescriptorBuilder > > DeserializePageListRaw(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId, const RNTupleDescriptor &desc)
static RResult< std::uint32_t > SerializeSchemaDescription(void *buffer, const RNTupleDescriptor &desc, const RContext &context, bool forHeaderExtension=false)
Serialize the schema description in desc into buffer.
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val)
static constexpr std::uint16_t kEnvelopeTypePageList
static RResult< std::uint32_t > SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer)
static std::uint32_t SerializeInt32(std::int32_t val, void *buffer)
static RResult< std::uint32_t > DeserializeEnvelopeLink(const void *buffer, std::uint64_t bufSize, REnvelopeLink &envelopeLink)
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< std::uint32_t > SerializeFieldStructure(ROOT::ENTupleStructure structure, void *buffer)
While we could just interpret the enums as ints, we make the translation explicit in order to avoid a...
static RResult< std::uint32_t > SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size)
static RResult< std::uint32_t > SerializeFeatureFlags(const std::vector< std::uint64_t > &flags, void *buffer)
static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val)
static RResult< std::uint32_t > DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems)
static RResult< std::uint32_t > DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType)
static constexpr std::uint16_t kFlagRepetitiveField
static constexpr int64_t kSuppressedColumnMarker
static RResult< std::uint32_t > SerializeColumnType(ROOT::ENTupleColumnType type, void *buffer)
static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer)
static std::uint32_t SerializeInt16(std::int16_t val, void *buffer)
static RResult< std::uint32_t > SerializeFramePostscript(void *frame, std::uint64_t size)
static constexpr std::uint16_t kEnvelopeTypeFooter
static RResult< std::uint32_t > DeserializeClusterGroup(const void *buffer, std::uint64_t bufSize, RClusterGroup &clusterGroup)
static RResult< std::uint32_t > DeserializeLocator(const void *buffer, std::uint64_t bufSize, RNTupleLocator &locator)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static RResult< void > DeserializePageList(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId, RNTupleDescriptor &desc, EDescriptorDeserializeMode mode)
static constexpr std::uint16_t kFlagProjectedField
static RResult< void > DeserializeFooter(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val)
static std::uint32_t SerializeEnvelopePreamble(std::uint16_t envelopeType, void *buffer)
static std::uint32_t DeserializeInt32(const void *buffer, std::int32_t &val)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
static RResult< std::uint32_t > SerializeExtraTypeInfoId(ROOT::EExtraTypeInfoIds id, void *buffer)
static RResult< StreamerInfoMap_t > DeserializeStreamerInfos(const std::string &extraTypeInfoContent)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static constexpr std::uint16_t kFlagHasValueRange
static RResult< void > VerifyXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3)
Expects an xxhash3 checksum in the 8 bytes following data + length and verifies it.
static RResult< std::uint32_t > SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer)
static RResult< std::uint32_t > DeserializeColumnType(const void *buffer, ROOT::ENTupleColumnType &type)
static constexpr ROOT::DescriptorId_t kZeroFieldId
static constexpr std::uint16_t kFlagHasTypeChecksum
static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val)
static RResult< std::uint32_t > DeserializeExtraTypeInfoId(const void *buffer, ROOT::EExtraTypeInfoIds &id)
static RResult< std::uint32_t > DeserializeClusterSummary(const void *buffer, std::uint64_t bufSize, RClusterSummary &clusterSummary)
@ kForReading
Deserializes the descriptor and performs fixup on the suppressed column ranges and on clusters,...
@ kRaw
Deserializes the descriptor as-is without performing any additional fixup.
@ kForWriting
Deserializes the descriptor and performs fixup on the suppressed column ranges.
static constexpr std::uint16_t kEnvelopeTypeHeader
static RResult< std::uint32_t > SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer)
static std::uint32_t SerializeRecordFramePreamble(void *buffer)
static RResult< std::uint32_t > SerializePageList(void *buffer, const RNTupleDescriptor &desc, std::span< ROOT::DescriptorId_t > physClusterIDs, const RContext &context)
static RResult< std::uint32_t > DeserializeFieldStructure(const void *buffer, ROOT::ENTupleStructure &structure)
static std::uint32_t SerializeInt64(std::int64_t val, void *buffer)
static RResult< void > DeserializeHeader(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static RResult< std::uint32_t > SerializeFooter(void *buffer, const RNTupleDescriptor &desc, const RContext &context)
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static RResult< std::uint32_t > SerializeLocator(const RNTupleLocator &locator, void *buffer)
static RResult< std::uint32_t > DeserializeSchemaDescription(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
static RResult< std::uint32_t > DeserializeFeatureFlags(const void *buffer, std::uint64_t bufSize, std::vector< std::uint64_t > &flags)
static RResult< RContext > SerializeHeader(void *buffer, const RNTupleDescriptor &desc)
static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos)
The on-storage metadata of an RNTuple.
Generic information about the physical location of data.
Abstract Interface class describing Streamer information for one class.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
EExtraTypeInfoIds
Used in RExtraTypeInfoDescriptor.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
ENTupleStructure
The fields in the ntuple model tree can carry different structural information about the type system.