17#ifndef R__LITTLE_ENDIAN
20#define R__LITTLE_ENDIAN 1
22#define R__LITTLE_ENDIAN 0
54template <std::
size_t N>
55inline void CopyBswap(
void *destination,
const void *source, std::size_t count)
59 for (std::size_t i = 0; i < count; ++i) {
65#if R__LITTLE_ENDIAN == 0
67inline void ByteSwapIfNecessary(T &
value)
69 constexpr auto N =
sizeof(T);
71 void *valuePtr = &
value;
73 *
reinterpret_cast<bswap_value_type *
>(valuePtr) = swapped;
76#define ByteSwapIfNecessary(x) ((void)0)
83template <
typename DestT,
typename SourceT>
84inline void CastPack(
void *destination,
const void *source, std::size_t count)
86 static_assert(std::is_convertible_v<SourceT, DestT>);
87 auto dst =
reinterpret_cast<DestT *
>(destination);
88 auto src =
reinterpret_cast<const SourceT *
>(source);
89 for (std::size_t i = 0; i < count; ++i) {
91 ByteSwapIfNecessary(dst[i]);
99template <
typename DestT,
typename SourceT>
100inline void CastUnpack(
void *destination,
const void *source, std::size_t count)
102 auto dst =
reinterpret_cast<DestT *
>(destination);
103 auto src =
reinterpret_cast<const SourceT *
>(source);
104 for (std::size_t i = 0; i < count; ++i) {
105 SourceT val =
src[i];
106 ByteSwapIfNecessary(val);
114template <
typename DestT,
typename SourceT>
115inline void CastSplitPack(
void *destination,
const void *source, std::size_t count)
117 constexpr std::size_t
N =
sizeof(DestT);
118 auto splitArray =
reinterpret_cast<char *
>(destination);
119 auto src =
reinterpret_cast<const SourceT *
>(source);
120 for (std::size_t i = 0; i < count; ++i) {
122 ByteSwapIfNecessary(val);
123 for (std::size_t
b = 0;
b <
N; ++
b) {
124 splitArray[
b * count + i] =
reinterpret_cast<const char *
>(&val)[
b];
132template <
typename DestT,
typename SourceT>
133inline void CastSplitUnpack(
void *destination,
const void *source, std::size_t count)
135 constexpr std::size_t
N =
sizeof(SourceT);
136 auto dst =
reinterpret_cast<DestT *
>(destination);
137 auto splitArray =
reinterpret_cast<const char *
>(source);
138 for (std::size_t i = 0; i < count; ++i) {
140 for (std::size_t
b = 0;
b <
N; ++
b) {
141 reinterpret_cast<char *
>(&val)[
b] = splitArray[
b * count + i];
143 ByteSwapIfNecessary(val);
151template <
typename DestT,
typename SourceT>
152inline void CastDeltaSplitPack(
void *destination,
const void *source, std::size_t count)
154 constexpr std::size_t
N =
sizeof(DestT);
155 auto src =
reinterpret_cast<const SourceT *
>(source);
156 auto splitArray =
reinterpret_cast<char *
>(destination);
157 for (std::size_t i = 0; i < count; ++i) {
158 DestT val = (i == 0) ?
src[0] :
src[i] -
src[i - 1];
159 ByteSwapIfNecessary(val);
160 for (std::size_t
b = 0;
b <
N; ++
b) {
161 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
169template <
typename DestT,
typename SourceT>
170inline void CastDeltaSplitUnpack(
void *destination,
const void *source, std::size_t count)
172 constexpr std::size_t
N =
sizeof(SourceT);
173 auto splitArray =
reinterpret_cast<const char *
>(source);
174 auto dst =
reinterpret_cast<DestT *
>(destination);
175 for (std::size_t i = 0; i < count; ++i) {
177 for (std::size_t
b = 0;
b <
N; ++
b) {
178 reinterpret_cast<char *
>(&val)[
b] = splitArray[
b * count + i];
180 ByteSwapIfNecessary(val);
181 dst[i] = (i == 0) ? val : dst[i - 1] + val;
188template <
typename DestT,
typename SourceT>
189inline void CastZigzagSplitPack(
void *destination,
const void *source, std::size_t count)
191 using UDestT = std::make_unsigned_t<DestT>;
192 constexpr std::size_t kNBitsDestT =
sizeof(DestT) * 8;
193 constexpr std::size_t
N =
sizeof(DestT);
194 auto src =
reinterpret_cast<const SourceT *
>(source);
195 auto splitArray =
reinterpret_cast<char *
>(destination);
196 for (std::size_t i = 0; i < count; ++i) {
197 UDestT val = (
static_cast<DestT
>(
src[i]) << 1) ^ (
static_cast<DestT
>(
src[i]) >> (kNBitsDestT - 1));
198 ByteSwapIfNecessary(val);
199 for (std::size_t
b = 0;
b <
N; ++
b) {
200 splitArray[
b * count + i] =
reinterpret_cast<char *
>(&val)[
b];
208template <
typename DestT,
typename SourceT>
209inline void CastZigzagSplitUnpack(
void *destination,
const void *source, std::size_t count)
211 using USourceT = std::make_unsigned_t<SourceT>;
212 constexpr std::size_t
N =
sizeof(SourceT);
213 auto splitArray =
reinterpret_cast<const char *
>(source);
214 auto dst =
reinterpret_cast<DestT *
>(destination);
215 for (std::size_t i = 0; i < count; ++i) {
217 for (std::size_t
b = 0;
b <
N; ++
b) {
218 reinterpret_cast<char *
>(&val)[
b] = splitArray[
b * count + i];
220 ByteSwapIfNecessary(val);
221 dst[i] =
static_cast<SourceT
>((val >> 1) ^ -(
static_cast<SourceT
>(val) & 1));
232template <
typename CppT, EColumnType>
235template <
typename CppT>
236std::unique_ptr<RColumnElementBase> GenerateColumnElementInternal(
EColumnType type)
239 case EColumnType::kIndex64:
return std::make_unique<RColumnElement<CppT, EColumnType::kIndex64>>();
240 case EColumnType::kIndex32:
return std::make_unique<RColumnElement<CppT, EColumnType::kIndex32>>();
241 case EColumnType::kSwitch:
return std::make_unique<RColumnElement<CppT, EColumnType::kSwitch>>();
242 case EColumnType::kByte:
return std::make_unique<RColumnElement<CppT, EColumnType::kByte>>();
243 case EColumnType::kChar:
return std::make_unique<RColumnElement<CppT, EColumnType::kChar>>();
244 case EColumnType::kBit:
return std::make_unique<RColumnElement<CppT, EColumnType::kBit>>();
245 case EColumnType::kReal64:
return std::make_unique<RColumnElement<CppT, EColumnType::kReal64>>();
246 case EColumnType::kReal32:
return std::make_unique<RColumnElement<CppT, EColumnType::kReal32>>();
247 case EColumnType::kReal16:
return std::make_unique<RColumnElement<CppT, EColumnType::kReal16>>();
248 case EColumnType::kInt64:
return std::make_unique<RColumnElement<CppT, EColumnType::kInt64>>();
249 case EColumnType::kUInt64:
return std::make_unique<RColumnElement<CppT, EColumnType::kUInt64>>();
250 case EColumnType::kInt32:
return std::make_unique<RColumnElement<CppT, EColumnType::kInt32>>();
251 case EColumnType::kUInt32:
return std::make_unique<RColumnElement<CppT, EColumnType::kUInt32>>();
252 case EColumnType::kInt16:
return std::make_unique<RColumnElement<CppT, EColumnType::kInt16>>();
253 case EColumnType::kUInt16:
return std::make_unique<RColumnElement<CppT, EColumnType::kUInt16>>();
254 case EColumnType::kInt8:
return std::make_unique<RColumnElement<CppT, EColumnType::kInt8>>();
255 case EColumnType::kUInt8:
return std::make_unique<RColumnElement<CppT, EColumnType::kUInt8>>();
256 case EColumnType::kSplitIndex64:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitIndex64>>();
257 case EColumnType::kSplitIndex32:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitIndex32>>();
258 case EColumnType::kSplitReal64:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitReal64>>();
259 case EColumnType::kSplitReal32:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitReal32>>();
260 case EColumnType::kSplitInt64:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitInt64>>();
261 case EColumnType::kSplitUInt64:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitUInt64>>();
262 case EColumnType::kSplitInt32:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitInt32>>();
263 case EColumnType::kSplitUInt32:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitUInt32>>();
264 case EColumnType::kSplitInt16:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitInt16>>();
265 case EColumnType::kSplitUInt16:
return std::make_unique<RColumnElement<CppT, EColumnType::kSplitUInt16>>();
276template <
typename CppT>
277class RColumnElementLE :
public RColumnElementBase {
279 explicit RColumnElementLE(std::size_t
size, std::size_t bitsOnStorage) : RColumnElementBase(
size, bitsOnStorage) {}
284 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
286#if R__LITTLE_ENDIAN == 1
287 RColumnElementBase::Pack(dst,
src, count);
289 CopyBswap<sizeof(CppT)>(dst,
src, count);
292 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
294#if R__LITTLE_ENDIAN == 1
295 RColumnElementBase::Unpack(dst,
src, count);
297 CopyBswap<sizeof(CppT)>(dst,
src, count);
306template <
typename CppT,
typename NarrowT>
307class RColumnElementCastLE :
public RColumnElementBase {
309 explicit RColumnElementCastLE(std::size_t
size, std::size_t bitsOnStorage) : RColumnElementBase(
size, bitsOnStorage)
314 static constexpr bool kIsMappable =
false;
316 void Pack(
void *dst,
const void *
src, std::size_t count)
const final { CastPack<NarrowT, CppT>(dst,
src, count); }
317 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
319 CastUnpack<CppT, NarrowT>(dst,
src, count);
328template <
typename CppT,
typename NarrowT>
329class RColumnElementSplitLE :
public RColumnElementBase {
331 explicit RColumnElementSplitLE(std::size_t
size, std::size_t bitsOnStorage) : RColumnElementBase(
size, bitsOnStorage)
336 static constexpr bool kIsMappable =
false;
338 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
340 CastSplitPack<NarrowT, CppT>(dst,
src, count);
342 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
344 CastSplitUnpack<CppT, NarrowT>(dst,
src, count);
353template <
typename CppT,
typename NarrowT>
354class RColumnElementDeltaSplitLE :
public RColumnElementBase {
356 explicit RColumnElementDeltaSplitLE(std::size_t
size, std::size_t bitsOnStorage)
357 : RColumnElementBase(
size, bitsOnStorage)
362 static constexpr bool kIsMappable =
false;
364 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
366 CastDeltaSplitPack<NarrowT, CppT>(dst,
src, count);
368 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
370 CastDeltaSplitUnpack<CppT, NarrowT>(dst,
src, count);
379template <
typename CppT,
typename NarrowT>
380class RColumnElementZigzagSplitLE :
public RColumnElementBase {
382 explicit RColumnElementZigzagSplitLE(std::size_t
size, std::size_t bitsOnStorage)
383 : RColumnElementBase(
size, bitsOnStorage)
388 static constexpr bool kIsMappable =
false;
390 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
392 CastZigzagSplitPack<NarrowT, CppT>(dst,
src, count);
394 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
396 CastZigzagSplitUnpack<CppT, NarrowT>(dst,
src, count);
408template <
typename CppT, EColumnType ColumnT = EColumnType::kUnknown>
409class RColumnElement :
public RColumnElementBase {
411 RColumnElement() : RColumnElementBase(sizeof(CppT))
414 R__FAIL(std::string(
"internal error: no column mapping for this C++ type: ") +
typeid(CppT).
name() +
" --> " +
415 GetTypeName(ColumnT)));
422 static constexpr std::size_t
kSize =
sizeof(
bool);
423 RColumnElement() : RColumnElementBase(
kSize) {}
427class RColumnElement<std::
byte, EColumnType::kUnknown> :
public RColumnElementBase {
429 static constexpr std::size_t
kSize =
sizeof(std::byte);
430 RColumnElement() : RColumnElementBase(
kSize) {}
436 static constexpr std::size_t
kSize =
sizeof(char);
437 RColumnElement() : RColumnElementBase(
kSize) {}
441class RColumnElement<std::int8_t, EColumnType::kUnknown> :
public RColumnElementBase {
443 static constexpr std::size_t
kSize =
sizeof(std::int8_t);
444 RColumnElement() : RColumnElementBase(
kSize) {}
448class RColumnElement<std::uint8_t, EColumnType::kUnknown> :
public RColumnElementBase {
450 static constexpr std::size_t
kSize =
sizeof(std::uint8_t);
451 RColumnElement() : RColumnElementBase(
kSize) {}
455class RColumnElement<std::int16_t, EColumnType::kUnknown> :
public RColumnElementBase {
457 static constexpr std::size_t
kSize =
sizeof(std::int16_t);
458 RColumnElement() : RColumnElementBase(
kSize) {}
462class RColumnElement<std::uint16_t, EColumnType::kUnknown> :
public RColumnElementBase {
464 static constexpr std::size_t
kSize =
sizeof(std::uint16_t);
465 RColumnElement() : RColumnElementBase(
kSize) {}
469class RColumnElement<std::int32_t, EColumnType::kUnknown> :
public RColumnElementBase {
471 static constexpr std::size_t
kSize =
sizeof(std::int32_t);
472 RColumnElement() : RColumnElementBase(
kSize) {}
476class RColumnElement<std::uint32_t, EColumnType::kUnknown> :
public RColumnElementBase {
478 static constexpr std::size_t
kSize =
sizeof(std::uint32_t);
479 RColumnElement() : RColumnElementBase(
kSize) {}
483class RColumnElement<std::int64_t, EColumnType::kUnknown> :
public RColumnElementBase {
485 static constexpr std::size_t
kSize =
sizeof(std::int64_t);
486 RColumnElement() : RColumnElementBase(
kSize) {}
490class RColumnElement<std::uint64_t, EColumnType::kUnknown> :
public RColumnElementBase {
492 static constexpr std::size_t
kSize =
sizeof(std::uint64_t);
493 RColumnElement() : RColumnElementBase(
kSize) {}
499 static constexpr std::size_t
kSize =
sizeof(float);
500 RColumnElement() : RColumnElementBase(
kSize) {}
506 static constexpr std::size_t
kSize =
sizeof(
double);
507 RColumnElement() : RColumnElementBase(
kSize) {}
511class RColumnElement<
ROOT::Experimental::ClusterSize_t, EColumnType::kUnknown> :
public RColumnElementBase {
514 RColumnElement() : RColumnElementBase(
kSize) {}
518class RColumnElement<
ROOT::Experimental::RColumnSwitch, EColumnType::kUnknown> :
public RColumnElementBase {
521 RColumnElement() : RColumnElementBase(
kSize) {}
530class RColumnElement<
ROOT::Experimental::RColumnSwitch, EColumnType::kSwitch> :
public RColumnElementBase {
532 struct RSwitchElement {
533 std::uint64_t fIndex;
538 static constexpr bool kIsMappable =
false;
540 static constexpr std::size_t kBitsOnStorage = 96;
541 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
542 bool IsMappable() const final {
return kIsMappable; }
544 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
547 auto dstArray =
reinterpret_cast<unsigned char *
>(dst);
548 for (std::size_t i = 0; i < count; ++i) {
549 RSwitchElement element{srcArray[i].
GetIndex(), srcArray[i].GetTag()};
550#if R__LITTLE_ENDIAN == 0
554 memcpy(dstArray + i * 12, &element, 12);
558 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
560 auto srcArray =
reinterpret_cast<const unsigned char *
>(
src);
562 for (std::size_t i = 0; i < count; ++i) {
563 RSwitchElement element;
564 memcpy(&element, srcArray + i * 12, 12);
565#if R__LITTLE_ENDIAN == 0
578 static constexpr bool kIsMappable =
false;
579 static constexpr std::size_t
kSize =
sizeof(
bool);
580 static constexpr std::size_t kBitsOnStorage = 1;
581 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
582 bool IsMappable() const final {
return kIsMappable; }
584 void Pack(
void *dst,
const void *
src, std::size_t count)
const final;
585 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final;
591 static constexpr bool kIsMappable =
false;
592 static constexpr std::size_t
kSize =
sizeof(float);
593 static constexpr std::size_t kBitsOnStorage = 16;
594 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
595 bool IsMappable() const final {
return kIsMappable; }
597 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
599 const float *floatArray =
reinterpret_cast<const float *
>(
src);
600 std::uint16_t *uint16Array =
reinterpret_cast<std::uint16_t *
>(dst);
602 for (std::size_t i = 0; i < count; ++i) {
604 ByteSwapIfNecessary(uint16Array[i]);
608 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
610 float *floatArray =
reinterpret_cast<float *
>(dst);
611 const std::uint16_t *uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
613 for (std::size_t i = 0; i < count; ++i) {
614 std::uint16_t val = uint16Array[i];
615 ByteSwapIfNecessary(val);
624 static constexpr bool kIsMappable =
false;
625 static constexpr std::size_t
kSize =
sizeof(
double);
626 static constexpr std::size_t kBitsOnStorage = 16;
627 RColumnElement() : RColumnElementBase(
kSize, kBitsOnStorage) {}
628 bool IsMappable() const final {
return kIsMappable; }
630 void Pack(
void *dst,
const void *
src, std::size_t count)
const final
632 const double *doubleArray =
reinterpret_cast<const double *
>(
src);
633 std::uint16_t *uint16Array =
reinterpret_cast<std::uint16_t *
>(dst);
635 for (std::size_t i = 0; i < count; ++i) {
637 ByteSwapIfNecessary(uint16Array[i]);
641 void Unpack(
void *dst,
const void *
src, std::size_t count)
const final
643 double *doubleArray =
reinterpret_cast<double *
>(dst);
644 const std::uint16_t *uint16Array =
reinterpret_cast<const std::uint16_t *
>(
src);
646 for (std::size_t i = 0; i < count; ++i) {
647 std::uint16_t val = uint16Array[i];
648 ByteSwapIfNecessary(val);
654#define __RCOLUMNELEMENT_SPEC_BODY(CppT, BaseT, BitsOnStorage) \
655 static constexpr std::size_t kSize = sizeof(CppT); \
656 static constexpr std::size_t kBitsOnStorage = BitsOnStorage; \
657 RColumnElement() : BaseT(kSize, kBitsOnStorage) {} \
658 bool IsMappable() const final \
660 return kIsMappable; \
668#define DECLARE_RCOLUMNELEMENT_SPEC(CppT, ColumnT, BitsOnStorage, BaseT, ...) \
670 class RColumnElement<CppT, ColumnT> : public BaseT __VA_ARGS__ { \
672 __RCOLUMNELEMENT_SPEC_BODY(CppT, BaseT, BitsOnStorage) \
674#define DECLARE_RCOLUMNELEMENT_SPEC_SIMPLE(CppT, ColumnT, BitsOnStorage) \
676 class RColumnElement<CppT, ColumnT> : public RColumnElementBase { \
678 static constexpr bool kIsMappable = true; \
679 __RCOLUMNELEMENT_SPEC_BODY(CppT, RColumnElementBase, BitsOnStorage) \
698 <std::int16_t, std::int16_t>);
700 <std::int16_t, std::uint16_t>);
705 <std::uint16_t, std::uint16_t>);
707 <std::uint16_t, std::int16_t>);
712 <std::int32_t, std::int32_t>);
714 <std::int32_t, std::uint32_t>);
719 <std::uint32_t, std::uint32_t>);
721 <std::uint32_t, std::int32_t>);
726 <std::int64_t, std::int64_t>);
728 <std::int64_t, std::uint64_t>);
731 <std::int64_t, std::uint32_t>);
733 <std::int64_t, std::int32_t>);
735 <std::int64_t, std::uint32_t>);
740 <std::uint64_t, std::uint64_t>);
742 <std::uint64_t, std::int64_t>);
755 <std::uint64_t, std::uint32_t>);
757 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint64_t>);
759 RColumnElementDeltaSplitLE, <std::uint64_t, std::uint32_t>);
761void RColumnElement<bool, ROOT::Experimental::EColumnType::kBit>::Pack(
void *dst,
const void *
src,
762 std::size_t count)
const
764 const bool *boolArray =
reinterpret_cast<const bool *
>(
src);
765 char *charArray =
reinterpret_cast<char *
>(dst);
766 std::bitset<8> bitSet;
768 for (; i < count; ++i) {
769 bitSet.set(i % 8, boolArray[i]);
771 char packed = bitSet.to_ulong();
772 charArray[i / 8] = packed;
776 char packed = bitSet.to_ulong();
777 charArray[i / 8] = packed;
781void RColumnElement<bool, ROOT::Experimental::EColumnType::kBit>::Unpack(
void *dst,
const void *
src,
782 std::size_t count)
const
784 bool *boolArray =
reinterpret_cast<bool *
>(dst);
785 const char *charArray =
reinterpret_cast<const char *
>(
src);
786 std::bitset<8> bitSet;
787 for (std::size_t i = 0; i < count; i += 8) {
788 bitSet = charArray[i / 8];
789 for (std::size_t j = i; j < std::min(count, i + 8); ++j) {
790 boolArray[j] = bitSet[j % 8];
#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
#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
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
The available trivial, native content types of a column.
A column element encapsulates the translation between basic C++ types and their column representation...
Holds the index and the tag of a kSwitch column.
ClusterSize_t GetIndex() const
Base class for all ROOT issued exceptions.
std::uint16_t FloatToHalf(float value)
Convert an IEEE single-precision float to half-precision.
float HalfToFloat(std::uint16_t value)
Convert an IEEE half-precision float to single-precision.
RClusterSize ClusterSize_t
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.
Wrap the integer in a struct in order to avoid template specialization clash with std::uint64_t.