28#include <unordered_map>
41 auto base =
reinterpret_cast<unsigned char *
>(buffer);
43 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
45 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
47 pos += RNTupleSerializer::SerializeUInt32(fieldDesc.
GetFieldVersion(), *where);
48 pos += RNTupleSerializer::SerializeUInt32(fieldDesc.
GetTypeVersion(), *where);
49 pos += RNTupleSerializer::SerializeUInt32(onDiskParentId, *where);
50 pos += RNTupleSerializer::SerializeFieldStructure(fieldDesc.
GetStructure(), *where);
52 pos += RNTupleSerializer::SerializeUInt16(RNTupleSerializer::kFlagRepetitiveField, *where);
53 pos += RNTupleSerializer::SerializeUInt64(fieldDesc.
GetNRepetitions(), *where);
55 pos += RNTupleSerializer::SerializeUInt16(0, *where);
57 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetFieldName(), *where);
58 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetTypeName(), *where);
59 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetTypeAlias(), *where);
62 auto size = pos - base;
63 RNTupleSerializer::SerializeFramePostscript(base,
size);
76 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
77 std::size_t firstOnDiskId,
80 auto base =
reinterpret_cast<unsigned char *
>(buffer);
82 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
86 for (
auto fieldId : fieldList) {
89 (
f.GetParentId() == fieldZeroId) ? onDiskFieldId : context.
GetOnDiskFieldId(
f.GetParentId());
90 pos += SerializeFieldV1(
f, onDiskParentId, *where);
99 std::uint32_t bufSize,
104 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
106 std::uint32_t frameSize;
107 auto fnFrameSizeLeft = [&]() {
return frameSize -
static_cast<std::uint32_t
>(
bytes - base); };
108 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
113 std::uint32_t fieldVersion;
114 std::uint32_t typeVersion;
115 std::uint32_t parentId;
117 ENTupleStructure structure{ENTupleStructure::kLeaf};
119 if (fnFrameSizeLeft() < 3 *
sizeof(std::uint32_t) +
120 RNTupleSerializer::SerializeFieldStructure(structure,
nullptr) +
121 sizeof(std::uint16_t))
123 return R__FAIL(
"field record frame too short");
125 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldVersion);
126 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, typeVersion);
127 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, parentId);
128 auto res16 = RNTupleSerializer::DeserializeFieldStructure(
bytes, structure);
131 bytes += res16.Unwrap();
132 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, flags);
135 if (flags & RNTupleSerializer::kFlagRepetitiveField) {
136 if (fnFrameSizeLeft() <
sizeof(std::uint64_t))
137 return R__FAIL(
"field record frame too short");
138 std::uint64_t nRepetitions;
139 bytes += RNTupleSerializer::DeserializeUInt64(
bytes, nRepetitions);
143 std::string fieldName;
144 std::string typeName;
145 std::string aliasName;
146 std::string description;
147 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), fieldName).Unwrap();
151 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), typeName).Unwrap();
155 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), aliasName).Unwrap();
159 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), description).Unwrap();
169 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
175 auto base =
reinterpret_cast<unsigned char *
>(buffer);
177 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
179 for (
auto parentId : fieldList) {
181 if (
c.IsAliasColumn())
185 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
187 auto type =
c.GetModel().GetType();
188 pos += RNTupleSerializer::SerializeColumnType(
type, *where);
189 pos += RNTupleSerializer::SerializeUInt16(RColumnElementBase::GetBitsOnStorage(
type), *where);
190 pos += RNTupleSerializer::SerializeUInt32(context.
GetOnDiskFieldId(
c.GetFieldId()), *where);
191 std::uint32_t flags = 0;
193 if (
c.GetModel().GetIsSorted())
194 flags |= RNTupleSerializer::kFlagSortAscColumn;
197 flags |= RNTupleSerializer::kFlagNonNegativeColumn;
198 pos += RNTupleSerializer::SerializeUInt32(flags, *where);
200 pos += RNTupleSerializer::SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
209 std::uint32_t bufSize,
214 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
216 std::uint32_t frameSize;
217 auto fnFrameSizeLeft = [&]() {
return frameSize -
static_cast<std::uint32_t
>(
bytes - base); };
218 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
225 std::uint16_t bitsOnStorage;
226 std::uint32_t fieldId;
228 if (fnFrameSizeLeft() < RNTupleSerializer::SerializeColumnType(
type,
nullptr) +
229 sizeof(std::uint16_t) + 2 *
sizeof(std::uint32_t))
231 return R__FAIL(
"column record frame too short");
233 auto res16 = RNTupleSerializer::DeserializeColumnType(
bytes,
type);
236 bytes += res16.Unwrap();
237 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, bitsOnStorage);
238 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldId);
239 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, flags);
242 return R__FAIL(
"column element size mismatch");
244 const bool isSorted = (flags & (RNTupleSerializer::kFlagSortAscColumn | RNTupleSerializer::kFlagSortDesColumn));
252 const auto &uri = locator.
GetPosition<std::string>();
253 if (uri.length() >= (1 << 16))
256 memcpy(buffer, uri.data(), uri.length());
260void DeserializeLocatorPayloadURI(
const unsigned char *buffer, std::uint32_t payloadSize,
264 auto &uri = locator.
fPosition.emplace<std::string>();
265 uri.resize(payloadSize);
266 memcpy(uri.data(), buffer, payloadSize);
274 RNTupleSerializer::SerializeUInt64(
data.fLocation, buffer +
sizeof(std::uint32_t));
276 return sizeof(std::uint32_t) +
sizeof(std::uint64_t);
283 RNTupleSerializer::DeserializeUInt64(buffer +
sizeof(std::uint32_t),
data.fLocation);
287 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
291 auto base =
reinterpret_cast<unsigned char *
>(buffer);
293 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
295 for (
auto parentId : fieldList) {
297 if (!
c.IsAliasColumn())
301 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
303 pos += RNTupleSerializer::SerializeUInt32(context.
GetOnDiskColumnId(
c.GetPhysicalId()), *where);
304 pos += RNTupleSerializer::SerializeUInt32(context.
GetOnDiskFieldId(
c.GetFieldId()), *where);
306 pos += RNTupleSerializer::SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
314 std::uint32_t &physicalColumnId, std::uint32_t &fieldId)
316 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
318 std::uint32_t frameSize;
319 auto fnFrameSizeLeft = [&]() {
return frameSize -
static_cast<std::uint32_t
>(
bytes - base); };
320 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
325 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint32_t)) {
326 return R__FAIL(
"alias column record frame too short");
329 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, physicalColumnId);
330 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldId);
339 const unsigned char *
data, std::uint32_t
length, std::uint32_t &crc32,
void *buffer)
341 if (buffer !=
nullptr) {
342 crc32 = R__crc32(0,
nullptr, 0);
350 const unsigned char *
data, std::uint32_t
length, std::uint32_t &crc32)
352 auto checksumReal = R__crc32(0,
nullptr, 0);
353 checksumReal = R__crc32(checksumReal,
data,
length);
355 if (crc32 != checksumReal)
356 return R__FAIL(
"CRC32 checksum mismatch");
362 const unsigned char *
data, std::uint32_t
length)
371 if (buffer !=
nullptr) {
372 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
373 bytes[0] = (val & 0x00FF);
374 bytes[1] = (val & 0xFF00) >> 8;
381 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
382 val = std::int16_t(
bytes[0]) + (std::int16_t(
bytes[1]) << 8);
388 return SerializeInt16(val, buffer);
393 return DeserializeInt16(buffer, *
reinterpret_cast<std::int16_t *
>(&val));
398 if (buffer !=
nullptr) {
399 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
400 bytes[0] = (val & 0x000000FF);
401 bytes[1] = (val & 0x0000FF00) >> 8;
402 bytes[2] = (val & 0x00FF0000) >> 16;
403 bytes[3] = (val & 0xFF000000) >> 24;
410 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
411 val = std::int32_t(
bytes[0]) + (std::int32_t(
bytes[1]) << 8) +
412 (std::int32_t(
bytes[2]) << 16) + (std::int32_t(
bytes[3]) << 24);
418 return SerializeInt32(val, buffer);
423 return DeserializeInt32(buffer, *
reinterpret_cast<std::int32_t *
>(&val));
428 if (buffer !=
nullptr) {
429 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
430 bytes[0] = (val & 0x00000000000000FF);
431 bytes[1] = (val & 0x000000000000FF00) >> 8;
432 bytes[2] = (val & 0x0000000000FF0000) >> 16;
433 bytes[3] = (val & 0x00000000FF000000) >> 24;
434 bytes[4] = (val & 0x000000FF00000000) >> 32;
435 bytes[5] = (val & 0x0000FF0000000000) >> 40;
436 bytes[6] = (val & 0x00FF000000000000) >> 48;
437 bytes[7] = (val & 0xFF00000000000000) >> 56;
444 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
445 val = std::int64_t(
bytes[0]) + (std::int64_t(
bytes[1]) << 8) +
446 (std::int64_t(
bytes[2]) << 16) + (std::int64_t(
bytes[3]) << 24) +
447 (std::int64_t(
bytes[4]) << 32) + (std::int64_t(
bytes[5]) << 40) +
448 (std::int64_t(
bytes[6]) << 48) + (std::int64_t(
bytes[7]) << 56);
454 return SerializeInt64(val, buffer);
459 return DeserializeInt64(buffer, *
reinterpret_cast<std::int64_t *
>(&val));
465 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
466 pos += SerializeUInt32(val.length(), pos);
467 memcpy(pos, val.data(), val.length());
469 return sizeof(std::uint32_t) + val.length();
473 const void *buffer, std::uint32_t bufSize, std::string &val)
475 if (bufSize <
sizeof(std::uint32_t))
476 return R__FAIL(
"string buffer too short");
477 bufSize -=
sizeof(std::uint32_t);
479 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
484 return R__FAIL(
"string buffer too short");
488 return sizeof(std::uint32_t) +
length;
526 std::uint16_t onDiskType;
527 auto result = DeserializeUInt16(buffer, onDiskType);
528 switch (onDiskType) {
549 default:
return R__FAIL(
"unexpected on-disk column type");
561 return SerializeUInt16(0x00, buffer);
563 return SerializeUInt16(0x01, buffer);
565 return SerializeUInt16(0x02, buffer);
567 return SerializeUInt16(0x03, buffer);
569 return SerializeUInt16(0x04, buffer);
580 std::uint16_t onDiskValue;
581 auto result = DeserializeUInt16(buffer, onDiskValue);
582 switch (onDiskValue) {
599 return R__FAIL(
"unexpected on-disk field structure value");
609 auto base =
reinterpret_cast<unsigned char *
>(buffer);
611 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
613 pos += SerializeUInt16(kEnvelopeCurrentVersion, *where);
614 pos += SerializeUInt16(kEnvelopeMinVersion, *where);
620 const unsigned char *envelope, std::uint32_t
size, std::uint32_t &crc32,
void *buffer)
622 return SerializeCRC32(envelope,
size, crc32, buffer);
626 const unsigned char *envelope, std::uint32_t
size,
void *buffer)
629 return SerializeEnvelopePostscript(envelope,
size, crc32, buffer);
635 const void *buffer, std::uint32_t bufSize, std::uint32_t &crc32)
637 if (bufSize < (2 *
sizeof(std::uint16_t) +
sizeof(std::uint32_t)))
638 return R__FAIL(
"invalid envelope, too short");
640 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
643 std::uint16_t protocolVersionAtWrite;
644 std::uint16_t protocolVersionMinRequired;
645 bytes += DeserializeUInt16(
bytes, protocolVersionAtWrite);
647 if (protocolVersionAtWrite < 1)
648 return R__FAIL(
"The RNTuple format is too old (version 0)");
650 bytes += DeserializeUInt16(
bytes, protocolVersionMinRequired);
651 if (protocolVersionMinRequired > kEnvelopeCurrentVersion) {
652 return R__FAIL(std::string(
"The RNTuple format is too new (version ") +
653 std::to_string(protocolVersionMinRequired) +
")");
657 auto result = VerifyCRC32(base, bufSize - 4, crc32);
661 return sizeof(protocolVersionAtWrite) +
sizeof(protocolVersionMinRequired);
666 const void *buffer, std::uint32_t bufSize)
676 return SerializeInt32(1, buffer);
681 std::uint32_t
nitems,
void *buffer)
686 auto base =
reinterpret_cast<unsigned char *
>(buffer);
688 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
692 pos += SerializeUInt32(
nitems, *where);
697 void *frame, std::int32_t
size)
701 if (
size <
static_cast<std::int32_t
>(
sizeof(std::int32_t)))
705 DeserializeInt32(frame, marker);
706 if ((marker < 0) && (
size <
static_cast<std::int32_t
>(2 *
sizeof(std::int32_t))))
709 SerializeInt32(marker *
size, frame);
715 const void *buffer, std::uint32_t bufSize, std::uint32_t &frameSize, std::uint32_t &
nitems)
717 if (bufSize <
sizeof(std::int32_t))
718 return R__FAIL(
"frame too short");
720 std::int32_t *ssize =
reinterpret_cast<std::int32_t *
>(&frameSize);
721 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
726 if (frameSize <
sizeof(std::int32_t))
727 return R__FAIL(
"corrupt record frame size");
730 if (bufSize < 2 *
sizeof(std::int32_t))
731 return R__FAIL(
"frame too short");
735 if (frameSize < 2 *
sizeof(std::int32_t))
736 return R__FAIL(
"corrupt list frame size");
739 if (bufSize < frameSize)
740 return R__FAIL(
"frame too short");
742 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
746 const void *buffer, std::uint32_t bufSize, std::uint32_t &frameSize)
753 const std::vector<std::int64_t> &flags,
void *buffer)
756 return SerializeInt64(0, buffer);
759 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
761 for (
unsigned i = 0; i < flags.size(); ++i) {
766 if (i == (flags.size() - 1))
767 SerializeInt64(flags[i],
bytes);
769 bytes += SerializeInt64(flags[i] | 0x8000000000000000,
bytes);
772 return (flags.size() *
sizeof(std::int64_t));
776 const void *buffer, std::uint32_t bufSize, std::vector<std::int64_t> &flags)
778 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
783 if (bufSize <
sizeof(std::int64_t))
784 return R__FAIL(
"feature flag buffer too short");
786 bufSize -=
sizeof(std::int64_t);
787 flags.emplace_back(
f & ~0x8000000000000000);
790 return (flags.size() *
sizeof(std::int64_t));
796 std::uint32_t
size = 0;
802 buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
size :
nullptr);
806 auto payloadp = buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
sizeof(std::int32_t) :
nullptr;
807 switch (locator.
fType) {
812 std::int32_t head =
sizeof(std::int32_t) +
size;
814 head |=
static_cast<int>(locator.
fType & 0x7F) << 24;
821 const void *buffer, std::uint32_t bufSize,
RNTupleLocator &locator)
823 if (bufSize <
sizeof(std::int32_t))
824 return R__FAIL(
"too short locator");
826 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
830 bufSize -=
sizeof(std::int32_t);
833 const int type = head >> 24;
834 const std::uint32_t payloadSize = (
static_cast<std::uint32_t
>(head) & 0x0000FFFF) -
sizeof(std::int32_t);
835 if (bufSize < payloadSize)
836 return R__FAIL(
"too short locator");
838 locator.
fReserved =
static_cast<std::uint32_t
>(head >> 16) & 0xFF;
842 default:
return R__FAIL(
"unsupported locator type: " + std::to_string(
type));
844 bytes += payloadSize;
846 if (bufSize <
sizeof(std::uint64_t))
847 return R__FAIL(
"too short locator");
854 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
862 buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
size :
nullptr);
867 const void *buffer, std::uint32_t bufSize,
REnvelopeLink &envelopeLink)
869 if (bufSize <
sizeof(std::int32_t))
870 return R__FAIL(
"too short envelope link");
872 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
874 bufSize -=
sizeof(std::uint32_t);
879 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
886 auto base =
reinterpret_cast<unsigned char *
>(buffer);
888 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
891 pos += SerializeRecordFramePreamble(*where);
892 pos += SerializeUInt64(clusterSummary.
fFirstEntry, *where);
894 pos += SerializeInt64(-
static_cast<int64_t
>(clusterSummary.
fNEntries), *where);
897 pos += SerializeInt64(
static_cast<int64_t
>(clusterSummary.
fNEntries), *where);
899 auto size = pos - frame;
900 pos += SerializeFramePostscript(frame,
size);
906 const void *buffer, std::uint32_t bufSize,
RClusterSummary &clusterSummary)
908 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
910 std::uint32_t frameSize;
911 auto result = DeserializeFrameHeader(
bytes, bufSize, frameSize);
916 auto fnBufSizeLeft = [&]() {
return frameSize -
static_cast<std::uint32_t
>(
bytes - base); };
917 if (fnBufSizeLeft() < 2 *
sizeof(std::uint64_t))
918 return R__FAIL(
"too short cluster summary");
921 std::int64_t nEntries;
925 if (fnBufSizeLeft() <
sizeof(std::uint32_t))
926 return R__FAIL(
"too short cluster summary");
928 std::uint32_t columnGroupID;
929 bytes += DeserializeUInt32(
bytes, columnGroupID);
943 auto base =
reinterpret_cast<unsigned char *
>(buffer);
945 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
948 pos += SerializeRecordFramePreamble(*where);
949 pos += SerializeUInt32(clusterGroup.
fNClusters, *where);
951 auto size = pos - frame;
952 pos += SerializeFramePostscript(frame,
size);
958 const void *buffer, std::uint32_t bufSize,
RClusterGroup &clusterGroup)
960 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
963 std::uint32_t frameSize;
964 auto result = DeserializeFrameHeader(
bytes, bufSize, frameSize);
969 auto fnFrameSizeLeft = [&]() {
return frameSize -
static_cast<std::uint32_t
>(
bytes - base); };
970 if (fnFrameSizeLeft() <
sizeof(std::uint32_t))
971 return R__FAIL(
"too short cluster group");
982 bool forHeaderExtension)
985 auto depthFirstTraversal = [&](std::span<DescriptorId_t> fieldTrees,
auto doForEachField) {
986 std::deque<DescriptorId_t> idQueue{fieldTrees.begin(), fieldTrees.end()};
987 while (!idQueue.empty()) {
988 auto fieldId = idQueue.front();
991 if (fieldId != fieldZeroId)
992 doForEachField(fieldId);
995 idQueue.insert(idQueue.begin() + i++,
f.GetId());
1000 if (!forHeaderExtension)
1001 R__ASSERT(GetHeaderExtensionOffset() == -1U);
1003 std::vector<DescriptorId_t> fieldTrees;
1004 if (!forHeaderExtension) {
1005 fieldTrees.emplace_back(fieldZeroId);
1007 fieldTrees = xHeader->GetTopLevelFields(desc);
1009 depthFirstTraversal(fieldTrees, [&](
DescriptorId_t fieldId) { MapFieldId(fieldId); });
1012 if (!
c.IsAliasColumn())
1013 MapColumnId(
c.GetLogicalId());
1017 if (
c.IsAliasColumn())
1018 MapColumnId(
c.GetLogicalId());
1022 if (!forHeaderExtension)
1023 BeginHeaderExtension();
1029 bool forHeaderExtension)
1031 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1033 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
1035 std::size_t nFields = 0, nColumns = 0, nAliasColumns = 0, fieldListOffset = 0;
1036 if (forHeaderExtension) {
1040 nFields = xHeader->GetNFields();
1041 nColumns = xHeader->GetNPhysicalColumns();
1042 nAliasColumns = xHeader->GetNLogicalColumns() - xHeader->GetNPhysicalColumns();
1051 std::span<const DescriptorId_t> fieldList{&(*(onDiskFields.cbegin() + fieldListOffset)), &(*onDiskFields.cend())};
1054 pos += SerializeListFramePreamble(nFields, *where);
1055 pos += SerializeFieldList(desc, fieldList, fieldListOffset, context, *where);
1056 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1059 pos += SerializeListFramePreamble(nColumns, *where);
1060 pos += SerializeColumnListV1(desc, fieldList, context, *where);
1061 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1064 pos += SerializeListFramePreamble(nAliasColumns, *where);
1065 pos += SerializeAliasColumnList(desc, fieldList, context, *where);
1066 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1070 pos += SerializeListFramePreamble(0, *where);
1071 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1072 return static_cast<std::uint32_t
>(pos - base);
1079 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1081 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1084 std::uint32_t frameSize;
1086 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1088 std::uint32_t nFields;
1089 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nFields);
1095 for (
unsigned i = 0; i < nFields; ++i) {
1096 std::uint32_t fieldId = fieldIdRangeBegin + i;
1098 result = DeserializeFieldV1(
bytes, fnFrameSizeLeft(), fieldBuilder);
1103 fieldBuilder.
ParentId(kZeroFieldId);
1107 auto parentId = fieldDesc.Inspect().GetParentId();
1108 descBuilder.
AddField(fieldDesc.Unwrap());
1109 auto resVoid = descBuilder.
AddFieldLink(parentId, fieldId);
1113 bytes = frame + frameSize;
1115 std::uint32_t nColumns;
1117 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nColumns);
1122 std::unordered_map<DescriptorId_t, std::uint32_t> maxIndexes;
1123 for (
unsigned i = 0; i < nColumns; ++i) {
1124 std::uint32_t columnId = columnIdRangeBegin + i;
1126 result = DeserializeColumnV1(
bytes, fnFrameSizeLeft(), columnBuilder);
1131 std::uint32_t idx = 0;
1132 const auto fieldId = columnBuilder.
GetFieldId();
1133 auto maxIdx = maxIndexes.find(fieldId);
1134 if (maxIdx != maxIndexes.end())
1135 idx = maxIdx->second + 1;
1136 maxIndexes[fieldId] = idx;
1141 auto resVoid = descBuilder.
AddColumn(columnDesc.Unwrap());
1145 bytes = frame + frameSize;
1147 std::uint32_t nAliasColumns;
1149 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nAliasColumns);
1153 const std::uint32_t aliasColumnIdRangeBegin = columnIdRangeBegin + nColumns;
1154 for (
unsigned i = 0; i < nAliasColumns; ++i) {
1155 std::uint32_t physicalId;
1156 std::uint32_t fieldId;
1157 result = DeserializeAliasColumn(
bytes, fnFrameSizeLeft(), physicalId, fieldId);
1166 std::uint32_t idx = 0;
1167 auto maxIdx = maxIndexes.find(fieldId);
1168 if (maxIdx != maxIndexes.end())
1169 idx = maxIdx->second + 1;
1170 maxIndexes[fieldId] = idx;
1173 if (!aliasColumnDesc)
1175 auto resVoid = descBuilder.
AddColumn(aliasColumnDesc.Unwrap());
1179 bytes = frame + frameSize;
1181 std::uint32_t nTypeInfo;
1183 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nTypeInfo);
1188 bytes = frame + frameSize;
1190 return bytes - base;
1199 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1201 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1203 pos += SerializeEnvelopePreamble(*where);
1205 pos += SerializeFeatureFlags(std::vector<std::int64_t>(), *where);
1206 pos += SerializeUInt32(kReleaseCandidateTag, *where);
1207 pos += SerializeString(desc.
GetName(), *where);
1209 pos += SerializeString(std::string(
"ROOT v") +
ROOT_RELEASE, *where);
1212 pos += SerializeSchemaDescription(*where, desc, context);
1214 std::uint32_t
size = pos - base;
1215 std::uint32_t crc32 = 0;
1216 size += SerializeEnvelopePostscript(base,
size, crc32, *where);
1226 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1228 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
1230 pos += SerializeEnvelopePreamble(*where);
1231 auto topMostFrame = pos;
1232 pos += SerializeListFramePreamble(physClusterIDs.size(), *where);
1234 for (
auto clusterId : physClusterIDs) {
1237 std::set<DescriptorId_t> onDiskColumnIds;
1238 for (
auto column : clusterDesc.GetColumnIds())
1241 auto outerFrame = pos;
1242 pos += SerializeListFramePreamble(onDiskColumnIds.size(), *where);
1243 for (
auto onDiskId : onDiskColumnIds) {
1245 const auto &columnRange = clusterDesc.GetColumnRange(memId);
1246 const auto &pageRange = clusterDesc.GetPageRange(memId);
1248 auto innerFrame = pos;
1249 pos += SerializeListFramePreamble(pageRange.fPageInfos.size(), *where);
1251 for (
const auto &pi : pageRange.fPageInfos) {
1252 pos += SerializeUInt32(pi.fNElements, *where);
1253 pos += SerializeLocator(pi.fLocator, *where);
1255 pos += SerializeUInt64(columnRange.fFirstElementIndex, *where);
1256 pos += SerializeUInt32(columnRange.fCompressionSettings, *where);
1258 pos += SerializeFramePostscript(buffer ? innerFrame :
nullptr, pos - innerFrame);
1260 pos += SerializeFramePostscript(buffer ? outerFrame :
nullptr, pos - outerFrame);
1263 pos += SerializeFramePostscript(buffer ? topMostFrame :
nullptr, pos - topMostFrame);
1264 std::uint32_t
size = pos - base;
1265 size += SerializeEnvelopePostscript(base,
size, *where);
1274 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1276 void** where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void**
>(&pos);
1278 pos += SerializeEnvelopePreamble(*where);
1281 pos += SerializeFeatureFlags(std::vector<std::int64_t>(), *where);
1286 pos += SerializeRecordFramePreamble(*where);
1287 pos += SerializeSchemaDescription(*where, desc, context,
true);
1288 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1292 pos += SerializeListFramePreamble(0, *where);
1293 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1297 unsigned int nClusters = 0;
1299 nClusters += cgDesc.GetNClusters();
1301 pos += SerializeListFramePreamble(nClusters, *where);
1302 for (
unsigned int i = 0; i < nClusterGroups; ++i) {
1305 const auto &clusterIds = cgDesc.GetClusterIds();
1306 for (
unsigned int j = 0; j < nClustersInGroup; ++j) {
1308 RClusterSummary summary{clusterDesc.GetFirstEntryIndex(), clusterDesc.GetNEntries(), -1};
1309 pos += SerializeClusterSummary(summary, *where);
1312 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1316 pos += SerializeListFramePreamble(nClusterGroups, *where);
1317 for (
unsigned int i = 0; i < nClusterGroups; ++i) {
1320 clusterGroup.
fNClusters = cgDesc.GetNClusters();
1323 pos += SerializeClusterGroup(clusterGroup, *where);
1325 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1329 pos += SerializeListFramePreamble(0, *where);
1330 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1332 std::uint32_t
size = pos - base;
1333 size += SerializeEnvelopePostscript(base,
size, *where);
1340 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1342 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1345 std::uint32_t crc32{0};
1346 result = DeserializeEnvelope(
bytes, fnBufSizeLeft(), crc32);
1352 std::vector<std::int64_t> featureFlags;
1353 result = DeserializeFeatureFlags(
bytes, fnBufSizeLeft(), featureFlags);
1357 for (
auto f: featureFlags) {
1362 std::uint32_t rcTag;
1363 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
1364 return R__FAIL(
"header too short");
1371 std::string description;
1377 result = DeserializeString(
bytes, fnBufSizeLeft(), description);
1390 result = DeserializeSchemaDescription(
bytes, fnBufSizeLeft(), descBuilder);
1401 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1403 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1406 result = DeserializeEnvelope(
bytes, fnBufSizeLeft());
1411 std::vector<std::int64_t> featureFlags;
1412 result = DeserializeFeatureFlags(
bytes, fnBufSizeLeft(), featureFlags);
1416 for (
auto f: featureFlags) {
1421 std::uint32_t crc32{0};
1422 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
1423 return R__FAIL(
"footer too short");
1426 return R__FAIL(
"CRC32 mismatch between header and footer");
1428 std::uint32_t frameSize;
1430 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1432 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize);
1436 if (fnFrameSizeLeft() > 0) {
1438 result = DeserializeSchemaDescription(
bytes, fnFrameSizeLeft(), descBuilder);
1442 bytes = frame + frameSize;
1444 std::uint32_t nColumnGroups;
1446 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nColumnGroups);
1449 if (nColumnGroups > 0)
1450 return R__FAIL(
"sharded clusters are still unsupported");
1451 bytes = frame + frameSize;
1453 std::uint32_t nClusterSummaries;
1455 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nClusterSummaries);
1459 for (std::uint32_t clusterId = 0; clusterId < nClusterSummaries; ++clusterId) {
1461 result = DeserializeClusterSummary(
bytes, fnFrameSizeLeft(), clusterSummary);
1466 return R__FAIL(
"sharded clusters are still unsupported");
1469 bytes = frame + frameSize;
1471 std::uint32_t nClusterGroups;
1473 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nClusterGroups);
1477 std::uint64_t clusterId = 0;
1478 for (std::uint32_t groupId = 0; groupId < nClusterGroups; ++groupId) {
1480 result = DeserializeClusterGroup(
bytes, fnFrameSizeLeft(), clusterGroup);
1490 for (std::uint64_t i = 0; i < clusterGroup.
fNClusters; ++i)
1491 clusterGroupBuilder.
AddCluster(clusterId + i);
1495 bytes = frame + frameSize;
1497 std::uint32_t nMDBlocks;
1499 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nMDBlocks);
1504 bytes = frame + frameSize;
1511 const void *buffer, std::uint32_t bufSize, std::vector<RClusterDescriptorBuilder> &clusters)
1513 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1515 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1518 result = DeserializeEnvelope(
bytes, fnBufSizeLeft());
1523 std::uint32_t topMostFrameSize;
1524 auto topMostFrame =
bytes;
1525 auto fnTopMostFrameSizeLeft = [&]() {
return topMostFrameSize - (
bytes - topMostFrame); };
1527 std::uint32_t nClusters;
1528 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), topMostFrameSize, nClusters);
1533 if (nClusters != clusters.size())
1534 return R__FAIL(
"mismatch of page list and cluster summaries");
1536 for (std::uint32_t i = 0; i < nClusters; ++i) {
1537 std::uint32_t outerFrameSize;
1538 auto outerFrame =
bytes;
1539 auto fnOuterFrameSizeLeft = [&]() {
return outerFrameSize - (
bytes - outerFrame); };
1541 std::uint32_t nColumns;
1542 result = DeserializeFrameHeader(
bytes, fnTopMostFrameSizeLeft(), outerFrameSize, nColumns);
1547 for (std::uint32_t j = 0; j < nColumns; ++j) {
1548 std::uint32_t innerFrameSize;
1549 auto innerFrame =
bytes;
1550 auto fnInnerFrameSizeLeft = [&]() {
return innerFrameSize - (
bytes - innerFrame); };
1552 std::uint32_t nPages;
1553 result = DeserializeFrameHeader(
bytes, fnOuterFrameSizeLeft(), innerFrameSize, nPages);
1560 for (std::uint32_t k = 0; k < nPages; ++k) {
1561 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
1562 return R__FAIL(
"inner frame too short");
1563 std::uint32_t nElements;
1565 bytes += DeserializeUInt32(
bytes, nElements);
1566 result = DeserializeLocator(
bytes, fnInnerFrameSizeLeft(), locator);
1569 pageRange.
fPageInfos.push_back({nElements, locator});
1573 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t) +
sizeof(std::uint64_t)))
1574 return R__FAIL(
"page list frame too short");
1575 std::uint64_t columnOffset;
1576 bytes += DeserializeUInt64(
bytes, columnOffset);
1577 std::uint32_t compressionSettings;
1578 bytes += DeserializeUInt32(
bytes, compressionSettings);
1580 clusters[i].CommitColumnRange(j, columnOffset, compressionSettings, pageRange);
1581 bytes = innerFrame + innerFrameSize;
1584 bytes = outerFrame + outerFrameSize;
#define R__FORWARD_ERROR(res)
Short-hand to return an RResult<T> in an error state (i.e. after checking)
#define R__FORWARD_RESULT(res)
Short-hand to return an RResult<T> value from a subroutine to the calling stack frame.
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
#define R__LOG_WARNING(...)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
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 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 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 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 bytes
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
virtual std::size_t GetBitsOnStorage() const
The available trivial, native content types of a column.
The serialization context is used for the piecewise serialization of a descriptor.
void SetHeaderCRC32(std::uint32_t crc32)
DescriptorId_t GetOnDiskColumnId(DescriptorId_t memId) const
const std::vector< DescriptorId_t > & GetOnDiskFieldList() const
Return a vector containing the in-memory field ID for each on-disk counterpart, in order,...
void SetHeaderSize(std::uint32_t size)
DescriptorId_t GetOnDiskFieldId(DescriptorId_t memId) const
std::uint32_t GetHeaderCRC32() const
DescriptorId_t GetMemColumnId(DescriptorId_t onDiskId) const
std::size_t GetHeaderExtensionOffset() const
Return the offset of the first element in fOnDisk2MemFieldIDs that is part of the schema extension.
DescriptorId_t GetMemClusterGroupId(DescriptorId_t onDiskId) const
DescriptorId_t GetMemClusterId(DescriptorId_t onDiskId) const
void MapSchema(const RNTupleDescriptor &desc, bool forHeaderExtension)
Map in-memory field and column IDs to their on-disk counterparts.
A helper class for serializing and deserialization of the RNTuple binary format.
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint32_t bufSize, std::string &val)
static std::uint32_t SerializeFeatureFlags(const std::vector< std::int64_t > &flags, void *buffer)
static std::uint32_t SerializePageListV1(void *buffer, const RNTupleDescriptor &desc, std::span< DescriptorId_t > physClusterIDs, const RContext &context)
static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer)
static RResult< std::uint32_t > DeserializeLocator(const void *buffer, std::uint32_t bufSize, RNTupleLocator &locator)
static std::uint32_t SerializeCRC32(const unsigned char *data, std::uint32_t length, std::uint32_t &crc32, void *buffer)
Writes a CRC32 checksum of the byte range given by data and length.
static std::uint16_t SerializeColumnType(ROOT::Experimental::EColumnType type, void *buffer)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static RResult< void > DeserializePageListV1(const void *buffer, std::uint32_t bufSize, std::vector< RClusterDescriptorBuilder > &clusters)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
static RResult< std::uint32_t > DeserializeEnvelope(const void *buffer, std::uint32_t bufSize)
static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val)
static std::uint32_t SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer)
static RContext SerializeHeaderV1(void *buffer, const RNTupleDescriptor &desc)
static RResult< void > DeserializeFooterV1(const void *buffer, std::uint32_t bufSize, RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeInt16(std::int16_t val, void *buffer)
static RResult< std::uint32_t > DeserializeSchemaDescription(const void *buffer, std::uint32_t bufSize, RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeSchemaDescription(void *buffer, const RNTupleDescriptor &desc, const RContext &context, bool forHeaderExtension=false)
Serialize the schema description in desc into buffer.
static std::uint32_t SerializeLocator(const RNTupleLocator &locator, void *buffer)
static std::uint32_t SerializeInt32(std::int32_t val, void *buffer)
static std::uint32_t SerializeEnvelopePreamble(void *buffer)
Currently all enevelopes have the same version number (1).
static RResult< std::uint16_t > DeserializeColumnType(const void *buffer, ROOT::Experimental::EColumnType &type)
static RResult< std::uint32_t > DeserializeClusterGroup(const void *buffer, std::uint32_t bufSize, RClusterGroup &clusterGroup)
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static std::uint32_t DeserializeInt32(const void *buffer, std::int32_t &val)
static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val)
static RResult< std::uint32_t > DeserializeEnvelopeLink(const void *buffer, std::uint32_t bufSize, REnvelopeLink &envelopeLink)
static std::uint32_t SerializeEnvelopePostscript(const unsigned char *envelope, std::uint32_t size, void *buffer)
static RResult< std::uint16_t > DeserializeFieldStructure(const void *buffer, ROOT::Experimental::ENTupleStructure &structure)
static std::uint32_t SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer)
static std::uint32_t SerializeRecordFramePreamble(void *buffer)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static RResult< std::uint32_t > DeserializeFrameHeader(const void *buffer, std::uint32_t bufSize, std::uint32_t &frameSize, std::uint32_t &nitems)
static RResult< std::uint32_t > DeserializeFeatureFlags(const void *buffer, std::uint32_t bufSize, std::vector< std::int64_t > &flags)
static std::uint32_t SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer)
static std::uint32_t SerializeFramePostscript(void *frame, std::int32_t size)
static std::uint32_t SerializeFooterV1(void *buffer, const RNTupleDescriptor &desc, const RContext &context)
static std::uint32_t SerializeInt64(std::int64_t val, void *buffer)
static RResult< void > VerifyCRC32(const unsigned char *data, std::uint32_t length, std::uint32_t &crc32)
Expects a CRC32 checksum in the 4 bytes following data + length and verifies it.
static std::uint16_t SerializeFieldStructure(ROOT::Experimental::ENTupleStructure structure, void *buffer)
While we could just interpret the enums as ints, we make the translation explicit in order to avoid a...
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< void > DeserializeHeaderV1(const void *buffer, std::uint32_t bufSize, RNTupleDescriptorBuilder &descBuilder)
static RResult< std::uint32_t > DeserializeClusterSummary(const void *buffer, std::uint32_t bufSize, RClusterSummary &clusterSummary)
A helper class for piece-wise construction of an RClusterGroupDescriptor.
RClusterGroupDescriptorBuilder & ClusterGroupId(DescriptorId_t clusterGroupId)
void AddCluster(DescriptorId_t clusterId)
RClusterGroupDescriptorBuilder & PageListLength(std::uint32_t pageListLength)
RClusterGroupDescriptorBuilder & PageListLocator(const RNTupleLocator &pageListLocator)
std::uint64_t GetNClusters() const
A helper class for piece-wise construction of an RColumnDescriptor.
RColumnDescriptorBuilder & Model(const RColumnModel &model)
RResult< RColumnDescriptor > MakeDescriptor() const
Attempt to make a column descriptor.
RColumnDescriptorBuilder & FieldId(DescriptorId_t fieldId)
DescriptorId_t GetFieldId() const
RColumnDescriptorBuilder & Index(std::uint32_t index)
RColumnDescriptorBuilder & LogicalColumnId(DescriptorId_t logicalColumnId)
RColumnDescriptorBuilder & PhysicalColumnId(DescriptorId_t physicalColumnId)
RColumnModel GetModel() const
Base class for all ROOT issued exceptions.
A helper class for piece-wise construction of an RFieldDescriptor.
RFieldDescriptorBuilder & FieldName(const std::string &fieldName)
RFieldDescriptorBuilder & NRepetitions(std::uint64_t nRepetitions)
DescriptorId_t GetParentId() const
RFieldDescriptorBuilder & Structure(const ENTupleStructure &structure)
RResult< RFieldDescriptor > MakeDescriptor() const
Attempt to make a field descriptor.
RFieldDescriptorBuilder & TypeName(const std::string &typeName)
RFieldDescriptorBuilder & TypeVersion(std::uint32_t typeVersion)
RFieldDescriptorBuilder & ParentId(DescriptorId_t id)
RFieldDescriptorBuilder & FieldDescription(const std::string &fieldDescription)
RFieldDescriptorBuilder & FieldVersion(std::uint32_t fieldVersion)
RFieldDescriptorBuilder & TypeAlias(const std::string &typeAlias)
RFieldDescriptorBuilder & FieldId(DescriptorId_t fieldId)
Meta-data stored for every field of an ntuple.
std::string GetTypeAlias() const
std::uint32_t GetTypeVersion() const
std::string GetFieldName() const
std::uint32_t GetFieldVersion() const
std::string GetFieldDescription() const
std::string GetTypeName() const
std::uint64_t GetNRepetitions() const
ENTupleStructure GetStructure() const
A helper class for piece-wise construction of an RNTupleDescriptor.
std::uint32_t GetHeaderCRC32() const
void AddToOnDiskFooterSize(std::uint64_t size)
The real footer size also include the page list envelopes.
RResult< void > AddClusterSummary(DescriptorId_t clusterId, std::uint64_t firstEntry, std::uint64_t nEntries)
RResult< void > AddFieldLink(DescriptorId_t fieldId, DescriptorId_t linkId)
void SetHeaderCRC32(std::uint32_t crc32)
void SetNTuple(const std::string_view name, const std::string_view description)
const RNTupleDescriptor & GetDescriptor() const
void AddColumn(DescriptorId_t logicalId, DescriptorId_t physicalId, DescriptorId_t fieldId, const RColumnModel &model, std::uint32_t index)
void AddClusterGroup(RClusterGroupDescriptorBuilder &&clusterGroup)
void BeginHeaderExtension()
Mark the beginning of the header extension; any fields and columns added after a call to this functio...
void AddField(const RFieldDescriptor &fieldDesc)
The on-storage meta-data of an ntuple.
std::size_t GetNLogicalColumns() const
RClusterGroupDescriptorIterable GetClusterGroupIterable() const
std::string GetDescription() const
std::string GetName() const
DescriptorId_t GetFieldZeroId() const
Returns the logical parent of all top-level NTuple data fields.
RColumnDescriptorIterable GetColumnIterable(const RFieldDescriptor &fieldDesc) const
const RClusterDescriptor & GetClusterDescriptor(DescriptorId_t clusterId) const
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
std::size_t GetNFields() const
const RColumnDescriptor & GetColumnDescriptor(DescriptorId_t columnId) const
std::size_t GetNClusterGroups() const
const RFieldDescriptor & GetFieldDescriptor(DescriptorId_t fieldId) const
const RClusterGroupDescriptor & GetClusterGroupDescriptor(DescriptorId_t clusterGroupId) const
std::size_t GetNPhysicalColumns() const
const RHeaderExtension * GetHeaderExtension() const
Return header extension information; if the descriptor does not have a header extension,...
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
ENTupleStructure
The fields in the ntuple model tree can carry different structural information about the type system.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
REnvelopeLink fPageListEnvelopeLink
std::uint64_t fFirstEntry
std::int32_t fColumnGroupID
-1 for "all columns"
std::uint32_t fUnzippedSize
RNTupleLocator payload that is common for object stores using 64bit location information.
Generic information about the physical location of data.
ELocatorType
Values for the Type field in non-disk locators; see doc/specifications.md for details.
std::uint8_t fReserved
Reserved for use by concrete storage backends.
ELocatorType fType
For non-disk locators, the value for the Type field.
std::uint32_t fBytesOnStorage
std::variant< std::uint64_t, std::string, RNTupleLocatorObject64 > fPosition
Simple on-disk locators consisting of a 64-bit offset use variant type uint64_t; extended locators ha...
const T & GetPosition() const