16 #ifndef ROOT7_RColumnElement
17 #define ROOT7_RColumnElement
26 #include <type_traits>
29 namespace Experimental {
47 class RColumnElementBase {
56 : fRawContent(nullptr)
59 RColumnElementBase(
void *rawContent, std::size_t size) : fRawContent(rawContent), fSize(size)
61 RColumnElementBase(
const RColumnElementBase &elemArray, std::size_t at)
62 : fRawContent(static_cast<unsigned char *>(elemArray.fRawContent) + elemArray.fSize * at)
63 , fSize(elemArray.fSize)
65 RColumnElementBase(
const RColumnElementBase& other) =
default;
66 RColumnElementBase(RColumnElementBase&& other) =
default;
67 RColumnElementBase& operator =(
const RColumnElementBase& other) =
delete;
68 RColumnElementBase& operator =(RColumnElementBase&& other) =
default;
69 virtual ~RColumnElementBase() =
default;
71 static RColumnElementBase Generate(EColumnType type);
74 void WriteTo(
void *destination, std::size_t count)
const {
75 std::memcpy(destination, fRawContent, fSize * count);
79 void ReadFrom(
void *source, std::size_t count) {
80 std::memcpy(fRawContent, source, fSize * count);
84 virtual bool IsMappable()
const { R__ASSERT(
false);
return false; }
85 virtual std::size_t GetBitsOnStorage()
const { R__ASSERT(
false);
return 0; }
88 virtual void Pack(
void *destination,
void *source, std::size_t count)
const
90 std::memcpy(destination, source, count);
94 virtual void Unpack(
void *destination,
void *source, std::size_t count)
const
96 std::memcpy(destination, source, count);
99 void *GetRawContent()
const {
return fRawContent; }
100 std::size_t GetSize()
const {
return fSize; }
106 template <
typename CppT, EColumnType ColumnT>
107 class RColumnElement :
public RColumnElementBase {
109 explicit RColumnElement(CppT* value) : RColumnElementBase(value, sizeof(CppT))
113 static_assert(
sizeof(CppT) !=
sizeof(CppT),
"No column mapping for this C++ type");
119 class RColumnElement<float, EColumnType::kReal32> :
public RColumnElementBase {
121 static constexpr
bool kIsMappable =
true;
122 static constexpr std::size_t kSize =
sizeof(float);
123 static constexpr std::size_t kBitsOnStorage = kSize * 8;
124 explicit RColumnElement(
float *value) : RColumnElementBase(value, kSize) {}
125 bool IsMappable() const final {
return kIsMappable; }
126 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
130 class RColumnElement<double, EColumnType::kReal64> :
public RColumnElementBase {
132 static constexpr
bool kIsMappable =
true;
133 static constexpr std::size_t kSize =
sizeof(double);
134 static constexpr std::size_t kBitsOnStorage = kSize * 8;
135 explicit RColumnElement(
double *value) : RColumnElementBase(value, kSize) {}
136 bool IsMappable() const final {
return kIsMappable; }
137 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
141 class RColumnElement<std::uint8_t, EColumnType::kByte> :
public RColumnElementBase {
143 static constexpr
bool kIsMappable =
true;
144 static constexpr std::size_t kSize =
sizeof(std::uint8_t);
145 static constexpr std::size_t kBitsOnStorage = kSize * 8;
146 explicit RColumnElement(std::uint8_t *value) : RColumnElementBase(value, kSize) {}
147 bool IsMappable() const final {
return kIsMappable; }
148 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
152 class RColumnElement<std::int32_t, EColumnType::kInt32> :
public RColumnElementBase {
154 static constexpr
bool kIsMappable =
true;
155 static constexpr std::size_t kSize =
sizeof(std::int32_t);
156 static constexpr std::size_t kBitsOnStorage = kSize * 8;
157 explicit RColumnElement(std::int32_t *value) : RColumnElementBase(value, kSize) {}
158 bool IsMappable() const final {
return kIsMappable; }
159 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
163 class RColumnElement<std::uint32_t, EColumnType::kInt32> :
public RColumnElementBase {
165 static constexpr
bool kIsMappable =
true;
166 static constexpr std::size_t kSize =
sizeof(std::uint32_t);
167 static constexpr std::size_t kBitsOnStorage = kSize * 8;
168 explicit RColumnElement(std::uint32_t *value) : RColumnElementBase(value, kSize) {}
169 bool IsMappable() const final {
return kIsMappable; }
170 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
174 class RColumnElement<std::int64_t, EColumnType::kInt64> :
public RColumnElementBase {
176 static constexpr
bool kIsMappable =
true;
177 static constexpr std::size_t kSize =
sizeof(std::int64_t);
178 static constexpr std::size_t kBitsOnStorage = kSize * 8;
179 explicit RColumnElement(std::int64_t *value) : RColumnElementBase(value, kSize) {}
180 bool IsMappable() const final {
return kIsMappable; }
181 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
185 class RColumnElement<std::uint64_t, EColumnType::kInt64> :
public RColumnElementBase {
187 static constexpr
bool kIsMappable =
true;
188 static constexpr std::size_t kSize =
sizeof(std::uint64_t);
189 static constexpr std::size_t kBitsOnStorage = kSize * 8;
190 explicit RColumnElement(std::uint64_t *value) : RColumnElementBase(value, kSize) {}
191 bool IsMappable() const final {
return kIsMappable; }
192 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
196 class RColumnElement<ClusterSize_t, EColumnType::kIndex> :
public RColumnElementBase {
198 static constexpr
bool kIsMappable =
true;
199 static constexpr std::size_t kSize =
sizeof(ROOT::Experimental::ClusterSize_t);
200 static constexpr std::size_t kBitsOnStorage = kSize * 8;
201 explicit RColumnElement(ClusterSize_t *value) : RColumnElementBase(value, kSize) {}
202 bool IsMappable() const final {
return kIsMappable; }
203 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
207 class RColumnElement<RColumnSwitch, EColumnType::kSwitch> :
public RColumnElementBase {
209 static constexpr
bool kIsMappable =
true;
210 static constexpr std::size_t kSize =
sizeof(ROOT::Experimental::RColumnSwitch);
211 static constexpr std::size_t kBitsOnStorage = kSize * 8;
212 explicit RColumnElement(RColumnSwitch *value) : RColumnElementBase(value, kSize) {}
213 bool IsMappable() const final {
return kIsMappable; }
214 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
218 class RColumnElement<char, EColumnType::kByte> :
public RColumnElementBase {
220 static constexpr
bool kIsMappable =
true;
221 static constexpr std::size_t kSize =
sizeof(char);
222 static constexpr std::size_t kBitsOnStorage = kSize * 8;
223 explicit RColumnElement(
char *value) : RColumnElementBase(value, kSize) {}
224 bool IsMappable() const final {
return kIsMappable; }
225 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
229 class RColumnElement<bool, EColumnType::kBit> :
public RColumnElementBase {
231 static constexpr
bool kIsMappable =
false;
232 static constexpr std::size_t kSize =
sizeof(bool);
233 static constexpr std::size_t kBitsOnStorage = 1;
234 explicit RColumnElement(
bool *value) : RColumnElementBase(value, kSize) {}
235 bool IsMappable() const final {
return kIsMappable; }
236 std::size_t GetBitsOnStorage() const final {
return kBitsOnStorage; }
238 void Pack(
void *dst,
void *src, std::size_t count)
const final;
239 void Unpack(
void *dst,
void *src, std::size_t count)
const final;