38#include <unordered_map>
55 auto base =
reinterpret_cast<unsigned char *
>(buffer);
57 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
70 std::uint16_t flags = 0;
96 auto size = pos - base;
113 auto base =
reinterpret_cast<unsigned char *
>(buffer);
115 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
119 for (
auto fieldId : fieldList) {
121 auto onDiskParentId =
122 (
f.GetParentId() == fieldZeroId) ? onDiskFieldId : context.
GetOnDiskFieldId(
f.GetParentId());
123 auto onDiskProjectionSourceId =
125 if (
auto res = SerializeField(
f, onDiskParentId, onDiskProjectionSourceId, *where)) {
141 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
143 std::uint64_t frameSize;
144 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
146 bytes += res.Unwrap();
151 std::uint32_t fieldVersion;
152 std::uint32_t typeVersion;
153 std::uint32_t parentId;
155 ENTupleStructure structure{ENTupleStructure::kPlain};
163 if (fnFrameSizeLeft() < 3 *
sizeof(std::uint32_t) +
result +
sizeof(std::uint16_t)) {
164 return R__FAIL(
"field record frame too short");
170 bytes += res.Unwrap();
177 std::string fieldName;
178 std::string typeName;
179 std::string aliasName;
180 std::string description;
182 bytes += res.Unwrap();
187 bytes += res.Unwrap();
192 bytes += res.Unwrap();
197 bytes += res.Unwrap();
204 if (fnFrameSizeLeft() <
sizeof(std::uint64_t))
205 return R__FAIL(
"field record frame too short");
206 std::uint64_t nRepetitions;
212 if (fnFrameSizeLeft() <
sizeof(std::uint32_t))
213 return R__FAIL(
"field record frame too short");
214 std::uint32_t projectionSourceId;
220 if (fnFrameSizeLeft() <
sizeof(std::uint32_t))
221 return R__FAIL(
"field record frame too short");
222 std::uint32_t typeChecksum;
240 auto base =
reinterpret_cast<unsigned char *
>(buffer);
242 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
253 std::uint16_t flags = 0;
260 firstElementIdx = -firstElementIdx;
267 std::uint64_t intMin, intMax;
268 static_assert(
sizeof(min) ==
sizeof(intMin) &&
sizeof(
max) ==
sizeof(intMax));
269 memcpy(&intMin, &min,
sizeof(min));
270 memcpy(&intMax, &max,
sizeof(max));
285 std::span<const ROOT::DescriptorId_t> fieldList,
287 void *buffer,
bool forHeaderExtension)
289 auto base =
reinterpret_cast<unsigned char *
>(buffer);
291 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
295 for (
auto parentId : fieldList) {
299 if (xHeader && xHeader->ContainsField(parentId))
303 if (
c.IsAliasColumn() || (xHeader && xHeader->ContainsExtendedColumnRepresentation(
c.GetLogicalId())))
306 if (
auto res = SerializePhysicalColumn(
c, context, *where)) {
322 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
324 std::uint64_t frameSize;
325 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
327 bytes += res.Unwrap();
334 std::uint16_t bitsOnStorage;
335 std::uint32_t fieldId;
337 std::uint16_t representationIndex;
338 std::int64_t firstElementIdx = 0;
340 2 *
sizeof(std::uint32_t)) {
341 return R__FAIL(
"column record frame too short");
344 bytes += res.Unwrap();
353 if (fnFrameSizeLeft() <
sizeof(std::uint64_t))
354 return R__FAIL(
"column record frame too short");
358 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint64_t))
359 return R__FAIL(
"field record frame too short");
360 std::uint64_t minInt, maxInt;
364 memcpy(&min, &minInt,
sizeof(min));
365 memcpy(&max, &maxInt,
sizeof(max));
371 if (firstElementIdx < 0)
379 auto base =
reinterpret_cast<unsigned char *
>(buffer);
381 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
394 auto size = pos - base;
402 auto base =
reinterpret_cast<unsigned char *
>(buffer);
404 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
407 if (auto res = SerializeExtraTypeInfo(extraTypeInfoDesc, *where)) {
410 return R__FORWARD_ERROR(res);
422 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
424 std::uint64_t frameSize;
425 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
431 EExtraTypeInfoIds contentId{EExtraTypeInfoIds::kInvalid};
432 std::uint32_t typeVersion;
433 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint32_t)) {
434 return R__FAIL(
"extra type info record frame too short");
442 std::string typeName;
458std::uint32_t SerializeLocatorPayloadLarge(
const ROOT::RNTupleLocator &locator,
unsigned char *buffer)
464 return sizeof(std::uint64_t) +
sizeof(std::uint64_t);
469 std::uint64_t nBytesOnStorage;
470 std::uint64_t position;
477std::uint32_t SerializeLocatorPayloadObject64(
const ROOT::RNTupleLocator &locator,
unsigned char *buffer)
480 const uint32_t sizeofNBytesOnStorage = (locator.
GetNBytesOnStorage() > std::numeric_limits<std::uint32_t>::max())
481 ?
sizeof(std::uint64_t)
482 : sizeof(std::uint32_t);
484 if (sizeofNBytesOnStorage ==
sizeof(std::uint32_t)) {
491 return sizeofNBytesOnStorage +
sizeof(std::uint64_t);
494ROOT::RResult<void> DeserializeLocatorPayloadObject64(
const unsigned char *buffer, std::uint32_t sizeofLocatorPayload,
497 std::uint64_t location;
498 if (sizeofLocatorPayload == 12) {
499 std::uint32_t nBytesOnStorage;
503 }
else if (sizeofLocatorPayload == 16) {
504 std::uint64_t nBytesOnStorage;
509 return R__FAIL(
"invalid DAOS locator payload size: " + std::to_string(sizeofLocatorPayload));
520 auto base =
reinterpret_cast<unsigned char *
>(buffer);
522 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
535 std::span<const ROOT::DescriptorId_t> fieldList,
537 bool forHeaderExtension)
539 auto base =
reinterpret_cast<unsigned char *
>(buffer);
541 void **where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void **>(&pos);
545 for (
auto parentId : fieldList) {
546 if (xHeader && xHeader->ContainsField(parentId))
550 if (!
c.IsAliasColumn() || (xHeader && xHeader->ContainsExtendedColumnRepresentation(
c.GetLogicalId())))
553 pos += SerializeAliasColumn(
c, context, *where);
561 std::uint32_t &physicalColumnId, std::uint32_t &fieldId)
563 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
565 std::uint64_t frameSize;
566 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
572 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint32_t)) {
573 return R__FAIL(
"alias column record frame too short");
585 std::uint64_t &xxhash3,
void *buffer)
587 if (buffer !=
nullptr) {
595 std::uint64_t &xxhash3)
597 auto checksumReal = XXH3_64bits(
data,
length);
599 if (xxhash3 != checksumReal)
600 return R__FAIL(
"XxHash-3 checksum mismatch");
606 std::uint64_t xxhash3;
612 if (buffer !=
nullptr) {
613 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
614 bytes[0] = (val & 0x00FF);
615 bytes[1] = (val & 0xFF00) >> 8;
622 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
623 val = std::int16_t(
bytes[0]) + (std::int16_t(
bytes[1]) << 8);
639 if (buffer !=
nullptr) {
640 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
641 bytes[0] = (val & 0x000000FF);
642 bytes[1] = (val & 0x0000FF00) >> 8;
643 bytes[2] = (val & 0x00FF0000) >> 16;
644 bytes[3] = (val & 0xFF000000) >> 24;
651 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
652 val = std::int32_t(
bytes[0]) + (std::int32_t(
bytes[1]) << 8) + (std::int32_t(
bytes[2]) << 16) +
653 (std::int32_t(
bytes[3]) << 24);
669 if (buffer !=
nullptr) {
670 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
671 bytes[0] = (val & 0x00000000000000FF);
672 bytes[1] = (val & 0x000000000000FF00) >> 8;
673 bytes[2] = (val & 0x0000000000FF0000) >> 16;
674 bytes[3] = (val & 0x00000000FF000000) >> 24;
675 bytes[4] = (val & 0x000000FF00000000) >> 32;
676 bytes[5] = (val & 0x0000FF0000000000) >> 40;
677 bytes[6] = (val & 0x00FF000000000000) >> 48;
678 bytes[7] = (val & 0xFF00000000000000) >> 56;
685 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
686 val = std::int64_t(
bytes[0]) + (std::int64_t(
bytes[1]) << 8) + (std::int64_t(
bytes[2]) << 16) +
687 (std::int64_t(
bytes[3]) << 24) + (std::int64_t(
bytes[4]) << 32) + (std::int64_t(
bytes[5]) << 40) +
688 (std::int64_t(
bytes[6]) << 48) + (std::int64_t(
bytes[7]) << 56);
705 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
707 memcpy(pos, val.data(), val.length());
709 return sizeof(std::uint32_t) + val.length();
715 if (bufSize <
sizeof(std::uint32_t))
716 return R__FAIL(
"string buffer too short");
717 bufSize -=
sizeof(std::uint32_t);
719 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
724 return R__FAIL(
"string buffer too short");
728 return sizeof(std::uint32_t) +
length;
767 return R__FAIL(
"unexpected column type");
774 std::uint16_t onDiskType;
777 switch (onDiskType) {
829 return R__FAIL(
"unexpected field structure type");
837 std::uint16_t onDiskValue;
839 switch (onDiskValue) {
856 default:
return R__FAIL(
"unexpected extra type info id");
863 std::uint32_t onDiskValue;
865 switch (onDiskValue) {
876 auto base =
reinterpret_cast<unsigned char *
>(buffer);
878 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
887 std::uint64_t &xxhash3)
889 if (
size <
sizeof(std::uint64_t))
890 return R__FAIL(
"envelope size too small");
891 if (
size >=
static_cast<uint64_t
>(1) << 48)
892 return R__FAIL(
"envelope size too big");
894 std::uint64_t typeAndSize;
896 typeAndSize |= (
size + 8) << 16;
905 std::uint64_t xxhash3;
911 std::uint16_t expectedType, std::uint64_t &xxhash3)
913 const std::uint64_t minEnvelopeSize =
sizeof(std::uint64_t) +
sizeof(std::uint64_t);
914 if (bufSize < minEnvelopeSize)
915 return R__FAIL(
"invalid envelope buffer, too short");
917 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
920 std::uint64_t typeAndSize;
923 std::uint16_t envelopeType = typeAndSize & 0xFFFF;
924 if (envelopeType != expectedType) {
925 return R__FAIL(
"envelope type mismatch: expected " + std::to_string(expectedType) +
", found " +
926 std::to_string(envelopeType));
929 std::uint64_t envelopeSize = typeAndSize >> 16;
930 if (bufSize < envelopeSize)
931 return R__FAIL(
"envelope buffer size too small");
932 if (envelopeSize < minEnvelopeSize)
933 return R__FAIL(
"invalid envelope, too short");
939 return sizeof(typeAndSize);
943 std::uint64_t bufSize,
944 std::uint16_t expectedType)
946 std::uint64_t xxhash3;
958 auto base =
reinterpret_cast<unsigned char *
>(buffer);
960 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
971 auto preambleSize =
sizeof(std::int64_t);
972 if (
size < preambleSize)
973 return R__FAIL(
"frame too short: " + std::to_string(
size));
977 if ((marker < 0) && (
size < (
sizeof(std::uint32_t) + preambleSize)))
978 return R__FAIL(
"frame too short: " + std::to_string(
size));
986 std::uint64_t &frameSize, std::uint32_t &
nitems)
988 std::uint64_t minSize =
sizeof(std::int64_t);
989 if (bufSize < minSize)
990 return R__FAIL(
"frame too short");
992 std::int64_t *ssize =
reinterpret_cast<std::int64_t *
>(&frameSize);
995 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1003 minSize +=
sizeof(std::uint32_t);
1004 if (bufSize < minSize)
1005 return R__FAIL(
"frame too short");
1010 if (frameSize < minSize)
1011 return R__FAIL(
"corrupt frame size");
1012 if (bufSize < frameSize)
1013 return R__FAIL(
"frame too short");
1015 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
1019 std::uint64_t bufSize,
1020 std::uint64_t &frameSize)
1033 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
1035 for (
unsigned i = 0; i < flags.size(); ++i) {
1036 if (flags[i] & 0x8000000000000000)
1037 return R__FAIL(
"feature flag out of bounds");
1040 if (i == (flags.size() - 1))
1046 return (flags.size() *
sizeof(std::int64_t));
1051 std::vector<std::uint64_t> &flags)
1053 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1058 if (bufSize <
sizeof(std::uint64_t))
1059 return R__FAIL(
"feature flag buffer too short");
1061 bufSize -=
sizeof(std::uint64_t);
1062 flags.emplace_back(
f & ~0x8000000000000000);
1063 }
while (
f & 0x8000000000000000);
1065 return (flags.size() *
sizeof(std::uint64_t));
1072 return R__FAIL(
"locator is not serializable");
1074 std::uint32_t
size = 0;
1079 buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
size :
nullptr);
1083 std::uint8_t locatorType = 0;
1084 auto payloadp = buffer ?
reinterpret_cast<unsigned char *
>(buffer) +
sizeof(std::int32_t) :
nullptr;
1087 size += SerializeLocatorPayloadLarge(locator, payloadp);
1091 size += SerializeLocatorPayloadObject64(locator, payloadp);
1099 size += SerializeLocatorPayloadObject64(dummy, payloadp);
1102 return R__FAIL(
"locator has unknown type");
1105 std::int32_t head =
sizeof(std::int32_t) +
size;
1107 head |=
static_cast<int>(locatorType & 0x7F) << 24;
1114 std::uint64_t bufSize,
1117 if (bufSize <
sizeof(std::int32_t))
1118 return R__FAIL(
"too short locator");
1120 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1124 bufSize -=
sizeof(std::int32_t);
1127 const int type = head >> 24;
1128 const std::uint32_t payloadSize = (
static_cast<std::uint32_t
>(head) & 0x0000FFFF) -
sizeof(std::int32_t);
1129 if (bufSize < payloadSize)
1130 return R__FAIL(
"too short locator");
1132 locator.
SetReserved(
static_cast<std::uint32_t
>(head >> 16) & 0xFF);
1136 DeserializeLocatorPayloadLarge(
bytes, locator);
1140 DeserializeLocatorPayloadObject64(
bytes, payloadSize, locator);
1144 bytes += payloadSize;
1146 if (bufSize <
sizeof(std::uint64_t))
1147 return R__FAIL(
"too short locator");
1155 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
1165 size += res.Unwrap();
1172 std::uint64_t bufSize,
1175 if (bufSize <
sizeof(std::int64_t))
1176 return R__FAIL(
"too short envelope link");
1178 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
1180 bufSize -=
sizeof(std::uint64_t);
1182 bytes += res.Unwrap();
1186 return bytes -
reinterpret_cast<const unsigned char *
>(buffer);
1192 if (clusterSummary.
fNEntries >= (
static_cast<std::uint64_t
>(1) << 56)) {
1193 return R__FAIL(
"number of entries in cluster exceeds maximum of 2^56");
1196 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1198 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1203 const std::uint64_t nEntriesAndFlags =
1204 (
static_cast<std::uint64_t
>(clusterSummary.
fFlags) << 56) | clusterSummary.
fNEntries;
1207 auto size = pos - frame;
1209 pos += res.Unwrap();
1220 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1222 std::uint64_t frameSize;
1224 bytes += res.Unwrap();
1229 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
1230 if (fnFrameSizeLeft() < 2 *
sizeof(std::uint64_t))
1231 return R__FAIL(
"too short cluster summary");
1234 std::uint64_t nEntriesAndFlags;
1237 const std::uint64_t nEntries = (nEntriesAndFlags << 8) >> 8;
1238 const std::uint8_t flags = nEntriesAndFlags >> 56;
1241 return R__FAIL(
"sharded cluster flag set in cluster summary; sharded clusters are currently unsupported.");
1245 clusterSummary.
fFlags = flags;
1253 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1255 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1263 pos += res.Unwrap();
1267 auto size = pos - frame;
1276 std::uint64_t bufSize,
1279 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1282 std::uint64_t frameSize;
1284 bytes += res.Unwrap();
1289 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - base); };
1290 if (fnFrameSizeLeft() <
sizeof(std::uint32_t) + 2 *
sizeof(std::uint64_t))
1291 return R__FAIL(
"too short cluster group");
1297 bytes += res.Unwrap();
1306 bool forHeaderExtension)
1309 auto depthFirstTraversal = [&](std::span<ROOT::DescriptorId_t> fieldTrees,
auto doForEachField) {
1310 std::deque<ROOT::DescriptorId_t> idQueue{fieldTrees.begin(), fieldTrees.end()};
1311 while (!idQueue.empty()) {
1312 auto fieldId = idQueue.front();
1313 idQueue.pop_front();
1315 if (fieldId != fieldZeroId)
1316 doForEachField(fieldId);
1319 idQueue.insert(idQueue.begin() + i++,
f.GetId());
1325 std::vector<ROOT::DescriptorId_t> fieldTrees;
1326 if (!forHeaderExtension) {
1327 fieldTrees.emplace_back(fieldZeroId);
1329 fieldTrees = xHeader->GetTopMostFields(desc);
1334 if (!
c.IsAliasColumn()) {
1340 if (forHeaderExtension) {
1354 const RContext &context,
bool forHeaderExtension)
1356 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1358 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1360 std::size_t nFields = 0, nColumns = 0, nAliasColumns = 0, fieldListOffset = 0;
1362 std::vector<std::reference_wrapper<const ROOT::RColumnDescriptor>> extraColumns;
1363 if (forHeaderExtension) {
1367 nFields = xHeader->GetNFields();
1368 nColumns = xHeader->GetNPhysicalColumns();
1369 nAliasColumns = xHeader->GetNLogicalColumns() - xHeader->GetNPhysicalColumns();
1370 fieldListOffset = desc.
GetNFields() - nFields - 1;
1372 extraColumns.reserve(xHeader->GetExtendedColumnRepresentations().size());
1373 for (
auto columnId : xHeader->GetExtendedColumnRepresentations()) {
1379 nFields = desc.
GetNFields() - xHeader->GetNFields() - 1;
1382 (xHeader->GetNLogicalColumns() - xHeader->GetNPhysicalColumns());
1391 R__ASSERT(onDiskFields.size() >= fieldListOffset);
1392 std::span<const ROOT::DescriptorId_t> fieldList{onDiskFields.data() + fieldListOffset, nFields};
1396 if (
auto res = SerializeFieldList(desc, fieldList, fieldListOffset, context, *where)) {
1397 pos += res.Unwrap();
1402 pos += res.Unwrap();
1409 if (
auto res = SerializeColumnsOfFields(desc, fieldList, context, *where, forHeaderExtension)) {
1410 pos += res.Unwrap();
1414 for (
const auto &
c : extraColumns) {
1415 if (!
c.get().IsAliasColumn()) {
1416 if (
auto res = SerializePhysicalColumn(
c.get(), context, *where)) {
1417 pos += res.Unwrap();
1424 pos += res.Unwrap();
1431 pos += SerializeAliasColumnsOfFields(desc, fieldList, context, *where, forHeaderExtension);
1432 for (
const auto &
c : extraColumns) {
1433 if (
c.get().IsAliasColumn()) {
1434 pos += SerializeAliasColumn(
c.get(), context, *where);
1438 pos += res.Unwrap();
1445 if (forHeaderExtension) {
1447 if (
auto res = SerializeExtraTypeInfoList(desc, *where)) {
1448 pos += res.Unwrap();
1456 pos += res.Unwrap();
1461 return static_cast<std::uint32_t
>(pos - base);
1468 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1470 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1472 std::uint64_t frameSize;
1474 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1476 std::uint32_t nFields;
1478 bytes += res.Unwrap();
1484 for (
unsigned i = 0; i < nFields; ++i) {
1485 std::uint32_t fieldId = fieldIdRangeBegin + i;
1487 if (
auto res = DeserializeField(
bytes, fnFrameSizeLeft(), fieldBuilder)) {
1488 bytes += res.Unwrap();
1497 const auto parentId = fieldDesc.Inspect().
GetParentId();
1498 const auto projectionSourceId = fieldDesc.Inspect().GetProjectionSourceId();
1499 descBuilder.
AddField(fieldDesc.Unwrap());
1500 auto resVoid = descBuilder.
AddFieldLink(parentId, fieldId);
1509 bytes = frame + frameSize;
1514 std::uint16_t representationIndex) -> std::uint32_t {
1516 if (existingColumns.empty())
1519 return (representationIndex == lastColumnDesc.GetRepresentationIndex()) ? (lastColumnDesc.GetIndex() + 1) : 0;
1522 std::uint32_t nColumns;
1525 bytes += res.Unwrap();
1534 for (
unsigned i = 0; i < nColumns; ++i) {
1535 std::uint32_t columnId = columnIdRangeBegin + i;
1537 if (
auto res = DeserializeColumn(
bytes, fnFrameSizeLeft(), columnBuilder)) {
1538 bytes += res.Unwrap();
1549 auto resVoid = descBuilder.
AddColumn(columnDesc.Unwrap());
1553 bytes = frame + frameSize;
1555 std::uint32_t nAliasColumns;
1558 bytes += res.Unwrap();
1563 for (
unsigned i = 0; i < nAliasColumns; ++i) {
1564 std::uint32_t physicalId;
1565 std::uint32_t fieldId;
1566 if (
auto res = DeserializeAliasColumn(
bytes, fnFrameSizeLeft(), physicalId, fieldId)) {
1567 bytes += res.Unwrap();
1575 columnBuilder.
BitsOnStorage(physicalColumnDesc.GetBitsOnStorage());
1576 columnBuilder.
ValueRange(physicalColumnDesc.GetValueRange());
1577 columnBuilder.
Type(physicalColumnDesc.GetType());
1582 if (!aliasColumnDesc)
1584 auto resVoid = descBuilder.
AddColumn(aliasColumnDesc.Unwrap());
1588 bytes = frame + frameSize;
1590 std::uint32_t nExtraTypeInfos;
1593 bytes += res.Unwrap();
1597 for (
unsigned i = 0; i < nExtraTypeInfos; ++i) {
1599 if (
auto res = DeserializeExtraTypeInfo(
bytes, fnFrameSizeLeft(), extraTypeInfoBuilder)) {
1600 bytes += res.Unwrap();
1607 if (extraTypeInfoDesc)
1610 bytes = frame + frameSize;
1612 return bytes - base;
1620 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1622 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1626 pos += res.Unwrap();
1637 pos += res.Unwrap();
1642 std::uint64_t
size = pos - base;
1643 std::uint64_t xxhash3 = 0;
1645 size += res.Unwrap();
1657 std::span<ROOT::DescriptorId_t> physClusterIDs,
1660 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1662 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1669 const auto nClusters = physClusterIDs.size();
1670 auto clusterSummaryFrame = pos;
1672 for (
auto clusterId : physClusterIDs) {
1674 RClusterSummary summary{clusterDesc.GetFirstEntryIndex(), clusterDesc.GetNEntries(), 0};
1676 pos += res.Unwrap();
1682 pos += res.Unwrap();
1688 auto topMostFrame = pos;
1691 for (
auto clusterId : physClusterIDs) {
1694 std::set<ROOT::DescriptorId_t> onDiskColumnIds;
1695 for (
const auto &columnRange : clusterDesc.GetColumnRangeIterable())
1696 onDiskColumnIds.insert(context.
GetOnDiskColumnId(columnRange.GetPhysicalColumnId()));
1698 auto outerFrame = pos;
1700 for (
auto onDiskId : onDiskColumnIds) {
1702 const auto &columnRange = clusterDesc.GetColumnRange(memId);
1704 auto innerFrame = pos;
1705 if (columnRange.IsSuppressed()) {
1710 const auto &pageRange = clusterDesc.GetPageRange(memId);
1713 for (
const auto &pi : pageRange.GetPageInfos()) {
1714 std::int32_t nElements =
1715 pi.HasChecksum() ? -
static_cast<std::int32_t
>(pi.GetNElements()) : pi.GetNElements();
1718 pos += res.Unwrap();
1723 pos +=
SerializeInt64(columnRange.GetFirstElementIndex(), *where);
1724 pos +=
SerializeUInt32(columnRange.GetCompressionSettings().value(), *where);
1728 pos += res.Unwrap();
1734 pos += res.Unwrap();
1741 pos += res.Unwrap();
1745 std::uint64_t
size = pos - base;
1747 size += res.Unwrap();
1758 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1760 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1767 pos += res.Unwrap();
1777 pos += res.Unwrap();
1782 pos += res.Unwrap();
1791 for (
unsigned int i = 0; i < nClusterGroups; ++i) {
1794 clusterGroup.
fMinEntry = cgDesc.GetMinEntry();
1795 clusterGroup.
fEntrySpan = cgDesc.GetEntrySpan();
1796 clusterGroup.
fNClusters = cgDesc.GetNClusters();
1800 pos += res.Unwrap();
1806 pos += res.Unwrap();
1814 if (nAttributeSets > 0) {
1816 "back in the future (but your main data is)";
1821 pos += res.Unwrap();
1827 pos += res.Unwrap();
1832 std::uint32_t
size = pos - base;
1834 size += res.Unwrap();
1845 auto base =
reinterpret_cast<unsigned char *
>(buffer);
1847 void **where = (buffer ==
nullptr) ? &buffer :
reinterpret_cast<void **
>(&pos);
1855 pos += res.Unwrap();
1860 auto size = pos - frame;
1870 for (std::size_t i = 0; i < featureFlags.size(); ++i) {
1871 if (!featureFlags[i])
1876 return R__FAIL(
"unsupported format feature: " + std::to_string(highestBitSet));
1884 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1886 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1888 std::uint64_t xxhash3{0};
1890 bytes += res.Unwrap();
1896 std::vector<std::uint64_t> featureFlags;
1898 bytes += res.Unwrap();
1907 std::string description;
1910 bytes += res.Unwrap();
1915 bytes += res.Unwrap();
1920 bytes += res.Unwrap();
1942 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
1944 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
1946 bytes += res.Unwrap();
1951 std::vector<std::uint64_t> featureFlags;
1953 bytes += res.Unwrap();
1961 std::uint64_t xxhash3{0};
1962 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint64_t)))
1963 return R__FAIL(
"footer too short");
1966 return R__FAIL(
"XxHash-3 mismatch between header and footer");
1968 std::uint64_t frameSize;
1970 auto fnFrameSizeLeft = [&]() {
return frameSize - (
bytes - frame); };
1973 bytes += res.Unwrap();
1977 if (fnFrameSizeLeft() > 0) {
1983 bytes = frame + frameSize;
1986 std::uint32_t nClusterGroups;
1989 bytes += res.Unwrap();
1993 for (std::uint32_t groupId = 0; groupId < nClusterGroups; ++groupId) {
1996 bytes += res.Unwrap();
2011 bytes = frame + frameSize;
2016 if (fnBufSizeLeft() > 8) {
2017 std::uint32_t nAttributeSets;
2020 bytes += res.Unwrap();
2024 if (nAttributeSets > 0) {
2026 "back in the future (but your main data is)";
2028 for (std::uint32_t attrSetId = 0; attrSetId < nAttributeSets; ++attrSetId) {
2032 bytes += res.Unwrap();
2037 bytes = frame + frameSize;
2046 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
2048 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
2050 std::uint64_t frameSize;
2052 bytes += res.Unwrap();
2056 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint64_t)))
2057 return R__FAIL(
"record frame too short");
2058 std::uint16_t vMajor, vMinor;
2061 std::uint32_t anchorLen;
2065 bytes += res.Unwrap();
2071 bytes += res.Unwrap();
2086 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
2088 auto fnBufSizeLeft = [&]() {
return bufSize - (
bytes - base); };
2091 bytes += res.Unwrap();
2096 std::uint64_t xxhash3{0};
2097 if (fnBufSizeLeft() <
static_cast<int>(
sizeof(std::uint64_t)))
2098 return R__FAIL(
"page list too short");
2101 return R__FAIL(
"XxHash-3 mismatch between header and page list");
2103 std::vector<RClusterDescriptorBuilder> clusterBuilders;
2109 std::uint64_t clusterSummaryFrameSize;
2110 auto clusterSummaryFrame =
bytes;
2111 auto fnClusterSummaryFrameSizeLeft = [&]() {
return clusterSummaryFrameSize - (
bytes - clusterSummaryFrame); };
2113 std::uint32_t nClusterSummaries;
2115 bytes += res.Unwrap();
2119 for (
auto clusterId = firstClusterId; clusterId < firstClusterId + nClusterSummaries; ++clusterId) {
2122 bytes += res.Unwrap();
2129 clusterBuilders.emplace_back(std::move(builder));
2131 bytes = clusterSummaryFrame + clusterSummaryFrameSize;
2133 std::uint64_t topMostFrameSize;
2134 auto topMostFrame =
bytes;
2135 auto fnTopMostFrameSizeLeft = [&]() {
return topMostFrameSize - (
bytes - topMostFrame); };
2137 std::uint32_t nClusters;
2139 bytes += res.Unwrap();
2144 if (nClusters != nClusterSummaries)
2145 return R__FAIL(
"mismatch between number of clusters and number of cluster summaries");
2147 for (std::uint32_t i = 0; i < nClusters; ++i) {
2148 std::uint64_t outerFrameSize;
2149 auto outerFrame =
bytes;
2150 auto fnOuterFrameSizeLeft = [&]() {
return outerFrameSize - (
bytes - outerFrame); };
2152 std::uint32_t nColumns;
2154 bytes += res.Unwrap();
2159 for (std::uint32_t j = 0; j < nColumns; ++j) {
2160 std::uint64_t innerFrameSize;
2161 auto innerFrame =
bytes;
2162 auto fnInnerFrameSizeLeft = [&]() {
return innerFrameSize - (
bytes - innerFrame); };
2164 std::uint32_t nPages;
2166 bytes += res.Unwrap();
2173 for (std::uint32_t k = 0; k < nPages; ++k) {
2174 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
2175 return R__FAIL(
"inner frame too short");
2176 std::int32_t nElements;
2177 bool hasChecksum =
false;
2180 if (nElements < 0) {
2181 nElements = -nElements;
2185 bytes += res.Unwrap();
2189 pageRange.
GetPageInfos().push_back({
static_cast<std::uint32_t
>(nElements), locator, hasChecksum});
2192 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::int64_t)))
2193 return R__FAIL(
"page list frame too short");
2194 std::int64_t columnOffset;
2196 if (columnOffset < 0) {
2198 return R__FAIL(
"unexpected non-empty page list");
2199 clusterBuilders[i].MarkSuppressedColumnRange(j);
2201 if (fnInnerFrameSizeLeft() <
static_cast<int>(
sizeof(std::uint32_t)))
2202 return R__FAIL(
"page list frame too short");
2203 std::uint32_t compressionSettings;
2205 clusterBuilders[i].CommitColumnRange(j, columnOffset, compressionSettings, pageRange);
2208 bytes = innerFrame + innerFrameSize;
2211 bytes = outerFrame + outerFrameSize;
2214 return clusterBuilders;
2223 if (!clusterBuildersRes)
2226 auto clusterBuilders = clusterBuildersRes.Unwrap();
2228 std::vector<ROOT::RClusterDescriptor> clusters;
2229 clusters.reserve(clusterBuilders.size());
2234 for (
auto &builder : clusterBuilders) {
2235 if (
auto res = builder.CommitSuppressedColumnRanges(desc); !res)
2237 builder.AddExtendedColumnRanges(desc);
2238 clusters.emplace_back(builder.MoveDescriptor().Unwrap());
2242 for (
auto &builder : clusterBuilders) {
2243 if (
auto res = builder.CommitSuppressedColumnRanges(desc); !res)
2245 clusters.emplace_back(builder.MoveDescriptor().Unwrap());
2249 for (
auto &builder : clusterBuilders)
2250 clusters.emplace_back(builder.MoveDescriptor().Unwrap());
2261 TList streamerInfos;
2262 for (
auto si : infos) {
2263 assert(si.first == si.second->GetNumber());
2264 streamerInfos.
Add(si.second);
2268 assert(buffer.
Length() > 0);
2281 TObjLink *lnk = infoList->FirstLink();
2285 infoMap[info->GetNumber()] = info->GetClass()->GetStreamerInfo(info->GetClassVersion());
2286 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,...)
static ROOT::RResult< void > CheckFeatureFlags(const std::vector< std::uint64_t > &featureFlags)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
#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 mode
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t 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
A helper class for serializing and deserialization of the RNTuple binary format.
static constexpr std::uint16_t kFlagDeferredColumn
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val)
static constexpr std::uint16_t kFlagIsSoACollection
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< std::uint32_t > SerializeFieldStructure(ROOT::ENTupleStructure structure, void *buffer)
While we could just interpret the enums as ints, we make the translation explicit in order to avoid a...
static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val)
static RResult< std::uint32_t > DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems)
static constexpr std::uint16_t kFlagRepetitiveField
static RResult< std::uint32_t > SerializeColumnType(ROOT::ENTupleColumnType type, void *buffer)
static RResult< std::uint32_t > SerializeFramePostscript(void *frame, std::uint64_t size)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static constexpr std::uint16_t kFlagProjectedField
static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
static RResult< std::uint32_t > SerializeExtraTypeInfoId(ROOT::EExtraTypeInfoIds id, void *buffer)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static constexpr std::uint16_t kFlagHasValueRange
static RResult< std::uint32_t > DeserializeColumnType(const void *buffer, ROOT::ENTupleColumnType &type)
static constexpr std::uint16_t kFlagHasTypeChecksum
static RResult< std::uint32_t > DeserializeExtraTypeInfoId(const void *buffer, ROOT::EExtraTypeInfoIds &id)
static std::uint32_t SerializeRecordFramePreamble(void *buffer)
static RResult< std::uint32_t > DeserializeFieldStructure(const void *buffer, ROOT::ENTupleStructure &structure)
static std::uint32_t SerializeInt64(std::int64_t val, void *buffer)
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
The available trivial, native content types of a column.
RNTupleAttrSetDescriptorBuilder & AnchorLocator(const RNTupleLocator &loc)
RNTupleAttrSetDescriptorBuilder & SchemaVersion(std::uint16_t major, std::uint16_t minor)
RResult< ROOT::Experimental::RNTupleAttrSetDescriptor > MoveDescriptor()
Attempt to make an AttributeSet descriptor.
RNTupleAttrSetDescriptorBuilder & Name(std::string_view name)
RNTupleAttrSetDescriptorBuilder & AnchorLength(std::uint32_t length)
Metadata stored for every Attribute Set linked to an RNTuple.
std::uint16_t GetSchemaVersionMinor() const
const std::string & GetName() const
const RNTupleLocator & GetAnchorLocator() const
std::uint16_t GetSchemaVersionMajor() const
std::uint32_t GetAnchorLength() const
A helper class for piece-wise construction of an RClusterDescriptor.
RClusterDescriptorBuilder & NEntries(std::uint64_t nEntries)
RClusterDescriptorBuilder & ClusterId(ROOT::DescriptorId_t clusterId)
RClusterDescriptorBuilder & FirstEntryIndex(std::uint64_t firstEntryIndex)
A helper class for piece-wise construction of an RClusterGroupDescriptor.
RClusterGroupDescriptorBuilder & EntrySpan(std::uint64_t entrySpan)
RClusterGroupDescriptorBuilder & PageListLocator(const RNTupleLocator &pageListLocator)
RClusterGroupDescriptorBuilder & PageListLength(std::uint64_t pageListLength)
RClusterGroupDescriptorBuilder & MinEntry(std::uint64_t minEntry)
RResult< RClusterGroupDescriptor > MoveDescriptor()
RClusterGroupDescriptorBuilder & ClusterGroupId(ROOT::DescriptorId_t clusterGroupId)
RClusterGroupDescriptorBuilder & NClusters(std::uint32_t nClusters)
A helper class for piece-wise construction of an RColumnDescriptor.
ROOT::DescriptorId_t GetRepresentationIndex() const
RColumnDescriptorBuilder & SetSuppressedDeferred()
RColumnDescriptorBuilder & LogicalColumnId(ROOT::DescriptorId_t logicalColumnId)
RResult< RColumnDescriptor > MakeDescriptor() const
Attempt to make a column descriptor.
RColumnDescriptorBuilder & FieldId(ROOT::DescriptorId_t fieldId)
RColumnDescriptorBuilder & BitsOnStorage(std::uint16_t bitsOnStorage)
RColumnDescriptorBuilder & ValueRange(double min, double max)
RColumnDescriptorBuilder & Type(ROOT::ENTupleColumnType type)
RColumnDescriptorBuilder & PhysicalColumnId(ROOT::DescriptorId_t physicalColumnId)
RColumnDescriptorBuilder & FirstElementIndex(std::uint64_t firstElementIdx)
RColumnDescriptorBuilder & Index(std::uint32_t index)
RColumnDescriptorBuilder & RepresentationIndex(std::uint16_t representationIndex)
ROOT::DescriptorId_t GetFieldId() const
A helper class for piece-wise construction of an RFieldDescriptor.
RFieldDescriptorBuilder & NRepetitions(std::uint64_t nRepetitions)
RFieldDescriptorBuilder & Structure(const ROOT::ENTupleStructure &structure)
RFieldDescriptorBuilder & TypeAlias(const std::string &typeAlias)
RFieldDescriptorBuilder & ProjectionSourceId(ROOT::DescriptorId_t id)
RFieldDescriptorBuilder & TypeVersion(std::uint32_t typeVersion)
RFieldDescriptorBuilder & IsSoACollection(bool val)
ROOT::DescriptorId_t GetParentId() const
RFieldDescriptorBuilder & TypeChecksum(const std::optional< std::uint32_t > typeChecksum)
RResult< RFieldDescriptor > MakeDescriptor() const
Attempt to make a field descriptor.
RFieldDescriptorBuilder & ParentId(ROOT::DescriptorId_t id)
RFieldDescriptorBuilder & FieldDescription(const std::string &fieldDescription)
RFieldDescriptorBuilder & FieldVersion(std::uint32_t fieldVersion)
RFieldDescriptorBuilder & FieldName(const std::string &fieldName)
RFieldDescriptorBuilder & FieldId(ROOT::DescriptorId_t fieldId)
RFieldDescriptorBuilder & TypeName(const std::string &typeName)
A helper class for piece-wise construction of an RNTupleDescriptor.
void SetNTuple(const std::string_view name, const std::string_view description)
RResult< void > AddColumn(RColumnDescriptor &&columnDesc)
RResult< void > AddAttributeSet(Experimental::RNTupleAttrSetDescriptor &&attrSetDesc)
RResult< void > AddFieldProjection(ROOT::DescriptorId_t sourceId, ROOT::DescriptorId_t targetId)
RResult< void > AddExtraTypeInfo(RExtraTypeInfoDescriptor &&extraTypeInfoDesc)
void ShiftAliasColumns(std::uint32_t offset)
Shift column IDs of alias columns by offset
const RNTupleDescriptor & GetDescriptor() const
void BeginHeaderExtension()
Mark the beginning of the header extension; any fields and columns added after a call to this functio...
RResult< void > AddFieldLink(ROOT::DescriptorId_t fieldId, ROOT::DescriptorId_t linkId)
void AddField(const RFieldDescriptor &fieldDesc)
RResult< void > AddClusterGroup(RClusterGroupDescriptor &&clusterGroup)
void SetOnDiskHeaderXxHash3(std::uint64_t xxhash3)
void AddToOnDiskFooterSize(std::uint64_t size)
The real footer size also include the page list envelopes.
The serialization context is used for the piecewise serialization of a descriptor.
ROOT::DescriptorId_t GetOnDiskFieldId(ROOT::DescriptorId_t memId) const
ROOT::DescriptorId_t GetMemColumnId(ROOT::DescriptorId_t onDiskId) const
ROOT::DescriptorId_t GetMemClusterGroupId(ROOT::DescriptorId_t onDiskId) const
ROOT::DescriptorId_t GetOnDiskColumnId(ROOT::DescriptorId_t memId) const
std::uint64_t GetHeaderXxHash3() const
void MapSchema(const RNTupleDescriptor &desc, bool forHeaderExtension)
Map in-memory field and column IDs to their on-disk counterparts.
void SetHeaderSize(std::uint64_t size)
ROOT::DescriptorId_t MapPhysicalColumnId(ROOT::DescriptorId_t memId)
Map an in-memory column ID to its on-disk counterpart.
void SetHeaderXxHash3(std::uint64_t xxhash3)
ROOT::DescriptorId_t GetMemClusterId(ROOT::DescriptorId_t onDiskId) const
const std::vector< ROOT::DescriptorId_t > & GetOnDiskFieldList() const
Return a vector containing the in-memory field ID for each on-disk counterpart, in order,...
ROOT::DescriptorId_t MapFieldId(ROOT::DescriptorId_t memId)
Map an in-memory field ID to its on-disk counterpart.
A helper class for serializing and deserialization of the RNTuple binary format.
static std::uint32_t SerializeXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3, void *buffer)
Writes a XxHash-3 64bit checksum of the byte range given by data and length.
static RResult< std::vector< ROOT::Internal::RClusterDescriptorBuilder > > DeserializePageListRaw(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId, const RNTupleDescriptor &desc)
static RResult< std::uint32_t > SerializeSchemaDescription(void *buffer, const RNTupleDescriptor &desc, const RContext &context, bool forHeaderExtension=false)
Serialize the schema description in desc into buffer.
static RResult< std::uint32_t > DeserializeString(const void *buffer, std::uint64_t bufSize, std::string &val)
static constexpr std::uint16_t kEnvelopeTypePageList
static RResult< std::uint32_t > SerializeEnvelopeLink(const REnvelopeLink &envelopeLink, void *buffer)
static std::uint32_t SerializeInt32(std::int32_t val, void *buffer)
static RResult< std::uint32_t > DeserializeEnvelopeLink(const void *buffer, std::uint64_t bufSize, REnvelopeLink &envelopeLink)
static std::uint32_t SerializeUInt32(std::uint32_t val, void *buffer)
static RResult< std::uint32_t > SerializeAttributeSet(const Experimental::RNTupleAttrSetDescriptor &attrSetDesc, void *buffer)
static RResult< std::uint32_t > SerializeFieldStructure(ROOT::ENTupleStructure structure, void *buffer)
While we could just interpret the enums as ints, we make the translation explicit in order to avoid a...
static RResult< std::uint32_t > SerializeEnvelopePostscript(unsigned char *envelope, std::uint64_t size)
static RResult< std::uint32_t > SerializeFeatureFlags(const std::vector< std::uint64_t > &flags, void *buffer)
static std::uint32_t DeserializeUInt32(const void *buffer, std::uint32_t &val)
static RResult< std::uint32_t > DeserializeFrameHeader(const void *buffer, std::uint64_t bufSize, std::uint64_t &frameSize, std::uint32_t &nitems)
static RResult< std::uint32_t > DeserializeAttributeSet(const void *buffer, std::uint64_t bufSize, Experimental::Internal::RNTupleAttrSetDescriptorBuilder &attrSetDescBld)
static RResult< std::uint32_t > DeserializeEnvelope(const void *buffer, std::uint64_t bufSize, std::uint16_t expectedType)
static constexpr int64_t kSuppressedColumnMarker
static RResult< std::uint32_t > SerializeColumnType(ROOT::ENTupleColumnType type, void *buffer)
static std::uint32_t SerializeListFramePreamble(std::uint32_t nitems, void *buffer)
static std::uint32_t SerializeInt16(std::int16_t val, void *buffer)
static RResult< std::uint32_t > SerializeFramePostscript(void *frame, std::uint64_t size)
static constexpr std::uint16_t kEnvelopeTypeFooter
static RResult< std::uint32_t > DeserializeClusterGroup(const void *buffer, std::uint64_t bufSize, RClusterGroup &clusterGroup)
static RResult< std::uint32_t > DeserializeLocator(const void *buffer, std::uint64_t bufSize, RNTupleLocator &locator)
static std::uint32_t SerializeUInt16(std::uint16_t val, void *buffer)
static RResult< void > DeserializePageList(const void *buffer, std::uint64_t bufSize, ROOT::DescriptorId_t clusterGroupId, RNTupleDescriptor &desc, EDescriptorDeserializeMode mode)
static RResult< void > DeserializeFooter(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t DeserializeInt64(const void *buffer, std::int64_t &val)
static std::uint32_t SerializeEnvelopePreamble(std::uint16_t envelopeType, void *buffer)
static std::uint32_t DeserializeInt32(const void *buffer, std::int32_t &val)
static std::uint32_t SerializeString(const std::string &val, void *buffer)
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
static RResult< std::uint32_t > SerializeExtraTypeInfoId(ROOT::EExtraTypeInfoIds id, void *buffer)
static RResult< StreamerInfoMap_t > DeserializeStreamerInfos(const std::string &extraTypeInfoContent)
static std::uint32_t DeserializeUInt16(const void *buffer, std::uint16_t &val)
static RResult< void > VerifyXxHash3(const unsigned char *data, std::uint64_t length, std::uint64_t &xxhash3)
Expects an xxhash3 checksum in the 8 bytes following data + length and verifies it.
static RResult< std::uint32_t > SerializeClusterSummary(const RClusterSummary &clusterSummary, void *buffer)
static RResult< std::uint32_t > DeserializeColumnType(const void *buffer, ROOT::ENTupleColumnType &type)
static constexpr ROOT::DescriptorId_t kZeroFieldId
static std::uint32_t DeserializeInt16(const void *buffer, std::int16_t &val)
static RResult< std::uint32_t > DeserializeExtraTypeInfoId(const void *buffer, ROOT::EExtraTypeInfoIds &id)
static RResult< std::uint32_t > DeserializeClusterSummary(const void *buffer, std::uint64_t bufSize, RClusterSummary &clusterSummary)
EDescriptorDeserializeMode
@ kForReading
Deserializes the descriptor and performs fixup on the suppressed column ranges and on clusters,...
@ kRaw
Deserializes the descriptor as-is without performing any additional fixup.
@ kForWriting
Deserializes the descriptor and performs fixup on the suppressed column ranges.
static constexpr std::uint16_t kEnvelopeTypeHeader
static RResult< std::uint32_t > SerializeClusterGroup(const RClusterGroup &clusterGroup, void *buffer)
static std::uint32_t SerializeRecordFramePreamble(void *buffer)
static RResult< std::uint32_t > SerializePageList(void *buffer, const RNTupleDescriptor &desc, std::span< ROOT::DescriptorId_t > physClusterIDs, const RContext &context)
static RResult< std::uint32_t > DeserializeFieldStructure(const void *buffer, ROOT::ENTupleStructure &structure)
static std::uint32_t SerializeInt64(std::int64_t val, void *buffer)
static RResult< void > DeserializeHeader(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static RResult< std::uint32_t > SerializeFooter(void *buffer, const RNTupleDescriptor &desc, const RContext &context)
static std::uint32_t DeserializeUInt64(const void *buffer, std::uint64_t &val)
static RResult< std::uint32_t > SerializeLocator(const RNTupleLocator &locator, void *buffer)
static RResult< std::uint32_t > DeserializeSchemaDescription(const void *buffer, std::uint64_t bufSize, ROOT::Internal::RNTupleDescriptorBuilder &descBuilder)
static std::uint32_t SerializeUInt64(std::uint64_t val, void *buffer)
static RResult< std::uint32_t > DeserializeFeatureFlags(const void *buffer, std::uint64_t bufSize, std::vector< std::uint64_t > &flags)
static RResult< RContext > SerializeHeader(void *buffer, const RNTupleDescriptor &desc)
static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos)
std::uint32_t GetNClusters() const
Metadata stored for every column of an RNTuple.
bool IsSuppressedDeferredColumn() const
std::optional< RValueRange > GetValueRange() const
std::uint64_t GetFirstElementIndex() const
ROOT::DescriptorId_t GetFieldId() const
bool IsAliasColumn() const
ROOT::ENTupleColumnType GetType() const
ROOT::DescriptorId_t GetPhysicalId() const
std::uint16_t GetRepresentationIndex() const
bool IsDeferredColumn() const
std::uint16_t GetBitsOnStorage() const
Metadata stored for every field of an RNTuple.
const std::string & GetTypeAlias() const
std::uint32_t GetFieldVersion() const
const std::vector< ROOT::DescriptorId_t > & GetLogicalColumnIds() const
ROOT::ENTupleStructure GetStructure() const
std::uint64_t GetNRepetitions() const
bool IsSoACollection() const
bool IsProjectedField() const
const std::string & GetFieldDescription() const
std::optional< std::uint32_t > GetTypeChecksum() const
std::uint32_t GetTypeVersion() const
const std::string & GetFieldName() const
const std::string & GetTypeName() const
The on-storage metadata of an RNTuple.
const RClusterGroupDescriptor & GetClusterGroupDescriptor(ROOT::DescriptorId_t clusterGroupId) const
const RColumnDescriptor & GetColumnDescriptor(ROOT::DescriptorId_t columnId) const
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
std::size_t GetNExtraTypeInfos() const
RColumnDescriptorIterable GetColumnIterable() const
const std::string & GetName() const
std::vector< std::uint64_t > GetFeatureFlags() const
ROOT::DescriptorId_t GetFieldZeroId() const
Returns the logical parent of all top-level RNTuple data fields.
std::size_t GetNAttributeSets() const
RExtraTypeInfoDescriptorIterable GetExtraTypeInfoIterable() const
std::size_t GetNPhysicalColumns() const
const RHeaderExtension * GetHeaderExtension() const
Return header extension information; if the descriptor does not have a header extension,...
const RClusterDescriptor & GetClusterDescriptor(ROOT::DescriptorId_t clusterId) const
std::uint64_t GetOnDiskHeaderXxHash3() const
std::size_t GetNFields() const
RResult< void > AddClusterGroupDetails(ROOT::DescriptorId_t clusterGroupId, std::vector< RClusterDescriptor > &clusterDescs)
Methods to load and drop cluster group details (cluster IDs and page locations)
ROOT::Experimental::RNTupleAttrSetDescriptorIterable GetAttrSetIterable() const
std::size_t GetNLogicalColumns() const
std::size_t GetNClusterGroups() const
const std::string & GetDescription() const
RNTupleLocator payload that is common for object stores using 64bit location information.
Generic information about the physical location of data.
std::uint64_t GetNBytesOnStorage() const
ELocatorType GetType() const
For non-disk locators, the value for the Type field.
std::uint8_t GetReserved() const
We currently only support one of the 8 available reserved bits (none are used so far).
T GetPosition() const
Note that for GetPosition() / SetPosition(), the locator type must correspond (kTypeFile,...
void SetType(ELocatorType type)
void SetPosition(std::uint64_t position)
void SetReserved(std::uint8_t reserved)
See GetReserved(): we ignore the reserved flag since we don't use it anywhere currently.
void SetNBytesOnStorage(std::uint64_t nBytesOnStorage)
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.
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 ROOT::ENTupleStructure kTestFutureFieldStructure
std::size_t LeadingZeroes(T x)
Given an integer x, returns the number of leading 0-bits starting at the most significant bit positio...
ROOT::RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
constexpr ENTupleColumnType kTestFutureColumnType
constexpr RNTupleLocator::ELocatorType kTestLocatorType
EExtraTypeInfoIds
Used in RExtraTypeInfoDescriptor.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
constexpr DescriptorId_t kInvalidDescriptorId
ENTupleStructure
The fields in the RNTuple data model tree can carry different structural information about the type s...
__device__ AFloat max(AFloat x, AFloat y)
REnvelopeLink fPageListEnvelopeLink
std::uint64_t fFirstEntry