Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
RNTupleSerialize.hxx
Go to the documentation of this file.
1/// \file ROOT/RNTupleSerialize.hxx
2/// \author Jakob Blomer <jblomer@cern.ch>
3/// \author Javier Lopez-Gomez <javier.lopez.gomez@cern.ch>
4/// \date 2021-08-02
5
6/*************************************************************************
7 * Copyright (C) 1995-2021, Rene Brun and Fons Rademakers. *
8 * All rights reserved. *
9 * *
10 * For the licensing terms see $ROOTSYS/LICENSE. *
11 * For the list of contributors see $ROOTSYS/README/CREDITS. *
12 *************************************************************************/
13
14#ifndef ROOT_RNTupleSerialize
15#define ROOT_RNTupleSerialize
16
17#include <ROOT/RError.hxx>
18#include <ROOT/RNTupleTypes.hxx>
19#include <ROOT/RSpan.hxx>
20
21#include <Rtypes.h>
22
23#include <cstdint>
24#include <limits>
25#include <map>
26#include <string>
27#include <unordered_map>
28#include <vector>
29
31
32namespace ROOT {
33
36enum class EExtraTypeInfoIds;
37
38namespace Experimental {
40namespace Internal {
42} // namespace Internal
43} // namespace Experimental
44
45namespace Internal {
46
49
50// clang-format off
51/**
52\class ROOT::Internal::RNTupleSerializer
53\ingroup NTuple
54\brief A helper class for serializing and deserialization of the RNTuple binary format
55
56All serialization and deserialization routines return the number of bytes processed (written or read).
57
58The serialization routines can be called with a nullptr buffer, in which case only the size required to perform
59a serialization is returned. Deserialization routines must be called with a buffer that is sufficiently large.
60
61Deserialization errors throw exceptions. Only when indicated or when passed as a parameter is the buffer size checked.
62*/
63// clang-format on
65 static RResult<std::vector<ROOT::Internal::RClusterDescriptorBuilder>>
66 DeserializePageListRaw(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId,
67 const RNTupleDescriptor &desc);
68
69public:
70 static constexpr std::uint16_t kEnvelopeTypeHeader = 0x01;
71 static constexpr std::uint16_t kEnvelopeTypeFooter = 0x02;
72 static constexpr std::uint16_t kEnvelopeTypePageList = 0x03;
73
74 static constexpr std::uint16_t kFlagRepetitiveField = 0x01;
75 static constexpr std::uint16_t kFlagProjectedField = 0x02;
76 static constexpr std::uint16_t kFlagHasTypeChecksum = 0x04;
77 static constexpr std::uint16_t kFlagIsSoACollection = 0x08;
78
79 static constexpr std::uint16_t kFlagDeferredColumn = 0x01;
80 static constexpr std::uint16_t kFlagHasValueRange = 0x02;
81
82 static constexpr ROOT::DescriptorId_t kZeroFieldId = std::uint64_t(-2);
83
84 static constexpr int64_t kSuppressedColumnMarker = std::numeric_limits<std::int64_t>::min();
85
86 // In the page sink and the streamer field, the seen streamer infos are stored in a map
87 // with the unique streamer info number being the key. Sorted by unique number.
88 using StreamerInfoMap_t = std::map<Int_t, TVirtualStreamerInfo *>;
89
91 std::uint64_t fLength = 0;
93 };
94
96 std::uint64_t fFirstEntry = 0;
97 std::uint64_t fNEntries = 0;
98 std::uint8_t fFlags = 0;
99 };
100
102 std::uint64_t fMinEntry = 0;
103 std::uint64_t fEntrySpan = 0;
104 std::uint32_t fNClusters = 0;
106 };
107
108 /// The serialization context is used for the piecewise serialization of a descriptor. During header serialization,
109 /// the mapping of in-memory field and column IDs to on-disk IDs is built so that it can be used for the
110 /// footer serialization in a second step.
111 class RContext {
112 private:
113 std::uint64_t fHeaderSize = 0;
114 std::uint64_t fHeaderXxHash3 = 0;
115 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskFieldIDs;
116 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskColumnIDs;
117 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskClusterIDs;
118 std::map<ROOT::DescriptorId_t, ROOT::DescriptorId_t> fMem2OnDiskClusterGroupIDs;
119 std::vector<ROOT::DescriptorId_t> fOnDisk2MemFieldIDs;
120 std::vector<ROOT::DescriptorId_t> fOnDisk2MemColumnIDs;
121 std::vector<ROOT::DescriptorId_t> fOnDisk2MemClusterIDs;
122 std::vector<ROOT::DescriptorId_t> fOnDisk2MemClusterGroupIDs;
123
124 public:
125 void SetHeaderSize(std::uint64_t size) { fHeaderSize = size; }
126 std::uint64_t GetHeaderSize() const { return fHeaderSize; }
127 void SetHeaderXxHash3(std::uint64_t xxhash3) { fHeaderXxHash3 = xxhash3; }
128 std::uint64_t GetHeaderXxHash3() const { return fHeaderXxHash3; }
129 /// Map an in-memory field ID to its on-disk counterpart. It is allowed to call this function multiple times for
130 /// the same `memId`, in which case the return value is the on-disk ID assigned on the first call.
132 {
133 auto onDiskId = fOnDisk2MemFieldIDs.size();
134 const auto &p = fMem2OnDiskFieldIDs.try_emplace(memId, onDiskId);
135 if (p.second)
136 fOnDisk2MemFieldIDs.push_back(memId);
137 return (*p.first).second;
138 }
139 /// Map an in-memory column ID to its on-disk counterpart. It is allowed to call this function multiple times for
140 /// the same `memId`, in which case the return value is the on-disk ID assigned on the first call.
141 /// Note that we only map physical column IDs. Logical column IDs of alias columns are shifted before the
142 /// serialization of the extension header. Also, we only need to query physical column IDs for the page list
143 /// serialization.
145 {
146 auto onDiskId = fOnDisk2MemColumnIDs.size();
147 const auto &p = fMem2OnDiskColumnIDs.try_emplace(memId, onDiskId);
148 if (p.second)
149 fOnDisk2MemColumnIDs.push_back(memId);
150 return (*p.first).second;
151 }
153 {
154 auto onDiskId = fOnDisk2MemClusterIDs.size();
155 fMem2OnDiskClusterIDs[memId] = onDiskId;
156 fOnDisk2MemClusterIDs.push_back(memId);
157 return onDiskId;
158 }
160 {
161 auto onDiskId = fOnDisk2MemClusterGroupIDs.size();
162 fMem2OnDiskClusterGroupIDs[memId] = onDiskId;
163 fOnDisk2MemClusterGroupIDs.push_back(memId);
164 return onDiskId;
165 }
166 /// Map in-memory field and column IDs to their on-disk counterparts. This function is unconditionally called
167 /// during header serialization. This function must be manually called after an incremental schema update as page
168 /// list serialization requires all columns to be mapped.
169 void MapSchema(const RNTupleDescriptor &desc, bool forHeaderExtension);
170
186 {
187 return fOnDisk2MemColumnIDs[onDiskId];
188 }
190 {
191 return fOnDisk2MemClusterIDs[onDiskId];
192 }
197
198 /// Return a vector containing the in-memory field ID for each on-disk counterpart, in order, i.e. the `i`-th
199 /// value corresponds to the in-memory field ID for `i`-th on-disk ID
200 const std::vector<ROOT::DescriptorId_t> &GetOnDiskFieldList() const { return fOnDisk2MemFieldIDs; }
201 };
202
203 /// Writes a XxHash-3 64bit checksum of the byte range given by data and length.
204 static std::uint32_t
205 SerializeXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3, void *buffer);
206 /// Expects an xxhash3 checksum in the 8 bytes following data + length and verifies it.
207 static RResult<void> VerifyXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3);
208 static RResult<void> VerifyXxHash3(const unsigned char *data, std::uint64_t length);
209
210 static std::uint32_t SerializeInt16(std::int16_t val, void *buffer);
211 static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val);
212 static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer);
213 static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val);
214
215 static std::uint32_t SerializeInt32(std::int32_t val, void *buffer);
216 static std::uint32_t DeserializeInt32(const void *buffer, std::int32_t &val);
217 static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer);
218 static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val);
219
220 static std::uint32_t SerializeInt64(std::int64_t val, void *buffer);
221 static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val);
222 static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer);
223 static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val);
224
225 static std::uint32_t SerializeString(const std::string &val, void *buffer);
226 static RResult<std::uint32_t> DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val);
227
228 /// While we could just interpret the enums as ints, we make the translation explicit
229 /// in order to avoid accidentally changing the on-disk numbers when adjusting the enum classes.
233 static RResult<std::uint32_t> DeserializeFieldStructure(const void *buffer, ROOT::ENTupleStructure &structure);
236
237 static std::uint32_t SerializeEnvelopePreamble(std::uint16_t envelopeType, void *buffer);
238 static RResult<std::uint32_t> SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size);
240 SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size, std::uint64_t &xxhash3);
241 // The bufSize must include the 8 bytes for the final xxhash3 checksum.
243 DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType);
245 DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType, std::uint64_t &xxhash3);
246
247 static std::uint32_t SerializeRecordFramePreamble(void *buffer);
248 static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer);
249 static RResult<std::uint32_t> SerializeFramePostscript(void *frame, std::uint64_t size);
251 DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems);
253 DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize);
254
255 // An empty flags vector will be serialized as a single, zero feature flag
256 // The most significant bit in every flag is reserved and must _not_ be set
257 static RResult<std::uint32_t> SerializeFeatureFlags(const std::vector<std::uint64_t> &flags, void *buffer);
259 DeserializeFeatureFlags(const void *buffer, std::uint64_t bufSize, std::vector<std::uint64_t> &flags);
260
261 static RResult<std::uint32_t> SerializeLocator(const RNTupleLocator &locator, void *buffer);
262 static RResult<std::uint32_t> SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer);
263 static RResult<std::uint32_t> DeserializeLocator(const void *buffer, std::uint64_t bufSize, RNTupleLocator &locator);
265 DeserializeEnvelopeLink(const void *buffer, std::uint64_t bufSize, REnvelopeLink &envelopeLink);
266
267 static RResult<std::uint32_t> SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer);
268 static RResult<std::uint32_t> SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer);
270 DeserializeClusterSummary(const void *buffer, std::uint64_t bufSize, RClusterSummary &clusterSummary);
272 DeserializeClusterGroup(const void *buffer, std::uint64_t bufSize, RClusterGroup &clusterGroup);
273
274 /// Serialize the schema description in `desc` into `buffer`. If `forHeaderExtension` is true, serialize only the
275 /// fields and columns tagged as part of the header extension (see `RNTupleDescriptorBuilder::BeginHeaderExtension`).
277 const RContext &context, bool forHeaderExtension = false);
278 static RResult<std::uint32_t> DeserializeSchemaDescription(const void *buffer, std::uint64_t bufSize,
280
282 SerializeAttributeSet(const Experimental::RNTupleAttrSetDescriptor &attrSetDesc, void *buffer);
284 DeserializeAttributeSet(const void *buffer, std::uint64_t bufSize,
286
287 static RResult<RContext> SerializeHeader(void *buffer, const RNTupleDescriptor &desc);
288 static RResult<std::uint32_t> SerializePageList(void *buffer, const RNTupleDescriptor &desc,
289 std::span<ROOT::DescriptorId_t> physClusterIDs,
290 const RContext &context);
291 static RResult<std::uint32_t> SerializeFooter(void *buffer, const RNTupleDescriptor &desc, const RContext &context);
292
293 static RResult<void>
294 DeserializeHeader(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder);
295 static RResult<void>
296 DeserializeFooter(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder);
297
299 /// Deserializes the descriptor as-is without performing any additional fixup. The produced descriptor is
300 /// unsuitable for reading or writing, but it's a faithful representation of the on-disk information.
302 /// Deserializes the descriptor and performs fixup on the suppressed column ranges. This produces a descriptor
303 /// that is suitable for writing, but not reading.
305 /// Deserializes the descriptor and performs fixup on the suppressed column ranges and on clusters, taking
306 /// into account the header extension. This produces a descriptor that is suitable for reading.
308 };
309 // The clusters vector must be initialized with the cluster summaries corresponding to the page list
310 static RResult<void> DeserializePageList(const void *buffer, std::uint64_t bufSize,
311 ROOT::DescriptorId_t clusterGroupId, RNTupleDescriptor &desc,
313
314 // Helper functions to (de-)serialize the streamer info type extra information
315 static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos);
316 static RResult<StreamerInfoMap_t> DeserializeStreamerInfos(const std::string &extraTypeInfoContent);
317}; // class RNTupleSerializer
318
319} // namespace Internal
320} // namespace ROOT
321
322#endif // ROOT_RNTupleSerialize
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
The serialization context is used for the piecewise serialization of a descriptor.
Metadata stored for every Attribute Set linked to an RNTuple.
A helper class for piece-wise construction of an RClusterDescriptor.
A helper class for piece-wise construction of an RNTupleDescriptor.
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 constexpr std::uint16_t kFlagIsSoACollection
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< std::uint32_t > SerializeAttributeSet(const Experimental::RNTupleAttrSetDescriptor &attrSetDesc, 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 > DeserializeAttributeSet(const void *buffer, std::uint64_t bufSize, Experimental::Internal::RNTupleAttrSetDescriptorBuilder &attrSetDescBld)
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)
Metadata for RNTuple clusters.
The on-storage metadata of an RNTuple.
Generic information about the physical location of data.
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
Definition RError.hxx:197
Abstract Interface class describing Streamer information for one class.
Namespace for ROOT features in testing.
Definition TROOT.h:100
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 RNTuple data model tree can carry different structural information about the type s...
ENTupleColumnType