51 std::uint32_t SerializeInt64(std::int64_t val,
void *buffer)
53 if (buffer !=
nullptr) {
54 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
55 bytes[0] = (val & 0x00000000000000FF);
56 bytes[1] = (val & 0x000000000000FF00) >> 8;
57 bytes[2] = (val & 0x0000000000FF0000) >> 16;
58 bytes[3] = (val & 0x00000000FF000000) >> 24;
59 bytes[4] = (val & 0x000000FF00000000) >> 32;
60 bytes[5] = (val & 0x0000FF0000000000) >> 40;
61 bytes[6] = (val & 0x00FF000000000000) >> 48;
62 bytes[7] = (val & 0xFF00000000000000) >> 56;
67 std::uint32_t SerializeUInt64(std::uint64_t val,
void *buffer)
69 return SerializeInt64(val, buffer);
72 std::uint32_t DeserializeInt64(
const void *buffer, std::int64_t *val)
74 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
75 *val = std::int64_t(bytes[0]) + (std::int64_t(bytes[1]) << 8) +
76 (std::int64_t(bytes[2]) << 16) + (std::int64_t(bytes[3]) << 24) +
77 (std::int64_t(bytes[4]) << 32) + (std::int64_t(bytes[5]) << 40) +
78 (std::int64_t(bytes[6]) << 48) + (std::int64_t(bytes[7]) << 56);
82 std::uint32_t DeserializeUInt64(
const void *buffer, std::uint64_t *val)
84 return DeserializeInt64(buffer, reinterpret_cast<std::int64_t *>(val));
87 std::uint32_t SerializeInt32(std::int32_t val,
void *buffer)
89 if (buffer !=
nullptr) {
90 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
91 bytes[0] = (val & 0x000000FF);
92 bytes[1] = (val & 0x0000FF00) >> 8;
93 bytes[2] = (val & 0x00FF0000) >> 16;
94 bytes[3] = (val & 0xFF000000) >> 24;
99 std::uint32_t SerializeUInt32(std::uint32_t val,
void *buffer)
101 return SerializeInt32(val, buffer);
104 std::uint32_t DeserializeInt32(
const void *buffer, std::int32_t *val)
106 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
107 *val = std::int32_t(bytes[0]) + (std::int32_t(bytes[1]) << 8) +
108 (std::int32_t(bytes[2]) << 16) + (std::int32_t(bytes[3]) << 24);
112 std::uint32_t DeserializeUInt32(
const void *buffer, std::uint32_t *val)
114 return DeserializeInt32(buffer, reinterpret_cast<std::int32_t *>(val));
117 std::uint32_t SerializeInt16(std::int16_t val,
void *buffer)
119 if (buffer !=
nullptr) {
120 auto bytes =
reinterpret_cast<unsigned char *
>(buffer);
121 bytes[0] = (val & 0x00FF);
122 bytes[1] = (val & 0xFF00) >> 8;
127 std::uint32_t SerializeUInt16(std::uint16_t val,
void *buffer)
129 return SerializeInt16(val, buffer);
132 std::uint32_t DeserializeInt16(
const void *buffer, std::int16_t *val)
134 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
135 *val = std::int16_t(bytes[0]) + (std::int16_t(bytes[1]) << 8);
139 std::uint32_t DeserializeUInt16(
const void *buffer, std::uint16_t *val)
141 return DeserializeInt16(buffer, reinterpret_cast<std::int16_t *>(val));
144 std::uint32_t SerializeClusterSize(ROOT::Experimental::ClusterSize_t val,
void *buffer)
146 return SerializeUInt32(val, buffer);
149 std::uint32_t DeserializeClusterSize(
const void *buffer, ROOT::Experimental::ClusterSize_t *val)
152 auto nbytes = DeserializeUInt32(buffer, &size);
157 std::uint32_t SerializeString(
const std::string &val,
void *buffer)
159 if (buffer !=
nullptr) {
160 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
161 pos += SerializeUInt32(val.length(), pos);
162 memcpy(pos, val.data(), val.length());
164 return SerializeUInt32(val.length(),
nullptr) + val.length();
167 std::uint32_t DeserializeString(
const void *buffer, std::string *val)
169 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
171 std::uint32_t length;
172 bytes += DeserializeUInt32(buffer, &length);
174 memcpy(&(*val)[0], bytes, length);
175 return bytes + length - base;
178 std::uint32_t SerializeLocator(
const ROOT::Experimental::RClusterDescriptor::RLocator &val,
void *buffer)
181 if (buffer !=
nullptr) {
182 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
183 pos += SerializeInt64(val.fPosition, pos);
184 pos += SerializeUInt32(val.fBytesOnStorage, pos);
185 pos += SerializeString(val.fUrl, pos);
187 return SerializeString(val.fUrl,
nullptr) + 12;
190 std::uint32_t DeserializeLocator(
const void *buffer, ROOT::Experimental::RClusterDescriptor::RLocator *val)
192 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
193 bytes += DeserializeInt64(bytes, &val->fPosition);
194 bytes += DeserializeUInt32(bytes, &val->fBytesOnStorage);
195 bytes += DeserializeString(bytes, &val->fUrl);
196 return SerializeString(val->fUrl,
nullptr) + 12;
199 std::uint32_t SerializeFrame(std::uint16_t protocolVersionCurrent, std::uint16_t protocolVersionMin,
void *buffer,
202 if (buffer !=
nullptr) {
203 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
204 pos += SerializeUInt16(protocolVersionCurrent, pos);
205 pos += SerializeUInt16(protocolVersionMin, pos);
207 pos += SerializeUInt32(0, pos);
212 std::uint32_t DeserializeFrame(std::uint16_t protocolVersion,
const void *buffer, std::uint32_t *size)
214 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
215 std::uint16_t protocolVersionAtWrite;
216 std::uint16_t protocolVersionMinRequired;
217 bytes += DeserializeUInt16(bytes, &protocolVersionAtWrite);
218 bytes += DeserializeUInt16(bytes, &protocolVersionMinRequired);
219 R__ASSERT(protocolVersionAtWrite >= protocolVersionMinRequired);
220 R__ASSERT(protocolVersion >= protocolVersionMinRequired);
221 bytes += DeserializeUInt32(bytes, size);
225 std::uint32_t SerializeVersion(
const ROOT::Experimental::RNTupleVersion &val,
void *buffer)
227 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
229 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
231 void *ptrSize =
nullptr;
232 pos += SerializeFrame(0, 0, *where, &ptrSize);
234 pos += SerializeUInt32(val.GetVersionUse(), *where);
235 pos += SerializeUInt32(val.GetVersionMin(), *where);
236 pos += SerializeUInt64(val.GetFlags(), *where);
238 auto size = pos - base;
239 SerializeUInt32(size, ptrSize);
243 std::uint32_t DeserializeVersion(
const void *buffer, ROOT::Experimental::RNTupleVersion *version)
245 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
246 std::uint32_t frameSize;
247 bytes += DeserializeFrame(0, bytes, &frameSize);
249 std::uint32_t versionUse;
250 std::uint32_t versionMin;
252 bytes += DeserializeUInt32(bytes, &versionUse);
253 bytes += DeserializeUInt32(bytes, &versionMin);
254 bytes += DeserializeUInt64(bytes, &flags);
255 *version = ROOT::Experimental::RNTupleVersion(versionUse, versionMin, flags);
260 std::uint32_t SerializeUuid(
const ROOT::Experimental::RNTupleUuid &val,
void *buffer)
262 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
264 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
266 void *ptrSize =
nullptr;
267 pos += SerializeFrame(0, 0, *where, &ptrSize);
269 pos += SerializeString(val, *where);
271 auto size = pos - base;
272 SerializeUInt32(size, ptrSize);
276 std::uint32_t DeserializeUuid(
const void *buffer, ROOT::Experimental::RNTupleUuid *uuid)
278 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
279 std::uint32_t frameSize;
280 bytes += DeserializeFrame(0, bytes, &frameSize);
282 bytes += DeserializeString(bytes, uuid);
287 std::uint32_t SerializeColumnModel(
const ROOT::Experimental::RColumnModel &val,
void *buffer)
289 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
291 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
293 void *ptrSize =
nullptr;
294 pos += SerializeFrame(0, 0, *where, &ptrSize);
296 pos += SerializeInt32(static_cast<int>(val.GetType()), *where);
297 pos += SerializeInt32(static_cast<int>(val.GetIsSorted()), *where);
299 auto size = pos - base;
300 SerializeUInt32(size, ptrSize);
304 std::uint32_t DeserializeColumnModel(
const void *buffer, ROOT::Experimental::RColumnModel *columnModel)
306 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
307 std::uint32_t frameSize;
308 bytes += DeserializeFrame(0, bytes, &frameSize);
311 std::int32_t isSorted;
312 bytes += DeserializeInt32(bytes, &type);
313 bytes += DeserializeInt32(bytes, &isSorted);
314 *columnModel = ROOT::Experimental::RColumnModel(static_cast<ROOT::Experimental::EColumnType>(type), isSorted);
319 std::uint32_t SerializeTimeStamp(
const std::chrono::system_clock::time_point &val,
void *buffer)
321 return SerializeInt64(std::chrono::system_clock::to_time_t(val), buffer);
324 std::uint32_t DeserializeTimeStamp(
const void *buffer, std::chrono::system_clock::time_point *timeStamp)
326 std::int64_t secSinceUnixEpoch;
327 auto size = DeserializeInt64(buffer, &secSinceUnixEpoch);
328 *timeStamp = std::chrono::system_clock::from_time_t(secSinceUnixEpoch);
332 std::uint32_t SerializeColumnRange(
const ROOT::Experimental::RClusterDescriptor::RColumnRange &val,
void *buffer)
335 if (buffer !=
nullptr) {
336 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
338 pos += SerializeUInt64(val.fFirstElementIndex, pos);
339 pos += SerializeClusterSize(val.fNElements, pos);
340 pos += SerializeInt64(val.fCompressionSettings, pos);
345 std::uint32_t DeserializeColumnRange(
const void *buffer,
346 ROOT::Experimental::RClusterDescriptor::RColumnRange *columnRange)
348 auto bytes =
reinterpret_cast<const unsigned char *
>(buffer);
350 bytes += DeserializeUInt64(bytes, &columnRange->fFirstElementIndex);
351 bytes += DeserializeClusterSize(bytes, &columnRange->fNElements);
352 bytes += DeserializeInt64(bytes, &columnRange->fCompressionSettings);
356 std::uint32_t SerializePageInfo(
const ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo &val,
void *buffer)
359 if (buffer !=
nullptr) {
360 auto pos =
reinterpret_cast<unsigned char *
>(buffer);
362 pos += SerializeClusterSize(val.fNElements, pos);
363 pos += SerializeLocator(val.fLocator, pos);
365 return 4 + SerializeLocator(val.fLocator,
nullptr);
368 std::uint32_t DeserializePageInfo(
const void *buffer,
369 ROOT::Experimental::RClusterDescriptor::RPageRange::RPageInfo *pageInfo)
371 auto base =
reinterpret_cast<const unsigned char *
>(buffer);
374 bytes += DeserializeClusterSize(bytes, &pageInfo->fNElements);
375 bytes += DeserializeLocator(bytes, &pageInfo->fLocator);
379 std::uint32_t SerializeCrc32(
const unsigned char *data, std::uint32_t length,
void *buffer)
381 auto checksum = R__crc32(0,
nullptr, 0);
382 if (buffer !=
nullptr) {
383 checksum = R__crc32(checksum, data, length);
384 SerializeUInt32(checksum, buffer);
389 void VerifyCrc32(
const unsigned char *data, std::uint32_t length)
391 auto checksumReal = R__crc32(0,
nullptr, 0);
392 checksumReal = R__crc32(checksumReal, data, length);
393 std::uint32_t checksumFound;
394 DeserializeUInt32(data + length, &checksumFound);
395 R__ASSERT(checksumFound == checksumReal);
398 std::uint32_t SerializeField(
const ROOT::Experimental::RFieldDescriptor &val,
void *buffer)
400 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
402 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
404 void *ptrSize =
nullptr;
405 pos += SerializeFrame(ROOT::Experimental::RFieldDescriptor::kFrameVersionCurrent,
406 ROOT::Experimental::RFieldDescriptor::kFrameVersionMin, *where, &ptrSize);
408 pos += SerializeUInt64(val.GetId(), *where);
409 pos += SerializeVersion(val.GetFieldVersion(), *where);
410 pos += SerializeVersion(val.GetTypeVersion(), *where);
411 pos += SerializeString(val.GetFieldName(), *where);
412 pos += SerializeString(val.GetFieldDescription(), *where);
413 pos += SerializeString(val.GetTypeName(), *where);
414 pos += SerializeUInt64(val.GetNRepetitions(), *where);
415 pos += SerializeUInt32(static_cast<int>(val.GetStructure()), *where);
416 pos += SerializeUInt64(val.GetParentId(), *where);
417 pos += SerializeUInt32(val.GetLinkIds().size(), *where);
418 for (
const auto& l : val.GetLinkIds())
419 pos += SerializeUInt64(l, *where);
421 auto size = pos - base;
422 SerializeUInt32(size, ptrSize);
426 std::uint32_t SerializeColumn(
const ROOT::Experimental::RColumnDescriptor &val,
void *buffer)
428 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
430 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
432 void *ptrSize =
nullptr;
433 pos += SerializeFrame(ROOT::Experimental::RColumnDescriptor::kFrameVersionCurrent,
434 ROOT::Experimental::RColumnDescriptor::kFrameVersionMin, *where, &ptrSize);
436 pos += SerializeUInt64(val.GetId(), *where);
437 pos += SerializeVersion(val.GetVersion(), *where);
438 pos += SerializeColumnModel(val.GetModel(), *where);
439 pos += SerializeUInt64(val.GetFieldId(), *where);
440 pos += SerializeUInt32(val.GetIndex(), *where);
442 auto size = pos - base;
443 SerializeUInt32(size, ptrSize);
447 std::uint32_t SerializeClusterSummary(
const ROOT::Experimental::RClusterDescriptor &val,
void *buffer)
449 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
451 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
453 void *ptrSize =
nullptr;
454 pos += SerializeFrame(ROOT::Experimental::RClusterDescriptor::kFrameVersionCurrent,
455 ROOT::Experimental::RClusterDescriptor::kFrameVersionMin, *where, &ptrSize);
457 pos += SerializeUInt64(val.GetId(), *where);
458 pos += SerializeVersion(val.GetVersion(), *where);
459 pos += SerializeUInt64(val.GetFirstEntryIndex(), *where);
460 pos += SerializeUInt64(val.GetNEntries(), *where);
461 pos += SerializeLocator(val.GetLocator(), *where);
463 auto size = pos - base;
464 SerializeUInt32(size, ptrSize);
474 bool ROOT::Experimental::RFieldDescriptor::operator==(
const RFieldDescriptor &other)
const {
475 return fFieldId == other.fFieldId &&
476 fFieldVersion == other.fFieldVersion &&
477 fTypeVersion == other.fTypeVersion &&
478 fFieldName == other.fFieldName &&
479 fFieldDescription == other.fFieldDescription &&
480 fTypeName == other.fTypeName &&
481 fNRepetitions == other.fNRepetitions &&
482 fStructure == other.fStructure &&
483 fParentId == other.fParentId &&
484 fLinkIds == other.fLinkIds;
491 bool ROOT::Experimental::RColumnDescriptor::operator==(
const RColumnDescriptor &other)
const {
492 return fColumnId == other.fColumnId &&
493 fVersion == other.fVersion &&
494 fModel == other.fModel &&
495 fFieldId == other.fFieldId &&
496 fIndex == other.fIndex;
503 bool ROOT::Experimental::RClusterDescriptor::operator==(
const RClusterDescriptor &other)
const {
504 return fClusterId == other.fClusterId &&
505 fVersion == other.fVersion &&
506 fFirstEntryIndex == other.fFirstEntryIndex &&
507 fNEntries == other.fNEntries &&
508 fLocator == other.fLocator &&
509 fColumnRanges == other.fColumnRanges &&
510 fPageRanges == other.fPageRanges;
517 bool ROOT::Experimental::RNTupleDescriptor::operator==(
const RNTupleDescriptor &other)
const {
518 return fName == other.fName &&
519 fDescription == other.fDescription &&
520 fAuthor == other.fAuthor &&
521 fCustodian == other.fCustodian &&
522 fTimeStampData == other.fTimeStampData &&
523 fTimeStampWritten == other.fTimeStampWritten &&
524 fVersion == other.fVersion &&
525 fOwnUuid == other.fOwnUuid &&
526 fGroupUuid == other.fGroupUuid &&
527 fFieldDescriptors == other.fFieldDescriptors &&
528 fColumnDescriptors == other.fColumnDescriptors &&
529 fClusterDescriptors == other.fClusterDescriptors;
533 std::uint32_t ROOT::Experimental::RNTupleDescriptor::SerializeHeader(
void* buffer)
const
535 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
537 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
539 void *ptrSize =
nullptr;
540 pos += SerializeFrame(
541 RNTupleDescriptor::kFrameVersionCurrent, RNTupleDescriptor::kFrameVersionMin, *where, &ptrSize);
542 pos += SerializeUInt64(0, *where);
544 pos += SerializeString(fName, *where);
545 pos += SerializeString(fDescription, *where);
546 pos += SerializeString(fAuthor, *where);
547 pos += SerializeString(fCustodian, *where);
548 pos += SerializeTimeStamp(fTimeStampData, *where);
549 pos += SerializeTimeStamp(fTimeStampWritten, *where);
550 pos += SerializeVersion(fVersion, *where);
551 pos += SerializeUuid(fOwnUuid, *where);
552 pos += SerializeUuid(fGroupUuid, *where);
553 pos += SerializeUInt32(fFieldDescriptors.size(), *where);
554 for (
const auto& f : fFieldDescriptors) {
555 pos += SerializeField(f.second, *where);
557 pos += SerializeUInt32(fColumnDescriptors.size(), *where);
558 for (
const auto& c : fColumnDescriptors) {
559 pos += SerializeColumn(c.second, *where);
562 std::uint32_t size = pos - base;
563 SerializeUInt32(size, ptrSize);
564 size += SerializeCrc32(base, size, *where);
569 std::uint32_t ROOT::Experimental::RNTupleDescriptor::SerializeFooter(
void* buffer)
const
571 auto base =
reinterpret_cast<unsigned char *
>((buffer !=
nullptr) ? buffer : 0);
573 void** where = (buffer ==
nullptr) ? &buffer : reinterpret_cast<void**>(&pos);
575 void *ptrSize =
nullptr;
576 pos += SerializeFrame(
577 RNTupleDescriptor::kFrameVersionCurrent, RNTupleDescriptor::kFrameVersionMin, *where, &ptrSize);
578 pos += SerializeUInt64(0, *where);
580 pos += SerializeUInt64(fClusterDescriptors.size(), *where);
581 for (
const auto& cluster : fClusterDescriptors) {
582 pos += SerializeUuid(fOwnUuid, *where);
583 pos += SerializeClusterSummary(cluster.second, *where);
585 pos += SerializeUInt32(fColumnDescriptors.size(), *where);
586 for (
const auto& column : fColumnDescriptors) {
587 auto columnId = column.first;
588 pos += SerializeUInt64(columnId, *where);
590 const auto &columnRange = cluster.second.GetColumnRange(columnId);
591 R__ASSERT(columnRange.fColumnId == columnId);
592 pos += SerializeColumnRange(columnRange, *where);
594 const auto &pageRange = cluster.second.GetPageRange(columnId);
595 R__ASSERT(pageRange.fColumnId == columnId);
596 auto nPages = pageRange.fPageInfos.size();
597 pos += SerializeUInt32(nPages, *where);
598 for (
unsigned int i = 0; i < nPages; ++i) {
599 pos += SerializePageInfo(pageRange.fPageInfos[i], *where);
605 pos += SerializeUInt16(kFrameVersionCurrent, *where);
606 pos += SerializeUInt16(kFrameVersionMin, *where);
608 pos += SerializeUInt32(SerializeHeader(
nullptr), *where);
609 std::uint32_t size = pos - base + 4;
610 pos += SerializeUInt32(size + 4, *where);
611 size += SerializeCrc32(base, size, *where);
617 void ROOT::Experimental::RNTupleDescriptor::LocateMetadata(
618 const void *postscript, std::uint32_t &szHeader, std::uint32_t &szFooter)
620 auto pos =
reinterpret_cast<const unsigned char *
>(postscript);
622 pos += DeserializeUInt16(pos, &dummy);
623 pos += DeserializeUInt16(pos, &dummy);
624 pos += DeserializeUInt32(pos, &szHeader);
625 pos += DeserializeUInt32(pos, &szFooter);
629 ROOT::Experimental::NTupleSize_t ROOT::Experimental::RNTupleDescriptor::GetNEntries()
const
631 NTupleSize_t result = 0;
632 for (
const auto &cd : fClusterDescriptors) {
633 result = std::max(result, cd.second.GetFirstEntryIndex() + cd.second.GetNEntries());
638 ROOT::Experimental::NTupleSize_t ROOT::Experimental::RNTupleDescriptor::GetNElements(DescriptorId_t columnId)
const
640 NTupleSize_t result = 0;
641 for (
const auto &cd : fClusterDescriptors) {
642 auto columnRange = cd.second.GetColumnRange(columnId);
643 result = std::max(result, columnRange.fFirstElementIndex + columnRange.fNElements);
648 ROOT::Experimental::DescriptorId_t
649 ROOT::Experimental::RNTupleDescriptor::FindFieldId(std::string_view fieldName, DescriptorId_t parentId)
const
651 std::string leafName(fieldName);
652 auto posDot = leafName.find_last_of(
'.');
653 if (posDot != std::string::npos) {
654 auto parentName = leafName.substr(0, posDot);
655 leafName = leafName.substr(posDot + 1);
656 parentId = FindFieldId(parentName, parentId);
658 for (
const auto &fd : fFieldDescriptors) {
659 if (fd.second.GetParentId() == parentId && fd.second.GetFieldName() == leafName)
660 return fd.second.GetId();
662 return kInvalidDescriptorId;
666 ROOT::Experimental::DescriptorId_t ROOT::Experimental::RNTupleDescriptor::FindFieldId(std::string_view fieldName)
const
668 auto rootId = FindFieldId(
"", kInvalidDescriptorId);
669 return FindFieldId(fieldName, rootId);
673 ROOT::Experimental::DescriptorId_t
674 ROOT::Experimental::RNTupleDescriptor::FindColumnId(DescriptorId_t fieldId, std::uint32_t columnIndex)
const
676 for (
const auto &cd : fColumnDescriptors) {
677 if (cd.second.GetFieldId() == fieldId && cd.second.GetIndex() == columnIndex)
678 return cd.second.GetId();
680 return kInvalidDescriptorId;
684 ROOT::Experimental::DescriptorId_t
685 ROOT::Experimental::RNTupleDescriptor::FindClusterId(DescriptorId_t columnId, NTupleSize_t index)
const
688 for (
const auto &cd : fClusterDescriptors) {
689 auto columnRange = cd.second.GetColumnRange(columnId);
690 if (columnRange.Contains(index))
691 return cd.second.GetId();
693 return kInvalidDescriptorId;
697 std::unique_ptr<ROOT::Experimental::RNTupleModel> ROOT::Experimental::RNTupleDescriptor::GenerateModel()
const
699 auto model = std::make_unique<RNTupleModel>();
700 auto rootId = FindFieldId(
"", kInvalidDescriptorId);
701 const auto &rootDesc = GetFieldDescriptor(rootId);
702 for (
const auto id : rootDesc.GetLinkIds()) {
703 const auto &topDesc = GetFieldDescriptor(
id);
704 auto field = Detail::RFieldBase::Create(topDesc.GetFieldName(), topDesc.GetTypeName());
705 model->AddField(std::unique_ptr<Detail::RFieldBase>(field));
714 ROOT::Experimental::RNTupleDescriptor ROOT::Experimental::RNTupleDescriptorBuilder::MoveDescriptor()
716 RNTupleDescriptor result;
717 std::swap(result, fDescriptor);
721 void ROOT::Experimental::RNTupleDescriptorBuilder::SetFromHeader(
void* headerBuffer)
723 auto pos =
reinterpret_cast<unsigned char *
>(headerBuffer);
726 std::uint32_t frameSize;
727 pos += DeserializeFrame(RNTupleDescriptor::kFrameVersionCurrent, base, &frameSize);
728 VerifyCrc32(base, frameSize);
729 std::uint64_t reserved;
730 pos += DeserializeUInt64(pos, &reserved);
732 pos += DeserializeString(pos, &fDescriptor.fName);
733 pos += DeserializeString(pos, &fDescriptor.fDescription);
734 pos += DeserializeString(pos, &fDescriptor.fAuthor);
735 pos += DeserializeString(pos, &fDescriptor.fCustodian);
736 pos += DeserializeTimeStamp(pos, &fDescriptor.fTimeStampData);
737 pos += DeserializeTimeStamp(pos, &fDescriptor.fTimeStampWritten);
738 pos += DeserializeVersion(pos, &fDescriptor.fVersion);
739 pos += DeserializeUuid(pos, &fDescriptor.fOwnUuid);
740 pos += DeserializeUuid(pos, &fDescriptor.fGroupUuid);
742 std::uint32_t nFields;
743 pos += DeserializeUInt32(pos, &nFields);
744 for (std::uint32_t i = 0; i < nFields; ++i) {
745 auto fieldBase = pos;
746 pos += DeserializeFrame(RFieldDescriptor::kFrameVersionCurrent, fieldBase, &frameSize);
749 pos += DeserializeUInt64(pos, &f.fFieldId);
750 pos += DeserializeVersion(pos, &f.fFieldVersion);
751 pos += DeserializeVersion(pos, &f.fTypeVersion);
752 pos += DeserializeString(pos, &f.fFieldName);
753 pos += DeserializeString(pos, &f.fFieldDescription);
754 pos += DeserializeString(pos, &f.fTypeName);
755 pos += DeserializeUInt64(pos, &f.fNRepetitions);
756 std::int32_t structure;
757 pos += DeserializeInt32(pos, &structure);
758 f.fStructure =
static_cast<ENTupleStructure
>(structure);
759 pos += DeserializeUInt64(pos, &f.fParentId);
761 std::uint32_t nLinks;
762 pos += DeserializeUInt32(pos, &nLinks);
763 f.fLinkIds.resize(nLinks);
764 for (std::uint32_t j = 0; j < nLinks; ++j) {
765 pos += DeserializeUInt64(pos, &f.fLinkIds[j]);
768 pos = fieldBase + frameSize;
769 fDescriptor.fFieldDescriptors.emplace(f.fFieldId, std::move(f));
772 std::uint32_t nColumns;
773 pos += DeserializeUInt32(pos, &nColumns);
774 for (std::uint32_t i = 0; i < nColumns; ++i) {
775 auto columnBase = pos;
776 pos += DeserializeFrame(RColumnDescriptor::kFrameVersionCurrent, columnBase, &frameSize);
779 pos += DeserializeUInt64(pos, &c.fColumnId);
780 pos += DeserializeVersion(pos, &c.fVersion);
781 pos += DeserializeColumnModel(pos, &c.fModel);
782 pos += DeserializeUInt64(pos, &c.fFieldId);
783 pos += DeserializeUInt32(pos, &c.fIndex);
785 pos = columnBase + frameSize;
786 fDescriptor.fColumnDescriptors.emplace(c.fColumnId, std::move(c));
790 void ROOT::Experimental::RNTupleDescriptorBuilder::AddClustersFromFooter(
void* footerBuffer) {
791 auto pos =
reinterpret_cast<unsigned char *
>(footerBuffer);
794 std::uint32_t frameSize;
795 pos += DeserializeFrame(RNTupleDescriptor::kFrameVersionCurrent, pos, &frameSize);
796 VerifyCrc32(base, frameSize);
797 std::uint64_t reserved;
798 pos += DeserializeUInt64(pos, &reserved);
800 std::uint64_t nClusters;
801 pos += DeserializeUInt64(pos, &nClusters);
802 for (std::uint64_t i = 0; i < nClusters; ++i) {
804 pos += DeserializeUuid(pos, &uuid);
805 R__ASSERT(uuid == fDescriptor.fOwnUuid);
806 auto clusterBase = pos;
807 pos += DeserializeFrame(RClusterDescriptor::kFrameVersionCurrent, clusterBase, &frameSize);
809 std::uint64_t clusterId;
810 RNTupleVersion version;
811 std::uint64_t firstEntry;
812 std::uint64_t nEntries;
813 pos += DeserializeUInt64(pos, &clusterId);
814 pos += DeserializeVersion(pos, &version);
815 pos += DeserializeUInt64(pos, &firstEntry);
816 pos += DeserializeUInt64(pos, &nEntries);
817 AddCluster(clusterId, version, firstEntry, ROOT::Experimental::ClusterSize_t(nEntries));
818 RClusterDescriptor::RLocator locator;
819 pos += DeserializeLocator(pos, &locator);
820 SetClusterLocator(clusterId, locator);
822 pos = clusterBase + frameSize;
824 std::uint32_t nColumns;
825 pos += DeserializeUInt32(pos, &nColumns);
826 for (std::uint32_t j = 0; j < nColumns; ++j) {
828 pos += DeserializeUInt64(pos, &columnId);
830 RClusterDescriptor::RColumnRange columnRange;
831 columnRange.fColumnId = columnId;
832 pos += DeserializeColumnRange(pos, &columnRange);
833 AddClusterColumnRange(clusterId, columnRange);
835 RClusterDescriptor::RPageRange pageRange;
836 pageRange.fColumnId = columnId;
838 pos += DeserializeUInt32(pos, &nPages);
839 for (
unsigned int k = 0; k < nPages; ++k) {
840 RClusterDescriptor::RPageRange::RPageInfo pageInfo;
841 pos += DeserializePageInfo(pos, &pageInfo);
842 pageRange.fPageInfos.emplace_back(pageInfo);
844 AddClusterPageRange(clusterId, std::move(pageRange));
849 void ROOT::Experimental::RNTupleDescriptorBuilder::SetNTuple(
850 const std::string_view name,
const std::string_view description,
const std::string_view author,
851 const RNTupleVersion &version,
const RNTupleUuid &uuid)
853 fDescriptor.fName = std::string(name);
854 fDescriptor.fDescription = std::string(description);
855 fDescriptor.fAuthor = std::string(author);
856 fDescriptor.fVersion = version;
857 fDescriptor.fOwnUuid = uuid;
858 fDescriptor.fGroupUuid = uuid;
861 void ROOT::Experimental::RNTupleDescriptorBuilder::AddField(
862 DescriptorId_t fieldId,
const RNTupleVersion &fieldVersion,
const RNTupleVersion &typeVersion,
863 std::string_view fieldName, std::string_view typeName, std::uint64_t nRepetitions, ENTupleStructure structure)
866 f.fFieldId = fieldId;
867 f.fFieldVersion = fieldVersion;
868 f.fTypeVersion = typeVersion;
869 f.fFieldName = std::string(fieldName);
870 f.fTypeName = std::string(typeName);
871 f.fNRepetitions = nRepetitions;
872 f.fStructure = structure;
873 fDescriptor.fFieldDescriptors.emplace(fieldId, std::move(f));
876 void ROOT::Experimental::RNTupleDescriptorBuilder::AddFieldLink(DescriptorId_t fieldId, DescriptorId_t linkId)
878 R__ASSERT(fDescriptor.fFieldDescriptors[linkId].fParentId == kInvalidDescriptorId);
879 fDescriptor.fFieldDescriptors[linkId].fParentId = fieldId;
880 fDescriptor.fFieldDescriptors[fieldId].fLinkIds.push_back(linkId);
883 void ROOT::Experimental::RNTupleDescriptorBuilder::AddColumn(
884 DescriptorId_t columnId, DescriptorId_t fieldId,
const RNTupleVersion &version,
const RColumnModel &model,
888 c.fColumnId = columnId;
889 c.fFieldId = fieldId;
890 c.fVersion = version;
893 fDescriptor.fColumnDescriptors.emplace(columnId, std::move(c));
896 void ROOT::Experimental::RNTupleDescriptorBuilder::AddCluster(
897 DescriptorId_t clusterId, RNTupleVersion version, NTupleSize_t firstEntryIndex, ClusterSize_t nEntries)
899 RClusterDescriptor c;
900 c.fClusterId = clusterId;
901 c.fVersion = version;
902 c.fFirstEntryIndex = firstEntryIndex;
903 c.fNEntries = nEntries;
904 fDescriptor.fClusterDescriptors.emplace(clusterId, std::move(c));
907 void ROOT::Experimental::RNTupleDescriptorBuilder::SetClusterLocator(DescriptorId_t clusterId,
908 RClusterDescriptor::RLocator locator)
910 fDescriptor.fClusterDescriptors[clusterId].fLocator = locator;
913 void ROOT::Experimental::RNTupleDescriptorBuilder::AddClusterColumnRange(
914 DescriptorId_t clusterId,
const RClusterDescriptor::RColumnRange &columnRange)
916 fDescriptor.fClusterDescriptors[clusterId].fColumnRanges[columnRange.fColumnId] = columnRange;
919 void ROOT::Experimental::RNTupleDescriptorBuilder::AddClusterPageRange(
920 DescriptorId_t clusterId, RClusterDescriptor::RPageRange &&pageRange)
922 fDescriptor.fClusterDescriptors[clusterId].fPageRanges.emplace(pageRange.fColumnId, std::move(pageRange));