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()));
169template <
typename DestT,
typename SourceT>
172 static_assert(std::is_convertible_v<SourceT, DestT>);
175 for (std::size_t i = 0; i < count; ++i) {
185template <
typename DestT,
typename SourceT>
190 for (std::size_t i = 0; i < count; ++i) {
201template <
typename DestT,
typename SourceT>
204 constexpr std::size_t
N =
sizeof(
DestT);
207 for (std::size_t i = 0; i < count; ++i) {
210 for (std::size_t
b = 0;
b <
N; ++
b) {
211 splitArray[
b * count + i] =
reinterpret_cast<const char *
>(&val)[
b];
219template <
typename DestT,
typename SourceT>
222 constexpr std::size_t
N =
sizeof(
SourceT);
225 for (std::size_t i = 0; i < count; ++i) {
227 for (std::size_t
b = 0;
b <
N; ++
b) {
228 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
239template <
typename DestT,
typename SourceT>
242 constexpr std::size_t
N =
sizeof(
DestT);
245 for (std::size_t i = 0; i < count; ++i) {
248 for (std::size_t
b = 0;
b <
N; ++
b) {
249 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
257template <
typename DestT,
typename SourceT>
260 constexpr std::size_t
N =
sizeof(
SourceT);
263 for (std::size_t i = 0; i < count; ++i) {
265 for (std::size_t
b = 0;
b <
N; ++
b) {
266 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
269 val = (i == 0) ? val : val +
dst[i - 1];
278template <
typename DestT,
typename SourceT>
281 using UDestT = std::make_unsigned_t<DestT>;
283 constexpr std::size_t
N =
sizeof(
DestT);
286 for (std::size_t i = 0; i < count; ++i) {
289 for (std::size_t
b = 0;
b <
N; ++
b) {
290 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
298template <
typename DestT,
typename SourceT>
301 using USourceT = std::make_unsigned_t<SourceT>;
302 constexpr std::size_t
N =
sizeof(
SourceT);
305 for (std::size_t i = 0; i < count; ++i) {
307 for (std::size_t
b = 0;
b <
N; ++
b) {
308 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
326template <
typename CppT, ENTupleColumnType>
329template <
typename CppT>
333 case ENTupleColumnType::kIndex64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex64>>();
334 case ENTupleColumnType::kIndex32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex32>>();
335 case ENTupleColumnType::kSwitch:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSwitch>>();
336 case ENTupleColumnType::kByte:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kByte>>();
337 case ENTupleColumnType::kChar:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kChar>>();
338 case ENTupleColumnType::kBit:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kBit>>();
339 case ENTupleColumnType::kReal64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal64>>();
340 case ENTupleColumnType::kReal32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32>>();
341 case ENTupleColumnType::kReal16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal16>>();
342 case ENTupleColumnType::kInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt64>>();
343 case ENTupleColumnType::kUInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt64>>();
344 case ENTupleColumnType::kInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt32>>();
345 case ENTupleColumnType::kUInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt32>>();
346 case ENTupleColumnType::kInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt16>>();
347 case ENTupleColumnType::kUInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt16>>();
348 case ENTupleColumnType::kInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt8>>();
349 case ENTupleColumnType::kUInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt8>>();
350 case ENTupleColumnType::kSplitIndex64:
351 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex64>>();
352 case ENTupleColumnType::kSplitIndex32:
353 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex32>>();
354 case ENTupleColumnType::kSplitReal64:
355 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal64>>();
356 case ENTupleColumnType::kSplitReal32:
357 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal32>>();
358 case ENTupleColumnType::kSplitInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt64>>();
359 case ENTupleColumnType::kSplitUInt64:
360 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt64>>();
361 case ENTupleColumnType::kSplitInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt32>>();
362 case ENTupleColumnType::kSplitUInt32:
363 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt32>>();
364 case ENTupleColumnType::kSplitInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt16>>();
365 case ENTupleColumnType::kSplitUInt16:
366 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt16>>();
367 case ENTupleColumnType::kReal32Trunc:
368 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Trunc>>();
369 case ENTupleColumnType::kReal32Quant:
370 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Quant>>();
373 return std::make_unique<RColumnElement<CppT, kTestFutureColumnType>>();
384template <
typename CppT>
385class RColumnElementLE :
public RColumnElementBase {
392 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
394#if R__LITTLE_ENDIAN == 1
395 RColumnElementBase::Pack(
dst,
src, count);
400 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
402#if R__LITTLE_ENDIAN == 1
403 RColumnElementBase::Unpack(
dst,
src, count);
414template <
typename CppT,
typename NarrowT>
415class RColumnElementCastLE :
public RColumnElementBase {
422 static constexpr bool kIsMappable =
false;
425 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
436template <
typename CppT,
typename NarrowT>
437class RColumnElementSplitLE :
public RColumnElementBase {
444 static constexpr bool kIsMappable =
false;
446 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
450 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
461template <
typename CppT,
typename NarrowT>
462class RColumnElementDeltaSplitLE :
public RColumnElementBase {
470 static constexpr bool kIsMappable =
false;
472 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
476 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
483template <
typename CppIntT>
484class RColumnElementBoolAsUnsplitInt :
public RColumnElementBase {
486 explicit RColumnElementBoolAsUnsplitInt(std::size_t
size, std::size_t
bitsOnStorage)
492 static constexpr bool kIsMappable =
false;
495 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
497 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
501 for (std::size_t i = 0; i < count; ++i) {
508template <
typename CppIntT>
509class RColumnElementBoolAsSplitInt :
public RColumnElementBase {
511 explicit RColumnElementBoolAsSplitInt(std::size_t
size, std::size_t
bitsOnStorage)
517 static constexpr bool kIsMappable =
false;
520 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
522 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
524 constexpr std::size_t
N =
sizeof(
CppIntT);
527 for (std::size_t i = 0; i < count; ++i) {
529 for (std::size_t
b = 0;
b <
N; ++
b) {
540template <
typename CppIntT>
541class RColumnElementIntAsBool :
public RColumnElementBase {
549 static constexpr bool kIsMappable =
false;
552 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
554 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
557 const char *
charArray =
reinterpret_cast<const char *
>(
src);
559 for (std::size_t i = 0; i < count; i += 8) {
561 for (std::size_t
j = i;
j < std::min(count, i + 8); ++
j) {
573template <
typename CppT,
typename NarrowT>
574class RColumnElementZigzagSplitLE :
public RColumnElementBase {
576 explicit RColumnElementZigzagSplitLE(std::size_t
size, std::size_t
bitsOnStorage)
582 static constexpr bool kIsMappable =
false;
584 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
588 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
602template <
typename CppT, ENTupleColumnType ColumnT = ENTupleColumnType::kUnknown>
603class RColumnElement :
public RColumnElementBase {
605 RColumnElement() : RColumnElementBase(
sizeof(
CppT))
611 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
CppT), ENTupleColumnType::kUnknown}; }
617 static constexpr std::size_t
kSize =
sizeof(
bool);
618 RColumnElement() : RColumnElementBase(
kSize) {}
619 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kUnknown}; }
623class RColumnElement<std::
byte, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
625 static constexpr std::size_t
kSize =
sizeof(std::byte);
626 RColumnElement() : RColumnElementBase(
kSize) {}
627 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::byte), ENTupleColumnType::kUnknown}; }
633 static constexpr std::size_t
kSize =
sizeof(char);
634 RColumnElement() : RColumnElementBase(
kSize) {}
635 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(char), ENTupleColumnType::kUnknown}; }
639class RColumnElement<std::int8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
641 static constexpr std::size_t
kSize =
sizeof(std::int8_t);
642 RColumnElement() : RColumnElementBase(
kSize) {}
643 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int8_t), ENTupleColumnType::kUnknown}; }
647class RColumnElement<std::uint8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
649 static constexpr std::size_t
kSize =
sizeof(std::uint8_t);
650 RColumnElement() : RColumnElementBase(
kSize) {}
651 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint8_t), ENTupleColumnType::kUnknown}; }
655class RColumnElement<std::int16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
657 static constexpr std::size_t
kSize =
sizeof(std::int16_t);
658 RColumnElement() : RColumnElementBase(
kSize) {}
659 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int16_t), ENTupleColumnType::kUnknown}; }
663class RColumnElement<std::uint16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
665 static constexpr std::size_t
kSize =
sizeof(std::uint16_t);
666 RColumnElement() : RColumnElementBase(
kSize) {}
667 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint16_t), ENTupleColumnType::kUnknown}; }
671class RColumnElement<std::int32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
673 static constexpr std::size_t
kSize =
sizeof(std::int32_t);
674 RColumnElement() : RColumnElementBase(
kSize) {}
675 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int32_t), ENTupleColumnType::kUnknown}; }
679class RColumnElement<std::uint32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
681 static constexpr std::size_t
kSize =
sizeof(std::uint32_t);
682 RColumnElement() : RColumnElementBase(
kSize) {}
683 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint32_t), ENTupleColumnType::kUnknown}; }
687class RColumnElement<std::int64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
689 static constexpr std::size_t
kSize =
sizeof(std::int64_t);
690 RColumnElement() : RColumnElementBase(
kSize) {}
691 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int64_t), ENTupleColumnType::kUnknown}; }
695class RColumnElement<std::uint64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
697 static constexpr std::size_t
kSize =
sizeof(std::uint64_t);
698 RColumnElement() : RColumnElementBase(
kSize) {}
699 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint64_t), ENTupleColumnType::kUnknown}; }
705 static constexpr std::size_t
kSize =
sizeof(float);
706 RColumnElement() : RColumnElementBase(
kSize) {}
707 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kUnknown}; }
713 static constexpr std::size_t
kSize =
sizeof(
double);
714 RColumnElement() : RColumnElementBase(
kSize) {}
715 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kUnknown}; }
719class RColumnElement<
ROOT::Internal::RColumnIndex, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
722 RColumnElement() : RColumnElementBase(
kSize) {}
730class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
733 RColumnElement() : RColumnElementBase(
kSize) {}
746class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kSwitch> :
public RColumnElementBase {
749 std::uint64_t fIndex;
754 static constexpr bool kIsMappable =
false;
756 static constexpr std::size_t kBitsOnStorage = 96;
757 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
758 bool IsMappable()
const final {
return kIsMappable; }
760 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
763 auto dstArray =
reinterpret_cast<unsigned char *
>(
dst);
764 for (std::size_t i = 0; i < count; ++i) {
766#if R__LITTLE_ENDIAN == 0
774 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
776 auto srcArray =
reinterpret_cast<const unsigned char *
>(
src);
778 for (std::size_t i = 0; i < count; ++i) {
781#if R__LITTLE_ENDIAN == 0
798 static constexpr bool kIsMappable =
false;
799 static constexpr std::size_t
kSize =
sizeof(
bool);
800 static constexpr std::size_t kBitsOnStorage = 1;
801 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
802 bool IsMappable()
const final {
return kIsMappable; }
804 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final;
805 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final;
807 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kBit}; }
813 static constexpr bool kIsMappable =
false;
814 static constexpr std::size_t
kSize =
sizeof(float);
815 static constexpr std::size_t kBitsOnStorage = 16;
816 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
817 bool IsMappable()
const final {
return kIsMappable; }
819 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
821 const float *
floatArray =
reinterpret_cast<const float *
>(
src);
822 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
824 for (std::size_t i = 0; i < count; ++i) {
830 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
833 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
835 for (std::size_t i = 0; i < count; ++i) {
842 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kReal16}; }
848 static constexpr bool kIsMappable =
false;
849 static constexpr std::size_t
kSize =
sizeof(
double);
850 static constexpr std::size_t kBitsOnStorage = 16;
851 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
852 bool IsMappable()
const final {
return kIsMappable; }
854 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
856 const double *
doubleArray =
reinterpret_cast<const double *
>(
src);
857 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
859 for (std::size_t i = 0; i < count; ++i) {
865 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
868 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
870 for (std::size_t i = 0; i < count; ++i) {
877 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kReal16}; }
881class RColumnElementTrunc :
public RColumnElementBase {
883 static_assert(std::is_floating_point_v<T>);
884 static constexpr bool kIsMappable =
false;
885 static constexpr std::size_t
kSize =
sizeof(T);
890 RColumnElementTrunc() : RColumnElementBase(
kSize, 0) {}
894 const auto &[
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Trunc);
899 bool IsMappable()
const final {
return kIsMappable; }
901 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Trunc}; }
907 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
913#if R__LITTLE_ENDIAN == 0
920 const auto *
srcLe =
reinterpret_cast<const float *
>(
src);
925 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
932#if R__LITTLE_ENDIAN == 0
941 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
950 const double *
srcDouble =
reinterpret_cast<const double *
>(
src);
951 for (std::size_t i = 0; i < count; ++i)
954#if R__LITTLE_ENDIAN == 0
961 const float *
srcLe =
reinterpret_cast<const float *
>(
srcFloat.get());
966 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
975#if R__LITTLE_ENDIAN == 0
980 for (std::size_t i = 0; i < count; ++i)
995 unsigned long idx = 0;
997 return static_cast<std::size_t
>(31 - idx);
1010 unsigned long idx = 0;
1012 return static_cast<std::size_t
>(idx);
1025template <
typename T>
1028 static_assert(std::is_floating_point_v<T>);
1029 static_assert(
sizeof(T) <=
sizeof(
double));
1034 assert(min ==
static_cast<double>(
static_cast<T
>(min)));
1035 assert(max ==
static_cast<double>(
static_cast<T
>(max)));
1043 for (std::size_t i = 0; i < count; ++i) {
1066template <
typename T>
1069 static_assert(std::is_floating_point_v<T>);
1070 static_assert(
sizeof(T) <=
sizeof(
double));
1076 const double eps = std::numeric_limits<double>::epsilon();
1077 const double emax = max + std::max(1.0, std::abs(max)) * eps;
1081 for (std::size_t i = 0; i < count; ++i) {
1088 const double fq =
static_cast<double>(
elem);
1100 e = std::min(
e, max);
1102 dst[i] =
static_cast<T
>(
e);
1109template <
typename T>
1111 static_assert(std::is_floating_point_v<T>);
1114 static constexpr bool kIsMappable =
false;
1115 static constexpr std::size_t
kSize =
sizeof(T);
1121 const auto [
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Quant);
1126 void SetValueRange(
double min,
double max)
final
1128 R__ASSERT(min >= std::numeric_limits<T>::lowest());
1129 R__ASSERT(max <= std::numeric_limits<T>::max());
1131 R__ASSERT(std::isnormal(min) || min == 0.0);
1132 R__ASSERT(std::isnormal(max) || max == 0.0);
1133 fValueRange = {min, max};
1136 bool IsMappable()
const final {
return kIsMappable; }
1138 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
1145 const auto [min, max] = *fValueRange;
1147 Quantize::QuantizeReals(
quantized.get(),
reinterpret_cast<const T *
>(
src), count, min, max, fBitsOnStorage);
1150 " values were found of of range for quantization while packing (range is [" +
1151 std::to_string(min) +
", " + std::to_string(max) +
"])"));
1153 BitPacking::PackBits(
dst,
quantized.get(), count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1156 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
1163 const auto [min, max] = *fValueRange;
1164 BitPacking::UnpackBits(
quantized.get(),
src, count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1166 Quantize::UnquantizeReals(
reinterpret_cast<T *
>(
dst),
quantized.get(), count, min, max, fBitsOnStorage);
1173 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Quant}; }
1182#define __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1183 static constexpr std::size_t kSize = sizeof(CppT); \
1184 static constexpr std::size_t kBitsOnStorage = BitsOnStorage; \
1185 RColumnElement() : BaseT(kSize, kBitsOnStorage) {} \
1186 bool IsMappable() const final \
1188 return kIsMappable; \
1190 RIdentifier GetIdentifier() const final \
1192 return RIdentifier{typeid(CppT), ColumnT}; \
1200#define DECLARE_RCOLUMNELEMENT_SPEC(CppT, ColumnT, BitsOnStorage, BaseT, ...) \
1202 class RColumnElement<CppT, ColumnT> : public BaseT __VA_ARGS__ { \
1204 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1206#define DECLARE_RCOLUMNELEMENT_SPEC_SIMPLE(CppT, ColumnT, BitsOnStorage) \
1208 class RColumnElement<CppT, ColumnT> : public RColumnElementBase { \
1210 static constexpr bool kIsMappable = true; \
1211 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, RColumnElementBase, BitsOnStorage) \
1242 <
char, std::int16_t>);
1245 <
char, std::int32_t>);
1248 <
char, std::int64_t>);
1255 <std::int8_t, std::uint8_t>);
1257 <std::int8_t, std::int16_t>);
1259 <std::int8_t, std::uint16_t>);
1261 <std::int8_t, std::int32_t>);
1263 <std::int8_t, std::uint32_t>);
1265 <std::int8_t, std::int64_t>);
1267 <std::int8_t, std::uint64_t>);
1269 <std::int8_t, std::int16_t>);
1271 <std::int8_t, std::uint16_t>);
1273 <std::int8_t, std::int32_t>);
1275 <std::int8_t, std::uint32_t>);
1277 <std::int8_t, std::int64_t>);
1279 <std::int8_t, std::uint64_t>);
1285 <std::uint8_t, std::int8_t>);
1287 <std::uint8_t, std::int16_t>);
1289 <std::uint8_t, std::uint16_t>);
1291 <std::uint8_t, std::int32_t>);
1293 <std::uint8_t, std::uint32_t>);
1295 <std::uint8_t, std::int64_t>);
1297 <std::uint8_t, std::uint64_t>);
1299 <std::uint8_t, std::int16_t>);
1301 <std::uint8_t, std::uint16_t>);
1303 <std::uint8_t, std::int32_t>);
1305 <std::uint8_t, std::uint32_t>);
1307 <std::uint8_t, std::int64_t>);
1309 <std::uint8_t, std::uint64_t>);
1314 <std::int16_t, std::int16_t>);
1317 <std::int16_t, std::int8_t>);
1319 <std::int16_t, std::uint8_t>);
1321 <std::int16_t, std::uint16_t>);
1323 <std::int16_t, std::int32_t>);
1325 <std::int16_t, std::uint32_t>);
1327 <std::int16_t, std::int64_t>);
1329 <std::int16_t, std::uint64_t>);
1331 <std::int16_t, std::uint16_t>);
1333 <std::int16_t, std::int32_t>);
1335 <std::int16_t, std::uint32_t>);
1337 <std::int16_t, std::int64_t>);
1339 <std::int16_t, std::uint64_t>);
1344 <std::uint16_t, std::uint16_t>);
1347 <std::uint16_t, std::int8_t>);
1349 <std::uint16_t, std::uint8_t>);
1351 <std::uint16_t, std::int16_t>);
1353 <std::uint16_t, std::int32_t>);
1355 <std::uint16_t, std::uint32_t>);
1357 <std::uint16_t, std::int64_t>);
1359 <std::uint16_t, std::uint64_t>);
1361 <std::uint16_t, std::int16_t>);
1363 <std::uint16_t, std::int32_t>);
1365 <std::uint16_t, std::uint32_t>);
1367 <std::uint16_t, std::int64_t>);
1369 <std::uint16_t, std::uint64_t>);
1374 <std::int32_t, std::int32_t>);
1377 <std::int32_t, std::int8_t>);
1379 <std::int32_t, std::uint8_t>);
1381 <std::int32_t, std::int16_t>);
1383 <std::int32_t, std::uint16_t>);
1385 <std::int32_t, std::uint32_t>);
1387 <std::int32_t, std::int64_t>);
1389 <std::int32_t, std::uint64_t>);
1391 <std::int32_t, std::int16_t>);
1393 <std::int32_t, std::uint16_t>);
1395 <std::int32_t, std::uint32_t>);
1397 <std::int32_t, std::int64_t>);
1399 <std::int32_t, std::uint64_t>);
1404 <std::uint32_t, std::uint32_t>);
1407 <std::uint32_t, std::int8_t>);
1409 <std::uint32_t, std::uint8_t>);
1411 <std::uint32_t, std::int16_t>);
1413 <std::uint32_t, std::uint16_t>);
1415 <std::uint32_t, std::int32_t>);
1417 <std::uint32_t, std::int64_t>);
1419 <std::uint32_t, std::uint64_t>);
1421 <std::uint32_t, std::int16_t>);
1423 <std::uint32_t, std::uint16_t>);
1425 <std::uint32_t, std::int32_t>);
1427 <std::uint32_t, std::int64_t>);
1429 <std::uint32_t, std::uint64_t>);
1434 <std::int64_t, std::int64_t>);
1437 <std::int64_t, std::int8_t>);
1439 <std::int64_t, std::uint8_t>);
1441 <std::int64_t, std::int16_t>);
1443 <std::int64_t, std::uint16_t>);
1445 <std::int64_t, std::int32_t>);
1447 <std::int64_t, std::uint32_t>);
1449 <std::int64_t, std::uint64_t>);
1451 <std::int64_t, std::int16_t>);
1453 <std::int64_t, std::uint16_t>);
1455 <std::int64_t, std::int32_t>);
1457 <std::int64_t, std::uint32_t>);
1459 <std::int64_t, std::uint64_t>);
1464 <std::uint64_t, std::uint64_t>);
1467 <std::uint64_t, std::int8_t>);
1469 <std::uint64_t, std::uint8_t>);
1471 <std::uint64_t, std::int16_t>);
1473 <std::uint64_t, std::uint16_t>);
1475 <std::uint64_t, std::int32_t>);
1477 <std::uint64_t, std::uint32_t>);
1479 <std::uint64_t, std::int64_t>);
1481 <std::uint64_t, std::int16_t>);
1483 <std::uint64_t, std::uint16_t>);
1485 <std::uint64_t, std::int32_t>);
1487 <std::uint64_t, std::uint32_t>);
1489 <std::uint64_t, std::int64_t>);
1505 <std::uint64_t, std::uint32_t>);
1507 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint64_t>);
1509 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint32_t>);
1514 static constexpr bool kIsMappable =
false;
1516 static constexpr std::size_t kBitsOnStorage =
kSize * 8;
1519 bool IsMappable()
const final {
return kIsMappable; }
1520 void Pack(
void *,
const void *, std::size_t)
const final {}
1521 void Unpack(
void *,
const void *, std::size_t)
const final {}
1530RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Pack(
void *
dst,
const void *
src, std::size_t count)
const
1532 const bool *
boolArray =
reinterpret_cast<const bool *
>(
src);
1536 for (; i < count; ++i) {
1550RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Unpack(
void *
dst,
const void *
src, std::size_t count)
const
1553 const char *
charArray =
reinterpret_cast<const char *
>(
src);
1555 for (std::size_t i = 0; i < count; i += 8) {
1557 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.
Namespace for new ROOT classes and functions.
Helper templated class for swapping bytes; specializations for N={2,4,8} are provided below.