19#ifndef DATA_PIECES_ARRAY_H
20#define DATA_PIECES_ARRAY_H
23#include "DataPieces.h"
40 static_assert(std::is_trivially_copyable<T>::value,
"DataPieceArray only supports POD types.");
67 return vrs::getTypeName<T>();
88 bool get(T* outValues,
size_t count)
const {
89 const size_t bytesRequested =
sizeof(T) * count;
91 (count <= count_) ? layout_.
getFixedData<T>(offset_, bytesRequested) :
nullptr;
92 if (ptr !=
nullptr && bytesRequested > 0) {
93 memcpy(outValues, ptr, bytesRequested);
96 const size_t defaultReadCount = min<size_t>(count, defaultValues_.size());
97 if (defaultReadCount > 0) {
98 memcpy(outValues, defaultValues_.data(), defaultReadCount *
sizeof(T));
101 for (
size_t k = defaultValues_.size(); k < count; k++) {
111 bool get(T& outValue,
size_t index)
const {
112 const size_t bytesRequested =
sizeof(T) * (index + 1);
114 (index < count_) ? layout_.
getFixedData<T>(offset_, bytesRequested) :
nullptr;
115 if (ptr !=
nullptr) {
116 outValue = readUnaligned<T>(ptr + index);
119 if (index < defaultValues_.size()) {
120 outValue = defaultValues_[index];
129 bool get(vector<T>& outValues)
const {
131 if (ptr !=
nullptr) {
132 outValues.resize(count_);
136 outValues = defaultValues_;
147 bool set(
const T* values,
size_t count) {
149 if (ptr !=
nullptr) {
151 memcpy(ptr, values,
sizeof(T) * min<size_t>(count, count_));
154 while (count < count_) {
155 writeUnaligned<T>(ptr + count++, v);
167 bool set(
const T& value,
size_t index) {
169 if (ptr !=
nullptr && index < count_) {
170 writeUnaligned<T>(ptr + index, value);
183 bool set(
const T (&arr)[n]) {
193 bool set(
const vector<T>& values) {
194 return values.empty() ?
set(
nullptr, 0) :
set(values.data(), values.size());
200 return defaultValues_;
209 defaultValues_.resize(count_);
210 size_t copySize = min(count, count_) *
sizeof(T);
212 memcpy(defaultValues_.data(), defaultValues, copySize);
214 for (; count < count_; count++) {
215 defaultValues_[count] = T{};
243 properties_[propertyName] = value;
250 auto iter = properties_.find(propertyName);
251 if (iter != properties_.end()) {
252 outValue = iter->second;
300 return patchedPiece !=
nullptr && patchedPiece->
set(values, count);
313 void print(ostream& out,
const string& indent)
const override;
318 void printCompact(ostream& out,
const string& indent)
const override;
334 unique_ptr<DataPiece>
clone()
const override {
336 other->tags_ = tags_;
337 other->required_ = required_;
338 other->properties_ = properties_;
339 other->defaultValues_ = defaultValues_;
347 bool retrieved = source->
get(values);
353 const size_t count_{};
354 map<string, T> properties_;
355 vector<T> defaultValues_;
vector< int8_t > & getFixedData()
Definition DataLayout.h:255
T * getMappedPiece(size_t pieceIndex) const
Get a typed piece by index in the mapped datalayout, exclusively.
Definition DataLayout.h:523
Fixed size array of POD values.
Definition DataPieceArray.h:39
const vector< T > & getDefault() const
Definition DataPieceArray.h:199
bool get(T *outValues, size_t count) const
Definition DataPieceArray.h:88
bool set(const T &value, size_t index)
Definition DataPieceArray.h:167
void printCompact(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1334
void setProperty(const string &propertyName, T value)
Definition DataPieceArray.h:242
void serialize(JsonWrapper &jsonWrapper, const JsonFormatProfileSpec &profile) override
Definition DataLayout.cpp:1362
size_t collectVariableData(int8_t *, size_t) override
Definition DataPieceArray.h:76
const string & getElementTypeName() const override
Definition DataPieceArray.h:66
bool getMin(T &outMin) const
Definition DataPieceArray.h:284
void initToDefault() override
Initialize to default value.
Definition DataPieceArray.h:235
bool copyFrom(const DataPiece *original) override
Set or stage value from another piece known to be of the same type.
Definition DataPieceArray.h:344
bool isAvailable() const override
Definition DataPieceArray.h:305
bool set(const T(&arr)[n])
Definition DataPieceArray.h:183
DataPieceArray(string label, size_t count)
Definition DataPieceArray.h:45
bool set(const T *values, size_t count)
Definition DataPieceArray.h:147
bool patchValue(const T *values, size_t count) const
Definition DataPieceArray.h:298
void print(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1302
size_t getArraySize() const
Get the size of the array.
Definition DataPieceArray.h:60
bool getMax(T &outMax) const
Definition DataPieceArray.h:290
bool set(const vector< T > &values)
Definition DataPieceArray.h:193
void setRange(T min, T max)
Definition DataPieceArray.h:277
void setDefault(const T(&arr)[n])
Definition DataPieceArray.h:223
void setMax(T max)
Definition DataPieceArray.h:269
unique_ptr< DataPiece > clone() const override
Definition DataPieceArray.h:334
bool get(vector< T > &outValues) const
Definition DataPieceArray.h:129
void setDefault(const vector< T > &values)
Definition DataPieceArray.h:230
size_t getVariableSize() const override
Definition DataPieceArray.h:71
void setDefault(const T *defaultValues, size_t count)
Definition DataPieceArray.h:208
void setMin(T min)
Definition DataPieceArray.h:262
bool isSame(const DataPiece *rhs) const override
Definition DataLayout.cpp:1352
DataPieceArray(string label, size_t count, const T(&defaultValues)[n])
Definition DataPieceArray.h:51
bool getProperty(const string &propertyName, T &outValue) const
Definition DataPieceArray.h:249
bool get(T &outValue, size_t index) const
Definition DataPieceArray.h:111
Abstract class representing a piece of information part of a DataLayout.
Definition DataPieces.h:40
static const string kMaxValue
Special property name for the maximum value of the DataPiece.
Definition DataPieces.h:61
static const string kMinValue
Special property name for the minimum value of the DataPiece.
Definition DataPieces.h:59
const string & getLabel() const
Definition DataPieces.h:76
size_t getFixedSize() const
Definition DataPieces.h:114
Definition Compressor.cpp:113
DataPieceType
Specifier for a type of DataPiece.
Definition DataLayout.h:57