22#ifndef R__LITTLE_ENDIAN
25#define R__LITTLE_ENDIAN 1
27#define R__LITTLE_ENDIAN 0
87template <std::
size_t N>
92 for (std::size_t i = 0; i < count; ++i) {
97template <std::
size_t N>
101 for (std::size_t i = 0; i < count; ++i) {
107#if R__LITTLE_ENDIAN == 0
111 constexpr auto N =
sizeof(T);
130#define ByteSwapIfNecessary(x) ((void)0)
134template <
typename DestT,
typename SourceT>
139 if constexpr (!std::is_integral_v<DestT> || !std::is_integral_v<SourceT>)
142 if constexpr (
static_cast<double>(std::numeric_limits<SourceT>::min()) <
143 static_cast<double>(std::numeric_limits<DestT>::min())) {
144 if constexpr (!std::is_signed_v<DestT>) {
146 throw RException(
R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
149 }
else if (val < std::numeric_limits<DestT>::min()) {
151 R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
typeid(
DestT).
name()));
155 if constexpr (
static_cast<double>(std::numeric_limits<SourceT>::max()) >
156 static_cast<double>(std::numeric_limits<DestT>::max())) {
157 if (val > std::numeric_limits<DestT>::max()) {
159 R__FAIL(std::string(
"value out of range: ") + std::to_string(val) +
" for type " +
typeid(
DestT).
name()));
168template <
typename DestT,
typename SourceT>
171 static_assert(std::is_convertible_v<SourceT, DestT>);
174 for (std::size_t i = 0; i < count; ++i) {
184template <
typename DestT,
typename SourceT>
189 for (std::size_t i = 0; i < count; ++i) {
200template <
typename DestT,
typename SourceT>
203 constexpr std::size_t
N =
sizeof(
DestT);
206 for (std::size_t i = 0; i < count; ++i) {
209 for (std::size_t
b = 0;
b <
N; ++
b) {
210 splitArray[
b * count + i] =
reinterpret_cast<const char *
>(&val)[
b];
218template <
typename DestT,
typename SourceT>
221 constexpr std::size_t
N =
sizeof(
SourceT);
224 for (std::size_t i = 0; i < count; ++i) {
226 for (std::size_t
b = 0;
b <
N; ++
b) {
227 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
238template <
typename DestT,
typename SourceT>
241 constexpr std::size_t
N =
sizeof(
DestT);
244 for (std::size_t i = 0; i < count; ++i) {
247 for (std::size_t
b = 0;
b <
N; ++
b) {
248 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
256template <
typename DestT,
typename SourceT>
259 constexpr std::size_t
N =
sizeof(
SourceT);
262 for (std::size_t i = 0; i < count; ++i) {
264 for (std::size_t
b = 0;
b <
N; ++
b) {
265 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
268 val = (i == 0) ? val : val +
dst[i - 1];
277template <
typename DestT,
typename SourceT>
280 using UDestT = std::make_unsigned_t<DestT>;
282 constexpr std::size_t
N =
sizeof(
DestT);
285 for (std::size_t i = 0; i < count; ++i) {
288 for (std::size_t
b = 0;
b <
N; ++
b) {
289 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
297template <
typename DestT,
typename SourceT>
300 using USourceT = std::make_unsigned_t<SourceT>;
301 constexpr std::size_t
N =
sizeof(
SourceT);
304 for (std::size_t i = 0; i < count; ++i) {
306 for (std::size_t
b = 0;
b <
N; ++
b) {
307 reinterpret_cast<char *
>(&val)[
b] =
splitArray[
b * count + i];
325template <
typename CppT, ENTupleColumnType>
328template <
typename CppT>
332 case ENTupleColumnType::kIndex64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex64>>();
333 case ENTupleColumnType::kIndex32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kIndex32>>();
334 case ENTupleColumnType::kSwitch:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSwitch>>();
335 case ENTupleColumnType::kByte:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kByte>>();
336 case ENTupleColumnType::kChar:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kChar>>();
337 case ENTupleColumnType::kBit:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kBit>>();
338 case ENTupleColumnType::kReal64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal64>>();
339 case ENTupleColumnType::kReal32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32>>();
340 case ENTupleColumnType::kReal16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal16>>();
341 case ENTupleColumnType::kInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt64>>();
342 case ENTupleColumnType::kUInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt64>>();
343 case ENTupleColumnType::kInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt32>>();
344 case ENTupleColumnType::kUInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt32>>();
345 case ENTupleColumnType::kInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt16>>();
346 case ENTupleColumnType::kUInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt16>>();
347 case ENTupleColumnType::kInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kInt8>>();
348 case ENTupleColumnType::kUInt8:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kUInt8>>();
349 case ENTupleColumnType::kSplitIndex64:
350 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex64>>();
351 case ENTupleColumnType::kSplitIndex32:
352 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitIndex32>>();
353 case ENTupleColumnType::kSplitReal64:
354 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal64>>();
355 case ENTupleColumnType::kSplitReal32:
356 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitReal32>>();
357 case ENTupleColumnType::kSplitInt64:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt64>>();
358 case ENTupleColumnType::kSplitUInt64:
359 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt64>>();
360 case ENTupleColumnType::kSplitInt32:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt32>>();
361 case ENTupleColumnType::kSplitUInt32:
362 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt32>>();
363 case ENTupleColumnType::kSplitInt16:
return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitInt16>>();
364 case ENTupleColumnType::kSplitUInt16:
365 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kSplitUInt16>>();
366 case ENTupleColumnType::kReal32Trunc:
367 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Trunc>>();
368 case ENTupleColumnType::kReal32Quant:
369 return std::make_unique<RColumnElement<CppT, ENTupleColumnType::kReal32Quant>>();
372 return std::make_unique<RColumnElement<CppT, kTestFutureColumnType>>();
383template <
typename CppT>
384class RColumnElementLE :
public RColumnElementBase {
391 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
393#if R__LITTLE_ENDIAN == 1
394 RColumnElementBase::Pack(
dst,
src, count);
399 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
401#if R__LITTLE_ENDIAN == 1
402 RColumnElementBase::Unpack(
dst,
src, count);
413template <
typename CppT,
typename NarrowT>
414class RColumnElementCastLE :
public RColumnElementBase {
421 static constexpr bool kIsMappable =
false;
424 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
435template <
typename CppT,
typename NarrowT>
436class RColumnElementSplitLE :
public RColumnElementBase {
443 static constexpr bool kIsMappable =
false;
445 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
449 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
460template <
typename CppT,
typename NarrowT>
461class RColumnElementDeltaSplitLE :
public RColumnElementBase {
469 static constexpr bool kIsMappable =
false;
471 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
475 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
482template <
typename CppIntT>
483class RColumnElementBoolAsUnsplitInt :
public RColumnElementBase {
485 explicit RColumnElementBoolAsUnsplitInt(std::size_t
size, std::size_t
bitsOnStorage)
491 static constexpr bool kIsMappable =
false;
494 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
496 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
500 for (std::size_t i = 0; i < count; ++i) {
507template <
typename CppIntT>
508class RColumnElementBoolAsSplitInt :
public RColumnElementBase {
510 explicit RColumnElementBoolAsSplitInt(std::size_t
size, std::size_t
bitsOnStorage)
516 static constexpr bool kIsMappable =
false;
519 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
521 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
523 constexpr std::size_t
N =
sizeof(
CppIntT);
526 for (std::size_t i = 0; i < count; ++i) {
528 for (std::size_t
b = 0;
b <
N; ++
b) {
539template <
typename CppIntT>
540class RColumnElementIntAsBool :
public RColumnElementBase {
548 static constexpr bool kIsMappable =
false;
551 void Pack(
void *,
const void *, std::size_t)
const final {
R__ASSERT(
false); }
553 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
556 const char *
charArray =
reinterpret_cast<const char *
>(
src);
558 for (std::size_t i = 0; i < count; i += 8) {
560 for (std::size_t
j = i;
j < std::min(count, i + 8); ++
j) {
572template <
typename CppT,
typename NarrowT>
573class RColumnElementZigzagSplitLE :
public RColumnElementBase {
575 explicit RColumnElementZigzagSplitLE(std::size_t
size, std::size_t
bitsOnStorage)
581 static constexpr bool kIsMappable =
false;
583 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
587 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
601template <
typename CppT, ENTupleColumnType ColumnT = ENTupleColumnType::kUnknown>
602class RColumnElement :
public RColumnElementBase {
604 RColumnElement() : RColumnElementBase(
sizeof(
CppT))
610 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
CppT), ENTupleColumnType::kUnknown}; }
616 static constexpr std::size_t
kSize =
sizeof(
bool);
617 RColumnElement() : RColumnElementBase(
kSize) {}
618 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kUnknown}; }
622class RColumnElement<std::
byte, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
624 static constexpr std::size_t
kSize =
sizeof(std::byte);
625 RColumnElement() : RColumnElementBase(
kSize) {}
626 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::byte), ENTupleColumnType::kUnknown}; }
632 static constexpr std::size_t
kSize =
sizeof(char);
633 RColumnElement() : RColumnElementBase(
kSize) {}
634 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(char), ENTupleColumnType::kUnknown}; }
638class RColumnElement<std::int8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
640 static constexpr std::size_t
kSize =
sizeof(std::int8_t);
641 RColumnElement() : RColumnElementBase(
kSize) {}
642 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int8_t), ENTupleColumnType::kUnknown}; }
646class RColumnElement<std::uint8_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
648 static constexpr std::size_t
kSize =
sizeof(std::uint8_t);
649 RColumnElement() : RColumnElementBase(
kSize) {}
650 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint8_t), ENTupleColumnType::kUnknown}; }
654class RColumnElement<std::
int16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
656 static constexpr std::size_t
kSize =
sizeof(std::int16_t);
657 RColumnElement() : RColumnElementBase(
kSize) {}
658 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int16_t), ENTupleColumnType::kUnknown}; }
662class RColumnElement<std::uint16_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
664 static constexpr std::size_t
kSize =
sizeof(std::uint16_t);
665 RColumnElement() : RColumnElementBase(
kSize) {}
666 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint16_t), ENTupleColumnType::kUnknown}; }
670class RColumnElement<std::int32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
672 static constexpr std::size_t
kSize =
sizeof(std::int32_t);
673 RColumnElement() : RColumnElementBase(
kSize) {}
674 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int32_t), ENTupleColumnType::kUnknown}; }
678class RColumnElement<std::uint32_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
680 static constexpr std::size_t
kSize =
sizeof(std::uint32_t);
681 RColumnElement() : RColumnElementBase(
kSize) {}
682 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint32_t), ENTupleColumnType::kUnknown}; }
686class RColumnElement<std::int64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
688 static constexpr std::size_t
kSize =
sizeof(std::int64_t);
689 RColumnElement() : RColumnElementBase(
kSize) {}
690 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::int64_t), ENTupleColumnType::kUnknown}; }
694class RColumnElement<std::uint64_t, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
696 static constexpr std::size_t
kSize =
sizeof(std::uint64_t);
697 RColumnElement() : RColumnElementBase(
kSize) {}
698 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(std::uint64_t), ENTupleColumnType::kUnknown}; }
704 static constexpr std::size_t
kSize =
sizeof(float);
705 RColumnElement() : RColumnElementBase(
kSize) {}
706 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kUnknown}; }
712 static constexpr std::size_t
kSize =
sizeof(
double);
713 RColumnElement() : RColumnElementBase(
kSize) {}
714 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kUnknown}; }
718class RColumnElement<
ROOT::Internal::RColumnIndex, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
721 RColumnElement() : RColumnElementBase(
kSize) {}
729class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kUnknown> :
public RColumnElementBase {
732 RColumnElement() : RColumnElementBase(
kSize) {}
745class RColumnElement<
ROOT::Internal::RColumnSwitch, ENTupleColumnType::kSwitch> :
public RColumnElementBase {
748 std::uint64_t fIndex;
753 static constexpr bool kIsMappable =
false;
755 static constexpr std::size_t kBitsOnStorage = 96;
756 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
757 bool IsMappable()
const final {
return kIsMappable; }
759 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
762 auto dstArray =
reinterpret_cast<unsigned char *
>(
dst);
763 for (std::size_t i = 0; i < count; ++i) {
765#if R__LITTLE_ENDIAN == 0
773 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
775 auto srcArray =
reinterpret_cast<const unsigned char *
>(
src);
777 for (std::size_t i = 0; i < count; ++i) {
780#if R__LITTLE_ENDIAN == 0
797 static constexpr bool kIsMappable =
false;
798 static constexpr std::size_t
kSize =
sizeof(
bool);
799 static constexpr std::size_t kBitsOnStorage = 1;
800 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
801 bool IsMappable()
const final {
return kIsMappable; }
803 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final;
804 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final;
806 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
bool), ENTupleColumnType::kBit}; }
812 static constexpr bool kIsMappable =
false;
813 static constexpr std::size_t
kSize =
sizeof(float);
814 static constexpr std::size_t kBitsOnStorage = 16;
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
820 const float *
floatArray =
reinterpret_cast<const float *
>(
src);
821 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
823 for (std::size_t i = 0; i < count; ++i) {
829 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
832 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
834 for (std::size_t i = 0; i < count; ++i) {
841 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(float), ENTupleColumnType::kReal16}; }
847 static constexpr bool kIsMappable =
false;
848 static constexpr std::size_t
kSize =
sizeof(
double);
849 static constexpr std::size_t kBitsOnStorage = 16;
850 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
851 bool IsMappable()
const final {
return kIsMappable; }
853 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
855 const double *
doubleArray =
reinterpret_cast<const double *
>(
src);
856 std::uint16_t *
uint16Array =
reinterpret_cast<std::uint16_t *
>(
dst);
858 for (std::size_t i = 0; i < count; ++i) {
864 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
867 const std::uint16_t *
uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
869 for (std::size_t i = 0; i < count; ++i) {
876 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(
double), ENTupleColumnType::kReal16}; }
880class RColumnElementTrunc :
public RColumnElementBase {
882 static_assert(std::is_floating_point_v<T>);
883 static constexpr bool kIsMappable =
false;
884 static constexpr std::size_t
kSize =
sizeof(T);
889 RColumnElementTrunc() : RColumnElementBase(
kSize, 0) {}
893 const auto &[
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Trunc);
898 bool IsMappable()
const final {
return kIsMappable; }
900 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Trunc}; }
906 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
912#if R__LITTLE_ENDIAN == 0
919 const auto *
srcLe =
reinterpret_cast<const float *
>(
src);
924 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
931#if R__LITTLE_ENDIAN == 0
940 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
949 const double *
srcDouble =
reinterpret_cast<const double *
>(
src);
950 for (std::size_t i = 0; i < count; ++i)
953#if R__LITTLE_ENDIAN == 0
960 const float *
srcLe =
reinterpret_cast<const float *
>(
srcFloat.get());
965 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
974#if R__LITTLE_ENDIAN == 0
979 for (std::size_t i = 0; i < count; ++i)
994 unsigned long idx = 0;
996 return static_cast<std::size_t
>(31 - idx);
1009 unsigned long idx = 0;
1011 return static_cast<std::size_t
>(idx);
1024template <
typename T>
1027 static_assert(std::is_floating_point_v<T>);
1028 static_assert(
sizeof(T) <=
sizeof(
double));
1037 for (std::size_t i = 0; i < count; ++i) {
1059template <
typename T>
1062 static_assert(std::is_floating_point_v<T>);
1063 static_assert(
sizeof(T) <=
sizeof(
double));
1069 const double eps = std::numeric_limits<double>::epsilon();
1070 const double emin = min - std::abs(min) * eps;
1071 const double emax = max + std::abs(max) * eps;
1075 for (std::size_t i = 0; i < count; ++i) {
1082 const double fq =
static_cast<double>(
elem);
1084 dst[i] =
static_cast<T
>(
e);
1093template <
typename T>
1095 static_assert(std::is_floating_point_v<T>);
1098 static constexpr bool kIsMappable =
false;
1099 static constexpr std::size_t
kSize =
sizeof(T);
1105 const auto [
minBits,
maxBits] = GetValidBitRange(ENTupleColumnType::kReal32Quant);
1110 void SetValueRange(
double min,
double max)
final
1112 R__ASSERT(min >= std::numeric_limits<T>::lowest());
1113 R__ASSERT(max <= std::numeric_limits<T>::max());
1115 R__ASSERT(std::isnormal(min) || min == 0.0);
1116 R__ASSERT(std::isnormal(max) || max == 0.0);
1117 fValueRange = {min, max};
1120 bool IsMappable()
const final {
return kIsMappable; }
1122 void Pack(
void *
dst,
const void *
src, std::size_t count)
const final
1129 const auto [min, max] = *fValueRange;
1131 Quantize::QuantizeReals(
quantized.get(),
reinterpret_cast<const T *
>(
src), count, min, max, fBitsOnStorage);
1134 " values were found of of range for quantization while packing (range is [" +
1135 std::to_string(min) +
", " + std::to_string(max) +
"])"));
1137 BitPacking::PackBits(
dst,
quantized.get(), count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1140 void Unpack(
void *
dst,
const void *
src, std::size_t count)
const final
1147 const auto [min, max] = *fValueRange;
1148 BitPacking::UnpackBits(
quantized.get(),
src, count,
sizeof(Quantize::Quantized_t), fBitsOnStorage);
1150 Quantize::UnquantizeReals(
reinterpret_cast<T *
>(
dst),
quantized.get(), count, min, max, fBitsOnStorage);
1157 RIdentifier GetIdentifier()
const final {
return RIdentifier{
typeid(T), ENTupleColumnType::kReal32Quant}; }
1166#define __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1167 static constexpr std::size_t kSize = sizeof(CppT); \
1168 static constexpr std::size_t kBitsOnStorage = BitsOnStorage; \
1169 RColumnElement() : BaseT(kSize, kBitsOnStorage) {} \
1170 bool IsMappable() const final \
1172 return kIsMappable; \
1174 RIdentifier GetIdentifier() const final \
1176 return RIdentifier{typeid(CppT), ColumnT}; \
1184#define DECLARE_RCOLUMNELEMENT_SPEC(CppT, ColumnT, BitsOnStorage, BaseT, ...) \
1186 class RColumnElement<CppT, ColumnT> : public BaseT __VA_ARGS__ { \
1188 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, BaseT, BitsOnStorage) \
1190#define DECLARE_RCOLUMNELEMENT_SPEC_SIMPLE(CppT, ColumnT, BitsOnStorage) \
1192 class RColumnElement<CppT, ColumnT> : public RColumnElementBase { \
1194 static constexpr bool kIsMappable = true; \
1195 __RCOLUMNELEMENT_SPEC_BODY(CppT, ColumnT, RColumnElementBase, BitsOnStorage) \
1226 <
char, std::int16_t>);
1229 <
char, std::int32_t>);
1232 <
char, std::int64_t>);
1239 <std::int8_t, std::uint8_t>);
1241 <std::int8_t, std::int16_t>);
1243 <std::int8_t, std::uint16_t>);
1245 <std::int8_t, std::int32_t>);
1247 <std::int8_t, std::uint32_t>);
1249 <std::int8_t, std::int64_t>);
1251 <std::int8_t, std::uint64_t>);
1253 <std::int8_t, std::int16_t>);
1255 <std::int8_t, std::uint16_t>);
1257 <std::int8_t, std::int32_t>);
1259 <std::int8_t, std::uint32_t>);
1261 <std::int8_t, std::int64_t>);
1263 <std::int8_t, std::uint64_t>);
1269 <std::uint8_t, std::int8_t>);
1271 <std::uint8_t, std::int16_t>);
1273 <std::uint8_t, std::uint16_t>);
1275 <std::uint8_t, std::int32_t>);
1277 <std::uint8_t, std::uint32_t>);
1279 <std::uint8_t, std::int64_t>);
1281 <std::uint8_t, std::uint64_t>);
1283 <std::uint8_t, std::int16_t>);
1285 <std::uint8_t, std::uint16_t>);
1287 <std::uint8_t, std::int32_t>);
1289 <std::uint8_t, std::uint32_t>);
1291 <std::uint8_t, std::int64_t>);
1293 <std::uint8_t, std::uint64_t>);
1298 <std::int16_t, std::int16_t>);
1301 <std::int16_t, std::int8_t>);
1303 <std::int16_t, std::uint8_t>);
1305 <std::int16_t, std::uint16_t>);
1307 <std::int16_t, std::int32_t>);
1309 <std::int16_t, std::uint32_t>);
1311 <std::int16_t, std::int64_t>);
1313 <std::int16_t, std::uint64_t>);
1315 <std::int16_t, std::uint16_t>);
1317 <std::int16_t, std::int32_t>);
1319 <std::int16_t, std::uint32_t>);
1321 <std::int16_t, std::int64_t>);
1323 <std::int16_t, std::uint64_t>);
1328 <std::uint16_t, std::uint16_t>);
1331 <std::uint16_t, std::int8_t>);
1333 <std::uint16_t, std::uint8_t>);
1335 <std::uint16_t, std::int16_t>);
1337 <std::uint16_t, std::int32_t>);
1339 <std::uint16_t, std::uint32_t>);
1341 <std::uint16_t, std::int64_t>);
1343 <std::uint16_t, std::uint64_t>);
1345 <std::uint16_t, std::int16_t>);
1347 <std::uint16_t, std::int32_t>);
1349 <std::uint16_t, std::uint32_t>);
1351 <std::uint16_t, std::int64_t>);
1353 <std::uint16_t, std::uint64_t>);
1358 <std::int32_t, std::int32_t>);
1361 <std::int32_t, std::int8_t>);
1363 <std::int32_t, std::uint8_t>);
1365 <std::int32_t, std::int16_t>);
1367 <std::int32_t, std::uint16_t>);
1369 <std::int32_t, std::uint32_t>);
1371 <std::int32_t, std::int64_t>);
1373 <std::int32_t, std::uint64_t>);
1375 <std::int32_t, std::int16_t>);
1377 <std::int32_t, std::uint16_t>);
1379 <std::int32_t, std::uint32_t>);
1381 <std::int32_t, std::int64_t>);
1383 <std::int32_t, std::uint64_t>);
1388 <std::uint32_t, std::uint32_t>);
1391 <std::uint32_t, std::int8_t>);
1393 <std::uint32_t, std::uint8_t>);
1395 <std::uint32_t, std::int16_t>);
1397 <std::uint32_t, std::uint16_t>);
1399 <std::uint32_t, std::int32_t>);
1401 <std::uint32_t, std::int64_t>);
1403 <std::uint32_t, std::uint64_t>);
1405 <std::uint32_t, std::int16_t>);
1407 <std::uint32_t, std::uint16_t>);
1409 <std::uint32_t, std::int32_t>);
1411 <std::uint32_t, std::int64_t>);
1413 <std::uint32_t, std::uint64_t>);
1418 <std::int64_t, std::int64_t>);
1421 <std::int64_t, std::int8_t>);
1423 <std::int64_t, std::uint8_t>);
1425 <std::int64_t, std::int16_t>);
1427 <std::int64_t, std::uint16_t>);
1429 <std::int64_t, std::int32_t>);
1431 <std::int64_t, std::uint32_t>);
1433 <std::int64_t, std::uint64_t>);
1435 <std::int64_t, std::int16_t>);
1437 <std::int64_t, std::uint16_t>);
1439 <std::int64_t, std::int32_t>);
1441 <std::int64_t, std::uint32_t>);
1443 <std::int64_t, std::uint64_t>);
1448 <std::uint64_t, std::uint64_t>);
1451 <std::uint64_t, std::int8_t>);
1453 <std::uint64_t, std::uint8_t>);
1455 <std::uint64_t, std::int16_t>);
1457 <std::uint64_t, std::uint16_t>);
1459 <std::uint64_t, std::int32_t>);
1461 <std::uint64_t, std::uint32_t>);
1463 <std::uint64_t, std::int64_t>);
1465 <std::uint64_t, std::int16_t>);
1467 <std::uint64_t, std::uint16_t>);
1469 <std::uint64_t, std::int32_t>);
1471 <std::uint64_t, std::uint32_t>);
1473 <std::uint64_t, std::int64_t>);
1489 <std::uint64_t, std::uint32_t>);
1491 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint64_t>);
1493 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint32_t>);
1498 static constexpr bool kIsMappable =
false;
1500 static constexpr std::size_t kBitsOnStorage =
kSize * 8;
1503 bool IsMappable()
const {
return kIsMappable; }
1504 void Pack(
void *,
const void *, std::size_t)
const {}
1505 void Unpack(
void *,
const void *, std::size_t)
const {}
1514RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Pack(
void *
dst,
const void *
src, std::size_t count)
const
1516 const bool *
boolArray =
reinterpret_cast<const bool *
>(
src);
1520 for (; i < count; ++i) {
1534RColumnElement<bool, ROOT::ENTupleColumnType::kBit>::Unpack(
void *
dst,
const void *
src, std::size_t count)
const
1537 const char *
charArray =
reinterpret_cast<const char *
>(
src);
1539 for (std::size_t i = 0; i < count; i += 8) {
1541 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.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
Helper templated class for swapping bytes; specializations for N={2,4,8} are provided below.