40#include <unordered_map>
53 auto base =
reinterpret_cast<unsigned char *
>(buffer);
55 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
57 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
59 pos += RNTupleSerializer::SerializeUInt32(fieldDesc.
GetFieldVersion(), *where);
60 pos += RNTupleSerializer::SerializeUInt32(fieldDesc.
GetTypeVersion(), *where);
61 pos += RNTupleSerializer::SerializeUInt32(onDiskParentId, *where);
62 pos += RNTupleSerializer::SerializeFieldStructure(fieldDesc.
GetStructure(), *where);
64 std::uint16_t flags = 0;
66 flags |= RNTupleSerializer::kFlagRepetitiveField;
68 flags |= RNTupleSerializer::kFlagProjectedField;
70 flags |= RNTupleSerializer::kFlagHasTypeChecksum;
71 pos += RNTupleSerializer::SerializeUInt16(flags, *where);
73 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetFieldName(), *where);
74 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetTypeName(), *where);
75 pos += RNTupleSerializer::SerializeString(fieldDesc.
GetTypeAlias(), *where);
78 if (flags & RNTupleSerializer::kFlagRepetitiveField) {
79 pos += RNTupleSerializer::SerializeUInt64(fieldDesc.
GetNRepetitions(), *where);
81 if (flags & RNTupleSerializer::kFlagProjectedField) {
82 pos += RNTupleSerializer::SerializeUInt32(onDiskProjectionSourceId, *where);
84 if (flags & RNTupleSerializer::kFlagHasTypeChecksum) {
85 pos += RNTupleSerializer::SerializeUInt32(fieldDesc.
GetTypeChecksum().value(), *where);
88 auto size = pos - base;
89 RNTupleSerializer::SerializeFramePostscript(base,
size);
102 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
103 std::size_t firstOnDiskId,
108 auto base =
reinterpret_cast<unsigned char *
>(buffer);
110 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
114 for (
auto fieldId : fieldList) {
116 auto onDiskParentId =
117 (
f.GetParentId() == fieldZeroId) ? onDiskFieldId : context.
GetOnDiskFieldId(
f.GetParentId());
118 auto onDiskProjectionSourceId =
119 f.IsProjectedField() ? context.
GetOnDiskFieldId(
f.GetProjectionSourceId()) : kInvalidDescriptorId;
120 pos += SerializeField(
f, onDiskParentId, onDiskProjectionSourceId, *where);
132 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
134 std::uint64_t frameSize;
135 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
136 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
141 std::uint32_t fieldVersion;
142 std::uint32_t typeVersion;
143 std::uint32_t parentId;
145 ENTupleStructure structure{ENTupleStructure::kLeaf};
147 if (fnFrameSizeLeft() < 3 *
sizeof(std::uint32_t) + RNTupleSerializer::SerializeFieldStructure(structure,
nullptr) +
148 sizeof(std::uint16_t)) {
149 return R__FAIL(
"field record frame too short");
151 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldVersion);
152 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, typeVersion);
153 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, parentId);
154 result = RNTupleSerializer::DeserializeFieldStructure(
bytes, structure);
158 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, flags);
161 std::string fieldName;
162 std::string typeName;
163 std::string aliasName;
164 std::string description;
165 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), fieldName).Unwrap();
169 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), typeName).Unwrap();
173 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), aliasName).Unwrap();
177 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), description).Unwrap();
183 if (flags & RNTupleSerializer::kFlagRepetitiveField) {
184 if (fnFrameSizeLeft() <
sizeof(std::uint64_t))
185 return R__FAIL(
"field record frame too short");
186 std::uint64_t nRepetitions;
187 bytes += RNTupleSerializer::DeserializeUInt64(
bytes, nRepetitions);
191 if (flags & RNTupleSerializer::kFlagProjectedField) {
192 if (fnFrameSizeLeft() <
sizeof(std::uint32_t))
193 return R__FAIL(
"field record frame too short");
194 std::uint32_t projectionSourceId;
195 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, projectionSourceId);
199 if (flags & RNTupleSerializer::kFlagHasTypeChecksum) {
200 if (fnFrameSizeLeft() <
sizeof(std::uint32_t))
201 return R__FAIL(
"field record frame too short");
202 std::uint32_t typeChecksum;
203 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, typeChecksum);
216 auto base =
reinterpret_cast<unsigned char *
>(buffer);
218 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
220 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
222 pos += RNTupleSerializer::SerializeColumnType(columnDesc.
GetType(), *where);
223 pos += RNTupleSerializer::SerializeUInt16(columnDesc.
GetBitsOnStorage(), *where);
225 std::uint16_t flags = 0;
227 flags |= RNTupleSerializer::kFlagDeferredColumn;
229 flags |= RNTupleSerializer::kFlagHasValueRange;
232 firstElementIdx = -firstElementIdx;
233 pos += RNTupleSerializer::SerializeUInt16(flags, *where);
235 if (flags & RNTupleSerializer::kFlagDeferredColumn)
236 pos += RNTupleSerializer::SerializeInt64(firstElementIdx, *where);
237 if (flags & RNTupleSerializer::kFlagHasValueRange) {
239 std::uint64_t intMin, intMax;
240 static_assert(
sizeof(min) ==
sizeof(intMin) &&
sizeof(max) ==
sizeof(intMax));
241 memcpy(&intMin, &min,
sizeof(min));
242 memcpy(&intMax, &max,
sizeof(max));
243 pos += RNTupleSerializer::SerializeUInt64(intMin, *where);
244 pos += RNTupleSerializer::SerializeUInt64(intMax, *where);
247 pos += RNTupleSerializer::SerializeFramePostscript(buffer ? base :
nullptr, pos - base);
253 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
257 auto base =
reinterpret_cast<unsigned char *
>(buffer);
259 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
261 for (
auto parentId : fieldList) {
263 if (
c.IsAliasColumn())
266 pos += SerializePhysicalColumn(
c, context, *where);
278 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
280 std::uint64_t frameSize;
281 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
282 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
289 std::uint16_t bitsOnStorage;
290 std::uint32_t fieldId;
292 std::uint16_t representationIndex;
293 std::int64_t firstElementIdx = 0;
294 if (fnFrameSizeLeft() <
295 RNTupleSerializer::SerializeColumnType(
type,
nullptr) +
sizeof(std::uint16_t) + 2 *
sizeof(std::uint32_t)) {
296 return R__FAIL(
"column record frame too short");
302 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, bitsOnStorage);
303 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldId);
304 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, flags);
305 bytes += RNTupleSerializer::DeserializeUInt16(
bytes, representationIndex);
306 if (flags & RNTupleSerializer::kFlagDeferredColumn) {
307 if (fnFrameSizeLeft() <
sizeof(std::uint64_t))
308 return R__FAIL(
"column record frame too short");
309 bytes += RNTupleSerializer::DeserializeInt64(
bytes, firstElementIdx);
311 if (flags & RNTupleSerializer::kFlagHasValueRange) {
312 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint64_t))
313 return R__FAIL(
"field record frame too short");
314 std::uint64_t minInt, maxInt;
315 bytes += RNTupleSerializer::DeserializeUInt64(
bytes, minInt);
316 bytes += RNTupleSerializer::DeserializeUInt64(
bytes, maxInt);
318 memcpy(&min, &minInt,
sizeof(min));
319 memcpy(&max, &maxInt,
sizeof(max));
325 if (firstElementIdx < 0)
333 auto base =
reinterpret_cast<unsigned char *
>(buffer);
335 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
337 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
339 pos += RNTupleSerializer::SerializeExtraTypeInfoId(desc.GetContentId(), *where);
340 pos += RNTupleSerializer::SerializeUInt32(desc.GetTypeVersion(), *where);
341 pos += RNTupleSerializer::SerializeString(desc.GetTypeName(), *where);
342 pos += RNTupleSerializer::SerializeString(desc.GetContent(), *where);
344 auto size = pos - base;
345 RNTupleSerializer::SerializeFramePostscript(base,
size);
352 auto base =
reinterpret_cast<unsigned char *
>(buffer);
354 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
357 pos += SerializeExtraTypeInfo(extraTypeInfoDesc, *where);
368 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
370 std::uint64_t frameSize;
371 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
372 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
377 EExtraTypeInfoIds contentId{EExtraTypeInfoIds::kInvalid};
378 std::uint32_t typeVersion;
379 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint32_t)) {
380 return R__FAIL(
"extra type info record frame too short");
382 result = RNTupleSerializer::DeserializeExtraTypeInfoId(
bytes, contentId);
386 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, typeVersion);
388 std::string typeName;
390 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), typeName).Unwrap();
394 result = RNTupleSerializer::DeserializeString(
bytes, fnFrameSizeLeft(), content).Unwrap();
408 RNTupleSerializer::SerializeUInt64(locator.
GetPosition<std::uint64_t>(), buffer +
sizeof(std::uint64_t));
410 return sizeof(std::uint64_t) +
sizeof(std::uint64_t);
417 RNTupleSerializer::DeserializeUInt64(buffer +
sizeof(std::uint64_t),
data);
423 const uint32_t sizeofBytesOnStorage = (locator.
fBytesOnStorage > std::numeric_limits<std::uint32_t>::max())
424 ?
sizeof(std::uint64_t)
425 :
sizeof(std::uint32_t);
427 if (sizeofBytesOnStorage ==
sizeof(std::uint32_t)) {
432 RNTupleSerializer::SerializeUInt64(
data.fLocation, buffer + sizeofBytesOnStorage);
434 return sizeofBytesOnStorage +
sizeof(std::uint64_t);
437void DeserializeLocatorPayloadObject64(
const unsigned char *buffer, std::uint32_t sizeofLocatorPayload,
443 if (sizeofLocatorPayload == 12) {
444 std::uint32_t bytesOnStorage;
445 RNTupleSerializer::DeserializeUInt32(buffer, bytesOnStorage);
447 RNTupleSerializer::DeserializeUInt64(buffer +
sizeof(std::uint32_t),
data.fLocation);
448 }
else if (sizeofLocatorPayload == 16) {
450 RNTupleSerializer::DeserializeUInt64(buffer +
sizeof(std::uint64_t),
data.fLocation);
452 throw RException(
R__FAIL(
"invalid DAOS locator payload size: " + std::to_string(sizeofLocatorPayload)));
462 auto base =
reinterpret_cast<unsigned char *
>(buffer);
464 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
466 pos += RNTupleSerializer::SerializeRecordFramePreamble(*where);
471 pos += RNTupleSerializer::SerializeFramePostscript(buffer ? base :
nullptr, pos - base);
477 std::span<const ROOT::Experimental::DescriptorId_t> fieldList,
481 auto base =
reinterpret_cast<unsigned char *
>(buffer);
483 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
485 for (
auto parentId : fieldList) {
487 if (!
c.IsAliasColumn())
490 pos += SerializeAliasColumn(
c, context, *where);
498 std::uint32_t &physicalColumnId, std::uint32_t &fieldId)
500 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
502 std::uint64_t frameSize;
503 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
504 auto result = RNTupleSerializer::DeserializeFrameHeader(
bytes, bufSize, frameSize);
509 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint32_t)) {
510 return R__FAIL(
"alias column record frame too short");
513 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, physicalColumnId);
514 bytes += RNTupleSerializer::DeserializeUInt32(
bytes, fieldId);
523 std::uint64_t &xxhash3,
void *buffer)
525 if (buffer !=
nullptr) {
534 std::uint64_t &xxhash3)
536 auto checksumReal = XXH3_64bits(
data,
length);
538 if (xxhash3 != checksumReal)
539 return R__FAIL(
"XxHash-3 checksum mismatch");
546 std::uint64_t xxhash3;
552 if (buffer !=
nullptr) {
553 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
554 bytes[0] = (val & 0x00FF);
555 bytes[1] = (val & 0xFF00) >> 8;
562 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
563 val = std::int16_t(
bytes[0]) + (std::int16_t(
bytes[1]) << 8);
569 return SerializeInt16(val, buffer);
574 return DeserializeInt16(buffer, *
reinterpret_cast<std::int16_t *
>(&val));
579 if (buffer !=
nullptr) {
580 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
581 bytes[0] = (val & 0x000000FF);
582 bytes[1] = (val & 0x0000FF00) >> 8;
583 bytes[2] = (val & 0x00FF0000) >> 16;
584 bytes[3] = (val & 0xFF000000) >> 24;
591 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
592 val = std::int32_t(
bytes[0]) + (std::int32_t(
bytes[1]) << 8) + (std::int32_t(
bytes[2]) << 16) +
593 (std::int32_t(
bytes[3]) << 24);
599 return SerializeInt32(val, buffer);
604 return DeserializeInt32(buffer, *
reinterpret_cast<std::int32_t *
>(&val));
609 if (buffer !=
nullptr) {
610 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
611 bytes[0] = (val & 0x00000000000000FF);
612 bytes[1] = (val & 0x000000000000FF00) >> 8;
613 bytes[2] = (val & 0x0000000000FF0000) >> 16;
614 bytes[3] = (val & 0x00000000FF000000) >> 24;
615 bytes[4] = (val & 0x000000FF00000000) >> 32;
616 bytes[5] = (val & 0x0000FF0000000000) >> 40;
617 bytes[6] = (val & 0x00FF000000000000) >> 48;
618 bytes[7] = (val & 0xFF00000000000000) >> 56;
625 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
626 val = std::int64_t(
bytes[0]) + (std::int64_t(
bytes[1]) << 8) + (std::int64_t(
bytes[2]) << 16) +
627 (std::int64_t(
bytes[3]) << 24) + (std::int64_t(
bytes[4]) << 32) + (std::int64_t(
bytes[5]) << 40) +
628 (std::int64_t(
bytes[6]) << 48) + (std::int64_t(
bytes[7]) << 56);
634 return SerializeInt64(val, buffer);
639 return DeserializeInt64(buffer, *
reinterpret_cast<std::int64_t *
>(&val));
645 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
646 pos += SerializeUInt32(val.length(), pos);
647 memcpy(pos, val.data(), val.length());
649 return sizeof(std::uint32_t) + val.length();
653 std::uint64_t bufSize,
656 if (bufSize <
sizeof(std::uint32_t))
657 return R__FAIL(
"string buffer too short");
658 bufSize -=
sizeof(std::uint32_t);
660 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
665 return R__FAIL(
"string buffer too short");
669 return sizeof(std::uint32_t) +
length;
708 if (
type == kTestFutureType)
709 return SerializeUInt16(0x99, buffer);
719 std::uint16_t onDiskType;
720 auto result = DeserializeUInt16(buffer, onDiskType);
722 switch (onDiskType) {
774 return SerializeUInt16(0x99, buffer);
783 std::uint16_t onDiskValue;
784 auto result = DeserializeUInt16(buffer, onDiskValue);
785 switch (onDiskValue) {
813 std::uint32_t onDiskValue;
814 auto result = DeserializeUInt32(buffer, onDiskValue);
815 switch (onDiskValue) {
827 auto base =
reinterpret_cast<unsigned char *
>(buffer);
829 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
831 pos += SerializeUInt64(envelopeType, *where);
838 std::uint64_t &xxhash3)
840 if (
size <
sizeof(std::uint64_t))
842 if (
size >=
static_cast<uint64_t
>(1) << 48)
845 std::uint64_t typeAndSize;
846 DeserializeUInt64(envelope, typeAndSize);
847 typeAndSize |= (
size + 8) << 16;
848 SerializeUInt64(typeAndSize, envelope);
850 return SerializeXxHash3(envelope,
size, xxhash3, envelope ? (envelope +
size) :
nullptr);
856 std::uint64_t xxhash3;
857 return SerializeEnvelopePostscript(envelope,
size, xxhash3);
862 std::uint16_t expectedType, std::uint64_t &xxhash3)
864 const std::uint64_t minEnvelopeSize =
sizeof(std::uint64_t) +
sizeof(std::uint64_t);
865 if (bufSize < minEnvelopeSize)
866 return R__FAIL(
"invalid envelope buffer, too short");
868 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
871 std::uint64_t typeAndSize;
872 bytes += DeserializeUInt64(
bytes, typeAndSize);
874 std::uint16_t envelopeType = typeAndSize & 0xFFFF;
875 if (envelopeType != expectedType) {
876 return R__FAIL(
"envelope type mismatch: expected " + std::to_string(expectedType) +
", found " +
877 std::to_string(envelopeType));
880 std::uint64_t envelopeSize = typeAndSize >> 16;
881 if (bufSize < envelopeSize)
882 return R__FAIL(
"envelope buffer size too small");
883 if (envelopeSize < minEnvelopeSize)
884 return R__FAIL(
"invalid envelope, too short");
886 auto result = VerifyXxHash3(base, envelopeSize - 8, xxhash3);
890 return sizeof(typeAndSize);
894 std::uint64_t bufSize,
895 std::uint16_t expectedType)
897 std::uint64_t xxhash3;
898 return R__FORWARD_RESULT(DeserializeEnvelope(buffer, bufSize, expectedType, xxhash3));
904 return SerializeInt64(1, buffer);
910 auto base =
reinterpret_cast<unsigned char *
>(buffer);
912 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
915 pos += SerializeInt64(-1, *where);
916 pos += SerializeUInt32(
nitems, *where);
922 auto preambleSize =
sizeof(std::int64_t);
923 if (
size < preambleSize)
927 DeserializeInt64(frame, marker);
928 if ((marker < 0) && (
size < (
sizeof(std::uint32_t) + preambleSize)))
930 SerializeInt64(marker *
static_cast<int64_t
>(
size), frame);
937 std::uint64_t &frameSize, std::uint32_t &
nitems)
939 std::uint64_t minSize =
sizeof(std::int64_t);
940 if (bufSize < minSize)
941 return R__FAIL(
"frame too short");
943 std::int64_t *ssize =
reinterpret_cast<std::int64_t *
>(&frameSize);
944 DeserializeInt64(buffer, *ssize);
946 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
954 minSize +=
sizeof(std::uint32_t);
955 if (bufSize < minSize)
956 return R__FAIL(
"frame too short");
961 if (frameSize < minSize)
962 return R__FAIL(
"corrupt frame size");
963 if (bufSize < frameSize)
964 return R__FAIL(
"frame too short");
966 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
971 std::uint64_t &frameSize)
982 return SerializeUInt64(0, buffer);
985 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
987 for (
unsigned i = 0; i < flags.size(); ++i) {
988 if (flags[i] & 0x8000000000000000)
992 if (i == (flags.size() - 1))
993 SerializeUInt64(flags[i],
bytes);
995 bytes += SerializeUInt64(flags[i] | 0x8000000000000000,
bytes);
998 return (flags.size() *
sizeof(std::int64_t));
1003 std::vector<std::uint64_t> &flags)
1005 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1010 if (bufSize <
sizeof(std::uint64_t))
1011 return R__FAIL(
"feature flag buffer too short");
1013 bufSize -=
sizeof(std::uint64_t);
1014 flags.emplace_back(
f & ~0x8000000000000000);
1015 }
while (
f & 0x8000000000000000);
1017 return (flags.size() *
sizeof(std::uint64_t));
1026 std::uint32_t
size = 0;
1028 (locator.
fBytesOnStorage <= std::numeric_limits<std::int32_t>::max())) {
1031 buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
size :
nullptr);
1035 std::uint8_t locatorType = 0;
1036 auto payloadp = buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
sizeof(std::int32_t) :
nullptr;
1037 switch (locator.
fType) {
1039 size += SerializeLocatorPayloadLarge(locator, payloadp);
1043 size += SerializeLocatorPayloadObject64(locator, payloadp);
1049 size += SerializeLocatorPayloadObject64(locator, payloadp);
1055 std::int32_t head =
sizeof(std::int32_t) +
size;
1057 head |=
static_cast<int>(locatorType & 0x7F) << 24;
1064 std::uint64_t bufSize,
1067 if (bufSize <
sizeof(std::int32_t))
1068 return R__FAIL(
"too short locator");
1070 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1074 bufSize -=
sizeof(std::int32_t);
1077 const int type = head >> 24;
1078 const std::uint32_t payloadSize = (
static_cast<std::uint32_t
>(head) & 0x0000FFFF) -
sizeof(std::int32_t);
1079 if (bufSize < payloadSize)
1080 return R__FAIL(
"too short locator");
1082 locator.
fReserved =
static_cast<std::uint32_t
>(head >> 16) & 0xFF;
1086 DeserializeLocatorPayloadLarge(
bytes, locator);
1090 DeserializeLocatorPayloadObject64(
bytes, payloadSize, locator);
1094 bytes += payloadSize;
1096 if (bufSize <
sizeof(std::uint64_t))
1097 return R__FAIL(
"too short locator");
1104 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
1110 auto size = SerializeUInt64(envelopeLink.
fLength, buffer);
1111 size += SerializeLocator(envelopeLink.
fLocator, buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
size :
nullptr);
1119 if (bufSize <
sizeof(std::int64_t))
1120 return R__FAIL(
"too short envelope link");
1122 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1124 bufSize -=
sizeof(std::uint64_t);
1129 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
1136 if (clusterSummary.
fNEntries >= (
static_cast<std::uint64_t
>(1) << 56)) {
1137 throw RException(
R__FAIL(
"number of entries in cluster exceeds maximum of 2^56"));
1140 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1142 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1145 pos += SerializeRecordFramePreamble(*where);
1146 pos += SerializeUInt64(clusterSummary.
fFirstEntry, *where);
1147 const std::uint64_t nEntriesAndFlags =
1148 (
static_cast<std::uint64_t
>(clusterSummary.
fFlags) << 56) | clusterSummary.
fNEntries;
1149 pos += SerializeUInt64(nEntriesAndFlags, *where);
1151 auto size = pos - frame;
1152 pos += SerializeFramePostscript(frame,
size);
1160 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1162 std::uint64_t frameSize;
1163 auto result = DeserializeFrameHeader(
bytes, bufSize, frameSize);
1168 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
1169 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint64_t))
1170 return R__FAIL(
"too short cluster summary");
1173 std::uint64_t nEntriesAndFlags;
1174 bytes += DeserializeUInt64(
bytes, nEntriesAndFlags);
1176 const std::uint64_t nEntries = (nEntriesAndFlags << 8) >> 8;
1177 const std::uint8_t flags = nEntriesAndFlags >> 56;
1180 return R__FAIL(
"sharded cluster flag set in cluster summary; sharded clusters are currently unsupported.");
1184 clusterSummary.
fFlags = flags;
1192 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1194 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1197 pos += SerializeRecordFramePreamble(*where);
1198 pos += SerializeUInt64(clusterGroup.
fMinEntry, *where);
1199 pos += SerializeUInt64(clusterGroup.
fEntrySpan, *where);
1200 pos += SerializeUInt32(clusterGroup.
fNClusters, *where);
1202 auto size = pos - frame;
1203 pos += SerializeFramePostscript(frame,
size);
1211 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1214 std::uint64_t frameSize;
1215 auto result = DeserializeFrameHeader(
bytes, bufSize, frameSize);
1220 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
1221 if (fnFrameSizeLeft() <
sizeof(std::uint32_t) + 2 *
sizeof(std::uint64_t))
1222 return R__FAIL(
"too short cluster group");
1235 bool forHeaderExtension)
1238 auto depthFirstTraversal = [&](std::span<DescriptorId_t> fieldTrees,
auto doForEachField) {
1239 std::deque<DescriptorId_t> idQueue{fieldTrees.begin(), fieldTrees.end()};
1240 while (!idQueue.empty()) {
1241 auto fieldId = idQueue.front();
1242 idQueue.pop_front();
1244 if (fieldId != fieldZeroId)
1245 doForEachField(fieldId);
1248 idQueue.insert(idQueue.begin() + i++,
f.GetId());
1253 if (!forHeaderExtension)
1254 R__ASSERT(GetHeaderExtensionOffset() == -1U);
1256 std::vector<DescriptorId_t> fieldTrees;
1257 if (!forHeaderExtension) {
1258 fieldTrees.emplace_back(fieldZeroId);
1260 fieldTrees = xHeader->GetTopLevelFields(desc);
1262 depthFirstTraversal(fieldTrees, [&](
DescriptorId_t fieldId) { MapFieldId(fieldId); });
1265 if (!
c.IsAliasColumn()) {
1266 MapPhysicalColumnId(
c.GetPhysicalId());
1271 if (forHeaderExtension) {
1276 if (!columnDesc.IsAliasColumn()) {
1277 MapPhysicalColumnId(columnDesc.GetPhysicalId());
1282 BeginHeaderExtension();
1289 bool forHeaderExtension)
1291 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1293 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1295 std::size_t nFields = 0, nColumns = 0, nAliasColumns = 0, fieldListOffset = 0;
1297 std::vector<std::reference_wrapper<const RColumnDescriptor>> extraColumns;
1298 if (forHeaderExtension) {
1302 nFields = xHeader->GetNFields();
1303 nColumns = xHeader->GetNPhysicalColumns();
1304 nAliasColumns = xHeader->GetNLogicalColumns() - xHeader->GetNPhysicalColumns();
1307 extraColumns.reserve(xHeader->GetExtendedColumnRepresentations().size());
1308 for (
auto columnId : xHeader->GetExtendedColumnRepresentations()) {
1319 R__ASSERT(onDiskFields.size() >= fieldListOffset);
1320 std::span<const DescriptorId_t> fieldList{onDiskFields.data() + fieldListOffset,
1321 onDiskFields.size() - fieldListOffset};
1324 pos += SerializeListFramePreamble(nFields, *where);
1325 pos += SerializeFieldList(desc, fieldList, fieldListOffset, context, *where);
1326 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1329 pos += SerializeListFramePreamble(nColumns, *where);
1330 pos += SerializeColumnsOfFields(desc, fieldList, context, *where);
1331 for (
const auto &
c : extraColumns) {
1332 if (!
c.get().IsAliasColumn()) {
1333 pos += SerializePhysicalColumn(
c.get(), context, *where);
1336 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1339 pos += SerializeListFramePreamble(nAliasColumns, *where);
1340 pos += SerializeAliasColumnsOfFields(desc, fieldList, context, *where);
1341 for (
const auto &
c : extraColumns) {
1342 if (
c.get().IsAliasColumn()) {
1343 pos += SerializeAliasColumn(
c.get(), context, *where);
1346 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1349 pos += SerializeListFramePreamble(nExtraTypeInfos, *where);
1350 pos += SerializeExtraTypeInfoList(desc, *where);
1351 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1353 return static_cast<std::uint32_t
>(pos - base);
1360 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1362 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1365 std::uint64_t frameSize;
1367 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1369 std::uint32_t nFields;
1370 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nFields);
1376 for (
unsigned i = 0; i < nFields; ++i) {
1377 std::uint32_t fieldId = fieldIdRangeBegin + i;
1379 result = DeserializeField(
bytes, fnFrameSizeLeft(), fieldBuilder);
1384 fieldBuilder.
ParentId(kZeroFieldId);
1388 const auto parentId = fieldDesc.Inspect().GetParentId();
1389 const auto projectionSourceId = fieldDesc.Inspect().GetProjectionSourceId();
1390 descBuilder.
AddField(fieldDesc.Unwrap());
1391 auto resVoid = descBuilder.
AddFieldLink(parentId, fieldId);
1400 bytes = frame + frameSize;
1404 auto fnNextColumnIndex = [&descBuilder](
DescriptorId_t fieldId, std::uint16_t representationIndex) -> std::uint32_t {
1406 if (existingColumns.empty())
1409 return (representationIndex == lastColumnDesc.GetRepresentationIndex()) ? (lastColumnDesc.GetIndex() + 1) : 0;
1412 std::uint32_t nColumns;
1414 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nColumns);
1423 for (
unsigned i = 0; i < nColumns; ++i) {
1424 std::uint32_t columnId = columnIdRangeBegin + i;
1426 result = DeserializeColumn(
bytes, fnFrameSizeLeft(), columnBuilder);
1437 auto resVoid = descBuilder.
AddColumn(columnDesc.Unwrap());
1441 bytes = frame + frameSize;
1443 std::uint32_t nAliasColumns;
1445 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nAliasColumns);
1450 for (
unsigned i = 0; i < nAliasColumns; ++i) {
1451 std::uint32_t physicalId;
1452 std::uint32_t fieldId;
1453 result = DeserializeAliasColumn(
bytes, fnFrameSizeLeft(), physicalId, fieldId);
1461 columnBuilder.
BitsOnStorage(physicalColumnDesc.GetBitsOnStorage());
1462 columnBuilder.
ValueRange(physicalColumnDesc.GetValueRange());
1463 columnBuilder.
Type(physicalColumnDesc.GetType());
1468 if (!aliasColumnDesc)
1470 auto resVoid = descBuilder.
AddColumn(aliasColumnDesc.Unwrap());
1474 bytes = frame + frameSize;
1476 std::uint32_t nExtraTypeInfos;
1478 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nExtraTypeInfos);
1482 for (
unsigned i = 0; i < nExtraTypeInfos; ++i) {
1484 result = DeserializeExtraTypeInfo(
bytes, fnFrameSizeLeft(), extraTypeInfoBuilder);
1491 if (extraTypeInfoDesc)
1494 bytes = frame + frameSize;
1496 return bytes - base;
1505 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1507 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1509 pos += SerializeEnvelopePreamble(kEnvelopeTypeHeader, *where);
1512 pos += SerializeString(desc.
GetName(), *where);
1514 pos += SerializeString(std::string(
"ROOT v") +
ROOT_RELEASE, *where);
1517 pos += SerializeSchemaDescription(*where, desc, context);
1519 std::uint64_t
size = pos - base;
1520 std::uint64_t xxhash3 = 0;
1521 size += SerializeEnvelopePostscript(base,
size, xxhash3);
1530 std::span<DescriptorId_t> physClusterIDs,
1533 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1535 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1537 pos += SerializeEnvelopePreamble(kEnvelopeTypePageList, *where);
1542 const auto nClusters = physClusterIDs.size();
1543 auto clusterSummaryFrame = pos;
1544 pos += SerializeListFramePreamble(nClusters, *where);
1545 for (
auto clusterId : physClusterIDs) {
1547 RClusterSummary summary{clusterDesc.GetFirstEntryIndex(), clusterDesc.GetNEntries(), 0};
1548 pos += SerializeClusterSummary(summary, *where);
1550 pos += SerializeFramePostscript(buffer ? clusterSummaryFrame :
nullptr, pos - clusterSummaryFrame);
1553 auto topMostFrame = pos;
1554 pos += SerializeListFramePreamble(nClusters, *where);
1556 for (
auto clusterId : physClusterIDs) {
1559 std::set<DescriptorId_t> onDiskColumnIds;
1560 for (
const auto &columnRange : clusterDesc.GetColumnRangeIterable())
1561 onDiskColumnIds.insert(context.
GetOnDiskColumnId(columnRange.fPhysicalColumnId));
1563 auto outerFrame = pos;
1564 pos += SerializeListFramePreamble(onDiskColumnIds.size(), *where);
1565 for (
auto onDiskId : onDiskColumnIds) {
1567 const auto &columnRange = clusterDesc.GetColumnRange(memId);
1569 auto innerFrame = pos;
1570 if (columnRange.fIsSuppressed) {
1572 pos += SerializeListFramePreamble(0, *where);
1573 pos += SerializeInt64(kSuppressedColumnMarker, *where);
1575 const auto &pageRange = clusterDesc.GetPageRange(memId);
1576 pos += SerializeListFramePreamble(pageRange.fPageInfos.size(), *where);
1578 for (
const auto &pi : pageRange.fPageInfos) {
1579 std::int32_t nElements = pi.fHasChecksum ? -
static_cast<std::int32_t
>(pi.fNElements) : pi.fNElements;
1580 pos += SerializeUInt32(nElements, *where);
1581 pos += SerializeLocator(pi.fLocator, *where);
1583 pos += SerializeInt64(columnRange.fFirstElementIndex, *where);
1584 pos += SerializeUInt32(columnRange.fCompressionSettings, *where);
1587 pos += SerializeFramePostscript(buffer ? innerFrame :
nullptr, pos - innerFrame);
1589 pos += SerializeFramePostscript(buffer ? outerFrame :
nullptr, pos - outerFrame);
1592 pos += SerializeFramePostscript(buffer ? topMostFrame :
nullptr, pos - topMostFrame);
1593 std::uint64_t
size = pos - base;
1594 size += SerializeEnvelopePostscript(base,
size);
1603 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1605 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1607 pos += SerializeEnvelopePreamble(kEnvelopeTypeFooter, *where);
1610 pos += SerializeFeatureFlags(std::vector<std::uint64_t>(), *where);
1615 pos += SerializeRecordFramePreamble(*where);
1616 pos += SerializeSchemaDescription(*where, desc, context,
true);
1617 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1622 pos += SerializeListFramePreamble(nClusterGroups, *where);
1623 for (
unsigned int i = 0; i < nClusterGroups; ++i) {
1626 clusterGroup.
fMinEntry = cgDesc.GetMinEntry();
1627 clusterGroup.
fEntrySpan = cgDesc.GetEntrySpan();
1628 clusterGroup.
fNClusters = cgDesc.GetNClusters();
1631 pos += SerializeClusterGroup(clusterGroup, *where);
1633 pos += SerializeFramePostscript(buffer ? frame :
nullptr, pos - frame);
1635 std::uint32_t
size = pos - base;
1636 size += SerializeEnvelopePostscript(base,
size);
1644 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1646 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1649 std::uint64_t xxhash3{0};
1650 result = DeserializeEnvelope(
bytes, fnBufSizeLeft(), kEnvelopeTypeHeader, xxhash3);
1656 std::vector<std::uint64_t> featureFlags;
1657 result = DeserializeFeatureFlags(
bytes, fnBufSizeLeft(), featureFlags);
1661 for (std::size_t i = 0; i < featureFlags.size(); ++i) {
1662 if (!featureFlags[i])
1664 unsigned int bit = 0;
1665 while (!(featureFlags[i] & (
static_cast<uint64_t
>(1) << bit)))
1667 return R__FAIL(
"unsupported format feature: " + std::to_string(i * 64 + bit));
1671 std::string description;
1677 result = DeserializeString(
bytes, fnBufSizeLeft(), description);
1690 result = DeserializeSchemaDescription(
bytes, fnBufSizeLeft(), descBuilder);
1701 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1703 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1706 result = DeserializeEnvelope(
bytes, fnBufSizeLeft(), kEnvelopeTypeFooter);
1711 std::vector<std::uint64_t> featureFlags;
1712 result = DeserializeFeatureFlags(
bytes, fnBufSizeLeft(), featureFlags);
1716 for (
auto f : featureFlags) {
1721 std::uint64_t xxhash3{0};
1722 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint64_t)))
1723 return R__FAIL(
"footer too short");
1726 return R__FAIL(
"XxHash-3 mismatch between header and footer");
1728 std::uint64_t frameSize;
1730 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1732 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize);
1736 if (fnFrameSizeLeft() > 0) {
1738 result = DeserializeSchemaDescription(
bytes, fnFrameSizeLeft(), descBuilder);
1742 bytes = frame + frameSize;
1744 std::uint32_t nClusterGroups;
1746 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), frameSize, nClusterGroups);
1750 for (std::uint32_t groupId = 0; groupId < nClusterGroups; ++groupId) {
1752 result = DeserializeClusterGroup(
bytes, fnFrameSizeLeft(), clusterGroup);
1767 bytes = frame + frameSize;
1777 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1779 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1782 result = DeserializeEnvelope(
bytes, fnBufSizeLeft(), kEnvelopeTypePageList);
1787 std::uint64_t xxhash3{0};
1788 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint64_t)))
1789 return R__FAIL(
"page list too short");
1792 return R__FAIL(
"XxHash-3 mismatch between header and page list");
1794 std::vector<RClusterDescriptorBuilder> clusterBuilders;
1800 std::uint64_t clusterSummaryFrameSize;
1801 auto clusterSummaryFrame =
bytes;
1802 auto fnClusterSummaryFrameSizeLeft = [&]() {
return clusterSummaryFrameSize - (
bytes - clusterSummaryFrame); };
1804 std::uint32_t nClusterSummaries;
1805 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), clusterSummaryFrameSize, nClusterSummaries);
1809 for (
auto clusterId = firstClusterId; clusterId < firstClusterId + nClusterSummaries; ++clusterId) {
1811 result = DeserializeClusterSummary(
bytes, fnClusterSummaryFrameSizeLeft(), clusterSummary);
1818 clusterBuilders.emplace_back(std::move(builder));
1820 bytes = clusterSummaryFrame + clusterSummaryFrameSize;
1822 std::uint64_t topMostFrameSize;
1823 auto topMostFrame =
bytes;
1824 auto fnTopMostFrameSizeLeft = [&]() {
return topMostFrameSize - (
bytes - topMostFrame); };
1826 std::uint32_t nClusters;
1827 result = DeserializeFrameHeader(
bytes, fnBufSizeLeft(), topMostFrameSize, nClusters);
1832 if (nClusters != nClusterSummaries)
1833 return R__FAIL(
"mismatch between number of clusters and number of cluster summaries");
1835 std::vector<RClusterDescriptor> clusters;
1836 for (std::uint32_t i = 0; i < nClusters; ++i) {
1837 std::uint64_t outerFrameSize;
1838 auto outerFrame =
bytes;
1839 auto fnOuterFrameSizeLeft = [&]() {
return outerFrameSize - (
bytes - outerFrame); };
1841 std::uint32_t nColumns;
1842 result = DeserializeFrameHeader(
bytes, fnTopMostFrameSizeLeft(), outerFrameSize, nColumns);
1847 for (std::uint32_t j = 0; j < nColumns; ++j) {
1848 std::uint64_t innerFrameSize;
1849 auto innerFrame =
bytes;
1850 auto fnInnerFrameSizeLeft = [&]() {
return innerFrameSize - (
bytes - innerFrame); };
1852 std::uint32_t nPages;
1853 result = DeserializeFrameHeader(
bytes, fnOuterFrameSizeLeft(), innerFrameSize, nPages);
1860 for (std::uint32_t k = 0; k < nPages; ++k) {
1861 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
1862 return R__FAIL(
"inner frame too short");
1863 std::int32_t nElements;
1864 bool hasChecksum =
false;
1867 if (nElements < 0) {
1868 nElements = -nElements;
1871 result = DeserializeLocator(
bytes, fnInnerFrameSizeLeft(), locator);
1874 pageRange.
fPageInfos.push_back({
static_cast<std::uint32_t
>(nElements), locator, hasChecksum});
1878 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::int64_t)))
1879 return R__FAIL(
"page list frame too short");
1880 std::int64_t columnOffset;
1881 bytes += DeserializeInt64(
bytes, columnOffset);
1882 if (columnOffset < 0) {
1884 return R__FAIL(
"unexpected non-empty page list");
1885 clusterBuilders[i].MarkSuppressedColumnRange(j);
1887 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
1888 return R__FAIL(
"page list frame too short");
1889 std::uint32_t compressionSettings;
1890 bytes += DeserializeUInt32(
bytes, compressionSettings);
1891 clusterBuilders[i].CommitColumnRange(j, columnOffset, compressionSettings, pageRange);
1894 bytes = innerFrame + innerFrameSize;
1897 bytes = outerFrame + outerFrameSize;
1899 auto voidRes = clusterBuilders[i].CommitSuppressedColumnRanges(desc);
1902 clusterBuilders[i].AddExtendedColumnRanges(desc);
1903 clusters.emplace_back(clusterBuilders[i].MoveDescriptor().Unwrap());
1912 TList streamerInfos;
1913 for (
auto si : infos) {
1914 assert(si.first == si.second->GetNumber());
1915 streamerInfos.
Add(si.second);
1919 assert(buffer.
Length() > 0);
1933 TObjLink *lnk = infoList->FirstLink();
1937 infoMap[info->GetNumber()] = info->GetClass()->GetStreamerInfo();
1938 assert(info->GetNumber() == infoMap[info->GetNumber()]->GetNumber());
#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(...)
#define R__LOG_DEBUG(DEBUGLEVEL,...)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void 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
The available trivial, native content types of a column.
A helper class for piece-wise construction of an RClusterDescriptor.
RClusterDescriptorBuilder & ClusterId(DescriptorId_t clusterId)
RClusterDescriptorBuilder & NEntries(std::uint64_t nEntries)
RClusterDescriptorBuilder & FirstEntryIndex(std::uint64_t firstEntryIndex)
A helper class for piece-wise construction of an RClusterGroupDescriptor.
RClusterGroupDescriptorBuilder & PageListLocator(const RNTupleLocator &pageListLocator)
RClusterGroupDescriptorBuilder & MinEntry(std::uint64_t minEntry)
RClusterGroupDescriptorBuilder & ClusterGroupId(DescriptorId_t clusterGroupId)
RClusterGroupDescriptorBuilder & EntrySpan(std::uint64_t entrySpan)
RClusterGroupDescriptorBuilder & NClusters(std::uint32_t nClusters)
RClusterGroupDescriptorBuilder & PageListLength(std::uint64_t pageListLength)
RResult< RClusterGroupDescriptor > MoveDescriptor()
A helper class for piece-wise construction of an RColumnDescriptor.
RColumnDescriptorBuilder & PhysicalColumnId(DescriptorId_t physicalColumnId)
RColumnDescriptorBuilder & Type(EColumnType type)
DescriptorId_t GetRepresentationIndex() const
RColumnDescriptorBuilder & SetSuppressedDeferred()
RColumnDescriptorBuilder & BitsOnStorage(std::uint16_t bitsOnStorage)
RColumnDescriptorBuilder & RepresentationIndex(std::uint16_t representationIndex)
RColumnDescriptorBuilder & FieldId(DescriptorId_t fieldId)
RColumnDescriptorBuilder & Index(std::uint32_t index)
RColumnDescriptorBuilder & FirstElementIndex(std::uint64_t firstElementIdx)
RResult< RColumnDescriptor > MakeDescriptor() const
Attempt to make a column descriptor.
DescriptorId_t GetFieldId() const
RColumnDescriptorBuilder & LogicalColumnId(DescriptorId_t logicalColumnId)
RColumnDescriptorBuilder & ValueRange(double min, double max)
A helper class for piece-wise construction of an RFieldDescriptor.
DescriptorId_t GetParentId() const
RFieldDescriptorBuilder & TypeVersion(std::uint32_t typeVersion)
RFieldDescriptorBuilder & NRepetitions(std::uint64_t nRepetitions)
RFieldDescriptorBuilder & ProjectionSourceId(DescriptorId_t id)
RFieldDescriptorBuilder & FieldVersion(std::uint32_t fieldVersion)
RFieldDescriptorBuilder & Structure(const ENTupleStructure &structure)
RFieldDescriptorBuilder & TypeName(const std::string &typeName)
RResult< RFieldDescriptor > MakeDescriptor() const
Attempt to make a field descriptor.
RFieldDescriptorBuilder & FieldName(const std::string &fieldName)
RFieldDescriptorBuilder & ParentId(DescriptorId_t id)
RFieldDescriptorBuilder & TypeChecksum(const std::optional< std::uint32_t > typeChecksum)
RFieldDescriptorBuilder & TypeAlias(const std::string &typeAlias)
RFieldDescriptorBuilder & FieldId(DescriptorId_t fieldId)
RFieldDescriptorBuilder & FieldDescription(const std::string &fieldDescription)
A helper class for piece-wise construction of an RNTupleDescriptor.
RResult< void > AddFieldProjection(DescriptorId_t sourceId, DescriptorId_t targetId)
void BeginHeaderExtension()
Mark the beginning of the header extension; any fields and columns added after a call to this functio...
void ShiftAliasColumns(std::uint32_t offset)
If the descriptor is constructed in pieces consisting of physical and alias columns (regular and proj...
RResult< void > AddFieldLink(DescriptorId_t fieldId, DescriptorId_t linkId)
void AddToOnDiskFooterSize(std::uint64_t size)
The real footer size also include the page list envelopes.
void SetNTuple(const std::string_view name, const std::string_view description)
RResult< void > AddClusterGroup(RClusterGroupDescriptor &&clusterGroup)
const RNTupleDescriptor & GetDescriptor() const
void AddField(const RFieldDescriptor &fieldDesc)
RResult< void > AddColumn(RColumnDescriptor &&columnDesc)
RResult< void > AddExtraTypeInfo(RExtraTypeInfoDescriptor &&extraTypeInfoDesc)
void SetOnDiskHeaderXxHash3(std::uint64_t xxhash3)
The serialization context is used for the piecewise serialization of a descriptor.
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,...
DescriptorId_t GetOnDiskFieldId(DescriptorId_t memId) const
DescriptorId_t GetMemColumnId(DescriptorId_t onDiskId) const
std::uint64_t GetHeaderXxHash3() const
void SetHeaderXxHash3(std::uint64_t xxhash3)
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 SetHeaderSize(std::uint64_t size)
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 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 RResult< std::uint32_t > DeserializeClusterSummary(const void *buffer, std::uint64_t bufSize, RClusterSummary &clusterSummary)
static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer)
static RResult< std::uint32_t > DeserializeClusterGroup(const void *buffer, std::uint64_t bufSize, RClusterGroup &clusterGroup)
static std::uint32_t SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size)
static std::uint32_t SerializeColumnType(ROOT::Experimental::EColumnType type, void *buffer)
static RContext SerializeHeader(void *buffer, const RNTupleDescriptor &desc)
static RResult< std::uint32_t > DeserializeColumnType(const void *buffer, ROOT::Experimental::EColumnType &type)
static std::uint32_t SerializeFeatureFlags(const std::vector< std::uint64_t > &flags, void *buffer)
static RResult< std::uint32_t > DeserializeExtraTypeInfoId(const void *buffer, ROOT::Experimental::EExtraTypeInfoIds &id)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static RResult< void > DeserializeHeader(const void *buffer, std::uint64_t bufSize, RNTupleDescriptorBuilder &descBuilder)
static RResult< void > DeserializeFooter(const void *buffer, std::uint64_t bufSize, RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos)
static RResult< std::uint32_t > DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems)
static std::uint32_t SerializePageList(void *buffer, const RNTupleDescriptor &desc, std::span< DescriptorId_t > physClusterIDs, const RContext &context)
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 SerializeEnvelopePreamble(std::uint16_t envelopeType, void *buffer)
static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val)
static RResult< std::uint32_t > DeserializeFieldStructure(const void *buffer, ROOT::Experimental::ENTupleStructure &structure)
static std::uint32_t SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer)
static RResult< StreamerInfoMap_t > DeserializeStreamerInfos(const std::string &extraTypeInfoContent)
static std::uint32_t SerializeFramePostscript(void *frame, std::uint64_t size)
static std::uint32_t SerializeInt16(std::int16_t val, void *buffer)
static RResult< void > DeserializePageList(const void *buffer, std::uint64_t bufSize, DescriptorId_t clusterGroupId, RNTupleDescriptor &desc)
static std::uint32_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 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 > DeserializeSchemaDescription(const void *buffer, std::uint64_t bufSize, RNTupleDescriptorBuilder &descBuilder)
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
static std::uint32_t SerializeLocator(const RNTupleLocator &locator, void *buffer)
static std::uint32_t SerializeInt32(std::int32_t val, void *buffer)
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 std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static RResult< std::uint32_t > DeserializeFeatureFlags(const void *buffer, std::uint64_t bufSize, std::vector< std::uint64_t > &flags)
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 std::uint32_t SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer)
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val)
static std::uint32_t SerializeRecordFramePreamble(void *buffer)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static std::uint32_t SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer)
static RResult< std::uint32_t > DeserializeEnvelopeLink(const void *buffer, std::uint64_t bufSize, REnvelopeLink &envelopeLink)
static std::uint32_t SerializeFooter(void *buffer, const RNTupleDescriptor &desc, const RContext &context)
static std::uint32_t SerializeInt64(std::int64_t val, void *buffer)
static RResult< std::uint32_t > DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType)
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< std::uint32_t > DeserializeLocator(const void *buffer, std::uint64_t bufSize, RNTupleLocator &locator)
static std::uint32_t SerializeExtraTypeInfoId(ROOT::Experimental::EExtraTypeInfoIds id, void *buffer)
std::uint32_t GetNClusters() const
Meta-data stored for every column of an ntuple.
bool IsSuppressedDeferredColumn() const
bool IsDeferredColumn() const
EColumnType GetType() const
std::uint16_t GetBitsOnStorage() const
std::uint64_t GetFirstElementIndex() const
DescriptorId_t GetFieldId() const
std::optional< RValueRange > GetValueRange() const
std::uint16_t GetRepresentationIndex() const
bool IsAliasColumn() const
DescriptorId_t GetPhysicalId() const
Base class for all ROOT issued exceptions.
Meta-data stored for every field of an ntuple.
const std::string & GetFieldName() const
const std::string & GetTypeName() const
const std::string & GetFieldDescription() const
std::uint32_t GetTypeVersion() const
const std::vector< DescriptorId_t > & GetLogicalColumnIds() const
const std::string & GetTypeAlias() const
std::uint32_t GetFieldVersion() const
bool IsProjectedField() const
std::uint64_t GetNRepetitions() const
ENTupleStructure GetStructure() const
std::optional< std::uint32_t > GetTypeChecksum() const
The on-storage meta-data of an ntuple.
std::size_t GetNLogicalColumns() const
const std::string & GetName() const
std::uint64_t GetOnDiskHeaderXxHash3() const
RColumnDescriptorIterable GetColumnIterable() const
const RClusterDescriptor & GetClusterDescriptor(DescriptorId_t clusterId) const
std::size_t GetNExtraTypeInfos() const
DescriptorId_t GetFieldZeroId() const
Returns the logical parent of all top-level NTuple data fields.
std::size_t GetNFields() const
RResult< void > AddClusterGroupDetails(DescriptorId_t clusterGroupId, std::vector< RClusterDescriptor > &clusterDescs)
Methods to load and drop cluster group details (cluster IDs and page locations)
const RColumnDescriptor & GetColumnDescriptor(DescriptorId_t columnId) const
RExtraTypeInfoDescriptorIterable GetExtraTypeInfoIterable() 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 std::string & GetDescription() const
const RHeaderExtension * GetHeaderExtension() const
Return header extension information; if the descriptor does not have a header extension,...
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
std::vector< std::uint64_t > GetFeatureFlags() const
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket.
TObject * ReadObject(const TClass *cl) override
Read object from I/O buffer.
void WriteObject(const TObject *obj, Bool_t cacheReuse=kTRUE) override
Write object to I/O buffer.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
void Add(TObject *obj) override
Wrapper around a TObject so it can be stored in a TList.
TObject * GetObject() const
Describes a persistent version of a class.
void BuildCheck(TFile *file=nullptr, Bool_t load=kTRUE) override
Check if built and consistent with the class dictionary.
constexpr RNTupleLocator::ELocatorType kTestLocatorType
constexpr ENTupleStructure kTestFutureFieldStructure
RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
EExtraTypeInfoIds
Used in RExtraTypeInfoDescriptor.
ENTupleStructure
The fields in the ntuple model tree can carry different structural information about the type system.
constexpr DescriptorId_t kInvalidDescriptorId
REnvelopeLink fPageListEnvelopeLink
std::uint64_t fFirstEntry
RNTupleLocator payload that is common for object stores using 64bit location information.
Generic information about the physical location of data.
std::uint64_t fBytesOnStorage
std::uint8_t fReserved
Reserved for use by concrete storage backends.
ELocatorType fType
For non-disk locators, the value for the Type field.
std::variant< std::uint64_t, RNTupleLocatorObject64 > fPosition
Simple on-disk locators consisting of a 64-bit offset use variant type uint64_t; extended locators ha...
const T & GetPosition() const