Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RColumnElement.cxx
Go to the documentation of this file.
1/// \file RColumnElement.cxx
2/// \ingroup NTuple ROOT7
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \date 2019-08-11
5/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
6/// is welcome!
7
8/*************************************************************************
9 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
10 * All rights reserved. *
11 * *
12 * For the licensing terms see $ROOTSYS/LICENSE. *
13 * For the list of contributors see $ROOTSYS/README/CREDITS. *
14 *************************************************************************/
15
17
18#include <TError.h>
19
20#include <algorithm>
21#include <bitset>
22#include <cstdint>
23#include <memory>
24#include <utility>
25
26template <>
27std::unique_ptr<ROOT::Experimental::Internal::RColumnElementBase>
28ROOT::Experimental::Internal::RColumnElementBase::Generate<void>(EColumnType type)
29{
30 switch (type) {
31 case EColumnType::kIndex64: return std::make_unique<RColumnElement<ClusterSize_t, EColumnType::kIndex64>>();
32 case EColumnType::kIndex32: return std::make_unique<RColumnElement<ClusterSize_t, EColumnType::kIndex32>>();
33 case EColumnType::kSwitch: return std::make_unique<RColumnElement<RColumnSwitch, EColumnType::kSwitch>>();
34 case EColumnType::kByte: return std::make_unique<RColumnElement<std::byte, EColumnType::kByte>>();
35 case EColumnType::kChar: return std::make_unique<RColumnElement<char, EColumnType::kChar>>();
36 case EColumnType::kBit: return std::make_unique<RColumnElement<bool, EColumnType::kBit>>();
37 case EColumnType::kReal64: return std::make_unique<RColumnElement<double, EColumnType::kReal64>>();
38 case EColumnType::kReal32: return std::make_unique<RColumnElement<float, EColumnType::kReal32>>();
39 // TODO: Change to std::float16_t in-memory type once available (from C++23).
40 case EColumnType::kReal16: return std::make_unique<RColumnElement<float, EColumnType::kReal16>>();
41 case EColumnType::kInt64: return std::make_unique<RColumnElement<std::int64_t, EColumnType::kInt64>>();
42 case EColumnType::kUInt64: return std::make_unique<RColumnElement<std::uint64_t, EColumnType::kUInt64>>();
43 case EColumnType::kInt32: return std::make_unique<RColumnElement<std::int32_t, EColumnType::kInt32>>();
44 case EColumnType::kUInt32: return std::make_unique<RColumnElement<std::uint32_t, EColumnType::kUInt32>>();
45 case EColumnType::kInt16: return std::make_unique<RColumnElement<std::int16_t, EColumnType::kInt16>>();
46 case EColumnType::kUInt16: return std::make_unique<RColumnElement<std::uint16_t, EColumnType::kUInt16>>();
47 case EColumnType::kInt8: return std::make_unique<RColumnElement<std::int8_t, EColumnType::kInt8>>();
48 case EColumnType::kUInt8: return std::make_unique<RColumnElement<std::uint8_t, EColumnType::kUInt8>>();
50 return std::make_unique<RColumnElement<ClusterSize_t, EColumnType::kSplitIndex64>>();
52 return std::make_unique<RColumnElement<ClusterSize_t, EColumnType::kSplitIndex32>>();
53 case EColumnType::kSplitReal64: return std::make_unique<RColumnElement<double, EColumnType::kSplitReal64>>();
54 case EColumnType::kSplitReal32: return std::make_unique<RColumnElement<float, EColumnType::kSplitReal32>>();
55 case EColumnType::kSplitInt64: return std::make_unique<RColumnElement<std::int64_t, EColumnType::kSplitInt64>>();
56 case EColumnType::kSplitUInt64: return std::make_unique<RColumnElement<std::uint64_t, EColumnType::kSplitUInt64>>();
57 case EColumnType::kSplitInt32: return std::make_unique<RColumnElement<std::int32_t, EColumnType::kSplitInt32>>();
58 case EColumnType::kSplitUInt32: return std::make_unique<RColumnElement<std::uint32_t, EColumnType::kSplitUInt32>>();
59 case EColumnType::kSplitInt16: return std::make_unique<RColumnElement<std::int16_t, EColumnType::kSplitInt16>>();
60 case EColumnType::kSplitUInt16: return std::make_unique<RColumnElement<std::uint16_t, EColumnType::kSplitUInt16>>();
61 default: R__ASSERT(false);
62 }
63 // never here
64 return nullptr;
65}
66
68{
69 switch (type) {
70 case EColumnType::kIndex64: return 64;
71 case EColumnType::kIndex32: return 32;
72 case EColumnType::kSwitch: return 96;
73 case EColumnType::kByte: return 8;
74 case EColumnType::kChar: return 8;
75 case EColumnType::kBit: return 1;
76 case EColumnType::kReal64: return 64;
77 case EColumnType::kReal32: return 32;
78 case EColumnType::kReal16: return 16;
79 case EColumnType::kInt64: return 64;
80 case EColumnType::kUInt64: return 64;
81 case EColumnType::kInt32: return 32;
82 case EColumnType::kUInt32: return 32;
83 case EColumnType::kInt16: return 16;
84 case EColumnType::kUInt16: return 16;
85 case EColumnType::kInt8: return 8;
86 case EColumnType::kUInt8: return 8;
87 case EColumnType::kSplitIndex64: return 64;
88 case EColumnType::kSplitIndex32: return 32;
89 case EColumnType::kSplitReal64: return 64;
90 case EColumnType::kSplitReal32: return 32;
91 case EColumnType::kSplitInt64: return 64;
92 case EColumnType::kSplitUInt64: return 64;
93 case EColumnType::kSplitInt32: return 32;
94 case EColumnType::kSplitUInt32: return 32;
95 case EColumnType::kSplitInt16: return 16;
96 case EColumnType::kSplitUInt16: return 16;
97 default: R__ASSERT(false);
98 }
99 // never here
100 return 0;
101}
102
104{
105 switch (type) {
106 case EColumnType::kIndex64: return "Index64";
107 case EColumnType::kIndex32: return "Index32";
108 case EColumnType::kSwitch: return "Switch";
109 case EColumnType::kByte: return "Byte";
110 case EColumnType::kChar: return "Char";
111 case EColumnType::kBit: return "Bit";
112 case EColumnType::kReal64: return "Real64";
113 case EColumnType::kReal32: return "Real32";
114 case EColumnType::kReal16: return "Real16";
115 case EColumnType::kInt64: return "Int64";
116 case EColumnType::kUInt64: return "UInt64";
117 case EColumnType::kInt32: return "Int32";
118 case EColumnType::kUInt32: return "UInt32";
119 case EColumnType::kInt16: return "Int16";
120 case EColumnType::kUInt16: return "UInt16";
121 case EColumnType::kInt8: return "Int8";
122 case EColumnType::kUInt8: return "UInt8";
123 case EColumnType::kSplitIndex64: return "SplitIndex64";
124 case EColumnType::kSplitIndex32: return "SplitIndex32";
125 case EColumnType::kSplitReal64: return "SplitReal64";
126 case EColumnType::kSplitReal32: return "SplitReal32";
127 case EColumnType::kSplitInt64: return "SplitInt64";
128 case EColumnType::kSplitUInt64: return "SplitUInt64";
129 case EColumnType::kSplitInt32: return "SplitInt32";
130 case EColumnType::kSplitUInt32: return "SplitUInt32";
131 case EColumnType::kSplitInt16: return "SplitInt16";
132 case EColumnType::kSplitUInt16: return "SplitUInt16";
133 default: return "UNKNOWN";
134 }
135}
136
138 void *dst, void *src, std::size_t count) const
139{
140 bool *boolArray = reinterpret_cast<bool *>(src);
141 char *charArray = reinterpret_cast<char *>(dst);
142 std::bitset<8> bitSet;
143 std::size_t i = 0;
144 for (; i < count; ++i) {
145 bitSet.set(i % 8, boolArray[i]);
146 if (i % 8 == 7) {
147 char packed = bitSet.to_ulong();
148 charArray[i / 8] = packed;
149 }
150 }
151 if (i % 8 != 0) {
152 char packed = bitSet.to_ulong();
153 charArray[i / 8] = packed;
154 }
155}
156
158 void *dst, void *src, std::size_t count) const
159{
160 bool *boolArray = reinterpret_cast<bool *>(dst);
161 char *charArray = reinterpret_cast<char *>(src);
162 std::bitset<8> bitSet;
163 for (std::size_t i = 0; i < count; i += 8) {
164 bitSet = charArray[i / 8];
165 for (std::size_t j = i; j < std::min(count, i + 8); ++j) {
166 boolArray[j] = bitSet[j % 8];
167 }
168 }
169}
#define R__ASSERT(e)
Definition TError.h:118
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
virtual void Pack(void *destination, void *source, std::size_t count) const
If the on-storage layout and the in-memory layout differ, packing creates an on-disk page from an in-...
virtual void Unpack(void *destination, void *source, std::size_t count) const
If the on-storage layout and the in-memory layout differ, unpacking creates a memory page from an on-...
static std::string GetTypeName(EColumnType type)