23#ifndef R__LITTLE_ENDIAN
26#define R__LITTLE_ENDIAN 1
28#define R__LITTLE_ENDIAN 0
88template <std::
size_t N>
93 for (std::size_t i = 0; i < count; ++i) {
98template <std::
size_t N>
102 for (std::size_t i = 0; i < count; ++i) {
108#if R__LITTLE_ENDIAN == 0
112 constexpr auto N =
sizeof(T);
131#define ByteSwapIfNecessary(x) ((void)0)
135template <
typename DestT,
typename SourceT>
140 if constexpr (!std::is_integral_v<DestT> || !std::is_integral_v<SourceT>)
143 if constexpr (
static_cast<double>(std::numeric_limits<SourceT>::min()) <
144 static_cast<double>(std::numeric_limits<DestT>::min())) {
145 if constexpr (!std::is_signed_v<DestT>) {
147 throw RException(
R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
150 }
else if (val < std::numeric_limits<DestT>::min()) {
152 R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
typeid(
DestT).
name()));
156 if constexpr (
static_cast<double>(std::numeric_limits<SourceT>::max()) >
157 static_cast<double>(std::numeric_limits<DestT>::max())) {
158 if (val > std::numeric_limits<DestT>::max()) {
160 R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
typeid(
DestT).
name()));
166template <
typename DestT,
typename SourceT>
169 if constexpr (std::is_same_v<DestT, float> && std::is_same_v<SourceT, double>) {
170 if (std::fpclassify(
src) != std::fpclassify(
dst)) {
172 " on disk to " + std::to_string(
dst) +
" in memory"));
181template <
typename DestT,
typename SourceT>
184 static_assert(std::is_convertible_v<SourceT, DestT>);
187 for (std::size_t i = 0; i < count; ++i) {
197template <
typename DestT,
typename SourceT>
202 for (std::size_t i = 0; i < count; ++i) {
214template <
typename DestT,
typename SourceT>
217 constexpr std::size_t
N =
sizeof(
DestT);
220 for (std::size_t i = 0; i < count; ++i) {
223 for (std::size_t
b = 0;
b <
N; ++
b) {
224 splitArray[
b * count + i] =
reinterpret_cast<const char *
>(&val)[
b];
232template <
typename DestT,
typename SourceT>
235 constexpr std::size_t
N =
sizeof(
SourceT);
238 for (std::size_t i = 0; i < count; ++i) {
240 for (std::size_t
b = 0;
b <
N; ++
b) {
241 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
253template <
typename DestT,
typename SourceT>
256 constexpr std::size_t
N =
sizeof(
DestT);
259 for (std::size_t i = 0; i < count; ++i) {
262 for (std::size_t
b = 0;
b <
N; ++
b) {
263 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
271template <
typename DestT,
typename SourceT>
274 constexpr std::size_t
N =
sizeof(
SourceT);
277 for (std::size_t i = 0; i < count; ++i) {
279 for (std::size_t
b = 0;
b <
N; ++
b) {
280 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
283 val = (i == 0) ? val : val +
dst[i - 1];
292template <
typename DestT,
typename SourceT>
295 using UDestT = std::make_unsigned_t<DestT>;
297 constexpr std::size_t
N =
sizeof(
DestT);
300 for (std::size_t i = 0; i < count; ++i) {
303 for (std::size_t
b = 0;
b <
N; ++
b) {
304 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
312template <
typename DestT,
typename SourceT>
315 using USourceT = std::make_unsigned_t<SourceT>;
316 constexpr std::size_t
N =
sizeof(
SourceT);
319 for (std::size_t i = 0; i < count; ++i) {
321 for (std::size_t
b = 0;
b <
N; ++
b) {
322 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
340template <
typename CppT, ENTupleColumnType>
343template <
typename CppT>
347 case ENTupleColumnType::kIndex64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex64>>();
348 case ENTupleColumnType::kIndex32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex32>>();
349 case ENTupleColumnType::kSwitch:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSwitch>>();
350 case ENTupleColumnType::kByte:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kByte>>();
351 case ENTupleColumnType::kChar:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kChar>>();
352 case ENTupleColumnType::kBit:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kBit>>();
353 case ENTupleColumnType::kReal64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal64>>();
354 case ENTupleColumnType::kReal32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32>>();
355 case ENTupleColumnType::kReal16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal16>>();
356 case ENTupleColumnType::kInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt64>>();
357 case ENTupleColumnType::kUInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt64>>();
358 case ENTupleColumnType::kInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt32>>();
359 case ENTupleColumnType::kUInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt32>>();
360 case ENTupleColumnType::kInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt16>>();
361 case ENTupleColumnType::kUInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt16>>();
362 case ENTupleColumnType::kInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt8>>();
363 case ENTupleColumnType::kUInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt8>>();
364 case ENTupleColumnType::kSplitIndex64:
365 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex64>>();
366 case ENTupleColumnType::kSplitIndex32:
367 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex32>>();
368 case ENTupleColumnType::kSplitReal64:
369 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal64>>();
370 case ENTupleColumnType::kSplitReal32:
371 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal32>>();
372 case ENTupleColumnType::kSplitInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt64>>();
373 case ENTupleColumnType::kSplitUInt64:
374 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt64>>();
375 case ENTupleColumnType::kSplitInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt32>>();
376 case ENTupleColumnType::kSplitUInt32:
377 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt32>>();
378 case ENTupleColumnType::kSplitInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt16>>();
379 case ENTupleColumnType::kSplitUInt16:
380 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt16>>();
381 case ENTupleColumnType::kReal32Trunc:
382 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Trunc>>();
383 case ENTupleColumnType::kReal32Quant:
384 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Quant>>();
387 return std::make_unique<RColumnElement<CppT, kTestFutureColumnType>>();
398template <
typename CppT>
399class RColumnElementLE :
public RColumnElementBase {
406 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
408#if R__LITTLE_ENDIAN == 1
409 RColumnElementBase::Pack(
dst,
src, count);
414 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
416#if R__LITTLE_ENDIAN == 1
417 RColumnElementBase::Unpack(
dst,
src, count);
428template <
typename CppT,
typename NarrowT>
429class RColumnElementCastLE :
public RColumnElementBase {
436 static constexpr bool kIsMappable =
false;
439 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
450template <
typename CppT,
typename NarrowT>
451class RColumnElementSplitLE :
public RColumnElementBase {
458 static constexpr bool kIsMappable =
false;
460 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
464 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
475template <
typename CppT,
typename NarrowT>
476class RColumnElementDeltaSplitLE :
public RColumnElementBase {
484 static constexpr bool kIsMappable =
false;
486 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
490 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
497template <
typename CppIntT>
498class RColumnElementBoolAsUnsplitInt :
public RColumnElementBase {
500 explicit RColumnElementBoolAsUnsplitInt(std::size_t
size, std::size_t
bitsOnStorage)
506 static constexpr bool kIsMappable =
false;
509 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
511 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
515 for (std::size_t i = 0; i < count; ++i) {
522template <
typename CppIntT>
523class RColumnElementBoolAsSplitInt :
public RColumnElementBase {
525 explicit RColumnElementBoolAsSplitInt(std::size_t
size, std::size_t
bitsOnStorage)
531 static constexpr bool kIsMappable =
false;
534 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
536 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
538 constexpr std::size_t
N =
sizeof(
CppIntT);
541 for (std::size_t i = 0; i < count; ++i) {
543 for (std::size_t
b = 0;
b <
N; ++
b) {
554template <
typename CppIntT>
555class RColumnElementIntAsBool :
public RColumnElementBase {
563 static constexpr bool kIsMappable =
false;
566 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
568 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
571 const char *
charArray =
reinterpret_cast<const char *
>(
src);
573 for (std::size_t i = 0; i < count; i += 8) {
575 for (std::size_t
j = i;
j < std::min(count, i + 8); ++
j) {
587template <
typename CppT,
typename NarrowT>
588class RColumnElementZigzagSplitLE :
public RColumnElementBase {
590 explicit RColumnElementZigzagSplitLE(std::size_t
size, std::size_t
bitsOnStorage)
596 static constexpr bool kIsMappable =
false;
598 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
602 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
616template <
typename CppT, ENTupleColumnType ColumnT = ENTupleColumnType::kUnknown>
617class RColumnElement :
public RColumnElementBase {
619 RColumnElement() : RColumnElementBase(
sizeof(
CppT))
625 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
CppT), ENTupleColumnType::kUnknown}; }
631 static constexpr std::size_t
kSize =
sizeof(
bool);
632 RColumnElement() : RColumnElementBase(
kSize) {}
633 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kUnknown}; }
637class RColumnElement<std::
byte, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
639 static constexpr std::size_t
kSize =
sizeof(std::byte);
640 RColumnElement() : RColumnElementBase(
kSize) {}
641 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::byte), ENTupleColumnType::kUnknown}; }
647 static constexpr std::size_t
kSize =
sizeof(char);
648 RColumnElement() : RColumnElementBase(
kSize) {}
649 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(char), ENTupleColumnType::kUnknown}; }
653class RColumnElement<std::int8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
655 static constexpr std::size_t
kSize =
sizeof(std::int8_t);
656 RColumnElement() : RColumnElementBase(
kSize) {}
657 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int8_t), ENTupleColumnType::kUnknown}; }
661class RColumnElement<std::uint8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
663 static constexpr std::size_t
kSize =
sizeof(std::uint8_t);
664 RColumnElement() : RColumnElementBase(
kSize) {}
665 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint8_t), ENTupleColumnType::kUnknown}; }
669class RColumnElement<std::int16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
671 static constexpr std::size_t
kSize =
sizeof(std::int16_t);
672 RColumnElement() : RColumnElementBase(
kSize) {}
673 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int16_t), ENTupleColumnType::kUnknown}; }
677class RColumnElement<std::uint16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
679 static constexpr std::size_t
kSize =
sizeof(std::uint16_t);
680 RColumnElement() : RColumnElementBase(
kSize) {}
681 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint16_t), ENTupleColumnType::kUnknown}; }
685class RColumnElement<std::int32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
687 static constexpr std::size_t
kSize =
sizeof(std::int32_t);
688 RColumnElement() : RColumnElementBase(
kSize) {}
689 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int32_t), ENTupleColumnType::kUnknown}; }
693class RColumnElement<std::uint32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
695 static constexpr std::size_t
kSize =
sizeof(std::uint32_t);
696 RColumnElement() : RColumnElementBase(
kSize) {}
697 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint32_t), ENTupleColumnType::kUnknown}; }
701class RColumnElement<std::int64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
703 static constexpr std::size_t
kSize =
sizeof(std::int64_t);
704 RColumnElement() : RColumnElementBase(
kSize) {}
705 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int64_t), ENTupleColumnType::kUnknown}; }
709class RColumnElement<std::uint64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
711 static constexpr std::size_t
kSize =
sizeof(std::uint64_t);
712 RColumnElement() : RColumnElementBase(
kSize) {}
713 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint64_t), ENTupleColumnType::kUnknown}; }
719 static constexpr std::size_t
kSize =
sizeof(float);
720 RColumnElement() : RColumnElementBase(
kSize) {}
721 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kUnknown}; }
727 static constexpr std::size_t
kSize =
sizeof(
double);
728 RColumnElement() : RColumnElementBase(
kSize) {}
729 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kUnknown}; }
733class RColumnElement<
ROOT::Internal::RColumnIndex, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
736 RColumnElement() : RColumnElementBase(
kSize) {}
744class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
747 RColumnElement() : RColumnElementBase(
kSize) {}
760class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kSwitch> :
public RColumnElementBase {
763 std::uint64_t fIndex;
768 static constexpr bool kIsMappable =
false;
770 static constexpr std::size_t kBitsOnStorage = 96;
771 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
772 bool IsMappable()
const final {
return kIsMappable; }
774 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
777 auto dstArray =
reinterpret_cast<unsigned char *
>(
dst);
778 for (std::size_t i = 0; i < count; ++i) {
780#if R__LITTLE_ENDIAN == 0
788 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
790 auto srcArray =
reinterpret_cast<const unsigned char *
>(
src);
792 for (std::size_t i = 0; i < count; ++i) {
795#if R__LITTLE_ENDIAN == 0
812 static constexpr bool kIsMappable =
false;
813 static constexpr std::size_t
kSize =
sizeof(
bool);
814 static constexpr std::size_t kBitsOnStorage = 1;
815 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
816 bool IsMappable()
const final {
return kIsMappable; }
818 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final;
819 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final;
821 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kBit}; }
827 static constexpr bool kIsMappable =
false;
828 static constexpr std::size_t
kSize =
sizeof(float);
829 static constexpr std::size_t kBitsOnStorage = 16;
830 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
831 bool IsMappable()
const final {
return kIsMappable; }
833 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
835 const float *
floatArray =
reinterpret_cast<const float *
>(
src);
836 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
838 for (std::size_t i = 0; i < count; ++i) {
844 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
847 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
849 for (std::size_t i = 0; i < count; ++i) {
856 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kReal16}; }
862 static constexpr bool kIsMappable =
false;
863 static constexpr std::size_t
kSize =
sizeof(
double);
864 static constexpr std::size_t kBitsOnStorage = 16;
865 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
866 bool IsMappable()
const final {
return kIsMappable; }
868 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
870 const double *
doubleArray =
reinterpret_cast<const double *
>(
src);
871 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
873 for (std::size_t i = 0; i < count; ++i) {
879 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
882 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
884 for (std::size_t i = 0; i < count; ++i) {
891 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kReal16}; }
895class RColumnElementTrunc :
public RColumnElementBase {
897 static_assert(std::is_floating_point_v<T>);
898 static constexpr bool kIsMappable =
false;
899 static constexpr std::size_t
kSize =
sizeof(T);
904 RColumnElementTrunc() : RColumnElementBase(
kSize, 0) {}
908 const auto &[
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Trunc);
913 bool IsMappable()
const final {
return kIsMappable; }
915 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Trunc}; }
921 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
927#if R__LITTLE_ENDIAN == 0
934 const auto *
srcLe =
reinterpret_cast<const float *
>(
src);
939 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
946#if R__LITTLE_ENDIAN == 0
955 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
964 const double *
srcDouble =
reinterpret_cast<const double *
>(
src);
965 for (std::size_t i = 0; i < count; ++i)
968#if R__LITTLE_ENDIAN == 0
975 const float *
srcLe =
reinterpret_cast<const float *
>(
srcFloat.get());
980 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
989#if R__LITTLE_ENDIAN == 0
994 for (std::size_t i = 0; i < count; ++i)
1009 unsigned long idx = 0;
1011 return static_cast<std::size_t
>(31 - idx);
1024 unsigned long idx = 0;
1026 return static_cast<std::size_t
>(idx);
1039template <
typename T>
1042 static_assert(std::is_floating_point_v<T>);
1043 static_assert(
sizeof(T) <=
sizeof(
double));
1048 assert(min ==
static_cast<double>(
static_cast<T
>(min)));
1049 assert(max ==
static_cast<double>(
static_cast<T
>(max)));
1057 for (std::size_t i = 0; i < count; ++i) {
1080template <
typename T>
1083 static_assert(std::is_floating_point_v<T>);
1084 static_assert(
sizeof(T) <=
sizeof(
double));
1090 const double eps = std::numeric_limits<double>::epsilon();
1091 const double emax = max + std::max(1.0, std::abs(max)) * eps;
1095 for (std::size_t i = 0; i < count; ++i) {
1102 const double fq =
static_cast<double>(
elem);
1114 e = std::min(
e, max);
1116 dst[i] =
static_cast<T
>(
e);
1123template <
typename T>
1125 static_assert(std::is_floating_point_v<T>);
1128 static constexpr bool kIsMappable =
false;
1129 static constexpr std::size_t
kSize =
sizeof(T);
1135 const auto [
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Quant);
1140 void SetValueRange(
double min,
double max)
final
1142 R__ASSERT(min >= std::numeric_limits<T>::lowest());
1143 R__ASSERT(max <= std::numeric_limits<T>::max());
1145 R__ASSERT(std::isnormal(min) || min == 0.0);
1146 R__ASSERT(std::isnormal(max) || max == 0.0);
1147 fValueRange = {min, max};
1150 bool IsMappable()
const final {
return kIsMappable; }
1152 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
1159 const auto [min, max] = *fValueRange;
1161 Quantize::QuantizeReals(
quantized.get(),
reinterpret_cast<const T *
>(
src), count, min, max, fBitsOnStorage);
1164 " values were found of of range for quantization while packing (range is [" +
1165 std::to_string(min) +
", " + std::to_string(max) +
"])"));
1167 BitPacking::PackBits(
dst,
quantized.get(), count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1170 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
1177 const auto [min, max] = *fValueRange;
1178 BitPacking::UnpackBits(
quantized.get(),
src, count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1180 Quantize::UnquantizeReals(
reinterpret_cast<T *
>(
dst),
quantized.get(), count, min, max, fBitsOnStorage);
1187 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Quant}; }
1196#define __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1197 static constexpr std::size_t kSize = sizeof(CppT); \
1198 static constexpr std::size_t kBitsOnStorage = BitsOnStorage; \
1199 RColumnElement() : BaseT(kSize, kBitsOnStorage) {} \
1200 bool IsMappable() const final \
1202 return kIsMappable; \
1204 RIdentifier GetIdentifier() const final \
1206 return RIdentifier{typeid(CppT), ColumnT}; \
1214#define DECLARE_RCOLUMNELEMENT_SPEC(CppT, ColumnT, BitsOnStorage, BaseT, ...) \
1216 class RColumnElement<CppT, ColumnT> : public BaseT __VA_ARGS__ { \
1218 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1220#define DECLARE_RCOLUMNELEMENT_SPEC_SIMPLE(CppT, ColumnT, BitsOnStorage) \
1222 class RColumnElement<CppT, ColumnT> : public RColumnElementBase { \
1224 static constexpr bool kIsMappable = true; \
1225 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, RColumnElementBase, BitsOnStorage) \
1256 <
char, std::int16_t>);
1259 <
char, std::int32_t>);
1262 <
char, std::int64_t>);
1269 <std::int8_t, std::uint8_t>);
1271 <std::int8_t, std::int16_t>);
1273 <std::int8_t, std::uint16_t>);
1275 <std::int8_t, std::int32_t>);
1277 <std::int8_t, std::uint32_t>);
1279 <std::int8_t, std::int64_t>);
1281 <std::int8_t, std::uint64_t>);
1283 <std::int8_t, std::int16_t>);
1285 <std::int8_t, std::uint16_t>);
1287 <std::int8_t, std::int32_t>);
1289 <std::int8_t, std::uint32_t>);
1291 <std::int8_t, std::int64_t>);
1293 <std::int8_t, std::uint64_t>);
1299 <std::uint8_t, std::int8_t>);
1301 <std::uint8_t, std::int16_t>);
1303 <std::uint8_t, std::uint16_t>);
1305 <std::uint8_t, std::int32_t>);
1307 <std::uint8_t, std::uint32_t>);
1309 <std::uint8_t, std::int64_t>);
1311 <std::uint8_t, std::uint64_t>);
1313 <std::uint8_t, std::int16_t>);
1315 <std::uint8_t, std::uint16_t>);
1317 <std::uint8_t, std::int32_t>);
1319 <std::uint8_t, std::uint32_t>);
1321 <std::uint8_t, std::int64_t>);
1323 <std::uint8_t, std::uint64_t>);
1328 <std::int16_t, std::int16_t>);
1331 <std::int16_t, std::int8_t>);
1333 <std::int16_t, std::uint8_t>);
1335 <std::int16_t, std::uint16_t>);
1337 <std::int16_t, std::int32_t>);
1339 <std::int16_t, std::uint32_t>);
1341 <std::int16_t, std::int64_t>);
1343 <std::int16_t, std::uint64_t>);
1345 <std::int16_t, std::uint16_t>);
1347 <std::int16_t, std::int32_t>);
1349 <std::int16_t, std::uint32_t>);
1351 <std::int16_t, std::int64_t>);
1353 <std::int16_t, std::uint64_t>);
1358 <std::uint16_t, std::uint16_t>);
1361 <std::uint16_t, std::int8_t>);
1363 <std::uint16_t, std::uint8_t>);
1365 <std::uint16_t, std::int16_t>);
1367 <std::uint16_t, std::int32_t>);
1369 <std::uint16_t, std::uint32_t>);
1371 <std::uint16_t, std::int64_t>);
1373 <std::uint16_t, std::uint64_t>);
1375 <std::uint16_t, std::int16_t>);
1377 <std::uint16_t, std::int32_t>);
1379 <std::uint16_t, std::uint32_t>);
1381 <std::uint16_t, std::int64_t>);
1383 <std::uint16_t, std::uint64_t>);
1388 <std::int32_t, std::int32_t>);
1391 <std::int32_t, std::int8_t>);
1393 <std::int32_t, std::uint8_t>);
1395 <std::int32_t, std::int16_t>);
1397 <std::int32_t, std::uint16_t>);
1399 <std::int32_t, std::uint32_t>);
1401 <std::int32_t, std::int64_t>);
1403 <std::int32_t, std::uint64_t>);
1405 <std::int32_t, std::int16_t>);
1407 <std::int32_t, std::uint16_t>);
1409 <std::int32_t, std::uint32_t>);
1411 <std::int32_t, std::int64_t>);
1413 <std::int32_t, std::uint64_t>);
1418 <std::uint32_t, std::uint32_t>);
1421 <std::uint32_t, std::int8_t>);
1423 <std::uint32_t, std::uint8_t>);
1425 <std::uint32_t, std::int16_t>);
1427 <std::uint32_t, std::uint16_t>);
1429 <std::uint32_t, std::int32_t>);
1431 <std::uint32_t, std::int64_t>);
1433 <std::uint32_t, std::uint64_t>);
1435 <std::uint32_t, std::int16_t>);
1437 <std::uint32_t, std::uint16_t>);
1439 <std::uint32_t, std::int32_t>);
1441 <std::uint32_t, std::int64_t>);
1443 <std::uint32_t, std::uint64_t>);
1448 <std::int64_t, std::int64_t>);
1451 <std::int64_t, std::int8_t>);
1453 <std::int64_t, std::uint8_t>);
1455 <std::int64_t, std::int16_t>);
1457 <std::int64_t, std::uint16_t>);
1459 <std::int64_t, std::int32_t>);
1461 <std::int64_t, std::uint32_t>);
1463 <std::int64_t, std::uint64_t>);
1465 <std::int64_t, std::int16_t>);
1467 <std::int64_t, std::uint16_t>);
1469 <std::int64_t, std::int32_t>);
1471 <std::int64_t, std::uint32_t>);
1473 <std::int64_t, std::uint64_t>);
1478 <std::uint64_t, std::uint64_t>);
1481 <std::uint64_t, std::int8_t>);
1483 <std::uint64_t, std::uint8_t>);
1485 <std::uint64_t, std::int16_t>);
1487 <std::uint64_t, std::uint16_t>);
1489 <std::uint64_t, std::int32_t>);
1491 <std::uint64_t, std::uint32_t>);
1493 <std::uint64_t, std::int64_t>);
1495 <std::uint64_t, std::int16_t>);
1497 <std::uint64_t, std::uint16_t>);
1499 <std::uint64_t, std::int32_t>);
1501 <std::uint64_t, std::uint32_t>);
1503 <std::uint64_t, std::int64_t>);
1519 <std::uint64_t, std::uint32_t>);
1521 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint64_t>);
1523 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint32_t>);
1528 static constexpr bool kIsMappable =
false;
1530 static constexpr std::size_t kBitsOnStorage =
kSize * 8;
1533 bool IsMappable()
const final {
return kIsMappable; }
1534 void Pack(
void *,
const void *, std::size_t)
const final {}
1535 void Unpack(
void *,
const void *, std::size_t)
const final {}
1544RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Pack(
void *
dst,
const void *
src, std::size_t count)
const
1546 const bool *
boolArray =
reinterpret_cast<const bool *
>(
src);
1550 for (; i < count; ++i) {
1564RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Unpack(
void *
dst,
const void *
src, std::size_t count)
const
1567 const char *
charArray =
reinterpret_cast<const char *
>(
src);
1569 for (std::size_t i = 0; i < count; i += 8) {
1571 for (std::size_t
j = i;
j < std::min(count, i + 8); ++
j) {
#define DECLARE_RCOLUMNELEMENT_SPEC_SIMPLE(CppT, ColumnT, BitsOnStorage)
#define DECLARE_RCOLUMNELEMENT_SPEC(CppT, ColumnT, BitsOnStorage, BaseT,...)
These macros are used to declare RColumnElement template specializations below.
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#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 value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
The available trivial, native content types of a column.
A column element encapsulates the translation between basic C++ types and their column representation...
The in-memory representation of a 32bit or 64bit on-disk index column.
Holds the index and the tag of a kSwitch column.
Base class for all ROOT issued exceptions.
void PackBits(void *dst, const void *src, std::size_t count, std::size_t sizeofSrc, std::size_t nDstBits)
Tightly packs count items of size sizeofSrc contained in src into dst using nDstBits per item.
constexpr std::size_t MinBufSize(std::size_t count, std::size_t nDstBits)
Returns the minimum safe size (in bytes) of a buffer that is intended to be used as a destination for...
void UnpackBits(void *dst, const void *src, std::size_t count, std::size_t sizeofDst, std::size_t nSrcBits)
Undoes the effect of PackBits.
constexpr std::size_t kBitsPerWord
std::uint16_t FloatToHalf(float value)
Convert an IEEE single-precision float to half-precision.
std::unique_ptr< T[]> MakeUninitArray(std::size_t size)
Make an array of default-initialized elements.
constexpr ENTupleColumnType kTestFutureColumnType
float HalfToFloat(std::uint16_t value)
Convert an IEEE half-precision float to single-precision.
Helper templated class for swapping bytes; specializations for N={2,4,8} are provided below.