VRS
A file format for sensor data.
Loading...
Searching...
No Matches
DataPieceValue.h
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#ifndef DATA_PIECES_VALUE_H
20#define DATA_PIECES_VALUE_H
21
22#include <memory>
23
24#ifndef DATA_PIECES_H
25#include "DataPieces.h"
26#endif
27
28namespace vrs {
29
30using std::map;
31using std::ostream;
32using std::string;
33using std::unique_ptr;
34
36template <typename T>
37class DataPieceValue : public DataPiece {
38 static_assert(
39 !std::is_same<T, bool>::value,
40 "DataPieceValue does not support bool. Use vrs::Bool instead");
41 static_assert(std::is_trivially_copyable<T>::value, "DataPieceValue only supports POD types.");
42
43 public:
46 explicit DataPieceValue(string label, T defaultValue = {})
47 : DataPiece(std::move(label), DataPieceType::Value, sizeof(T)), defaultValue_{defaultValue} {}
50 explicit DataPieceValue(const MakerBundle& bundle);
51
54 const string& getElementTypeName() const override {
55 return vrs::getTypeName<T>();
56 }
59 size_t getVariableSize() const override {
60 return 0;
61 }
64 size_t collectVariableData(int8_t*, size_t) override {
65 return 0;
66 }
67
69 T get() const {
70 const T* const ptr = layout_.getFixedData<T>(offset_, sizeof(T));
71 return ptr != nullptr ? readUnaligned<T>(ptr) : getDefault();
72 }
76 bool get(T& outValue) const {
77 const T* const ptr = layout_.getFixedData<T>(offset_, sizeof(T));
78 if (ptr != nullptr) {
79 outValue = readUnaligned<T>(ptr);
80 return true;
81 } else {
82 outValue = getDefault();
83 return false;
84 }
85 }
86
90 bool set(const T& value) {
91 T* const ptr = layout_.getFixedData<T>(offset_, sizeof(T));
92 if (ptr != nullptr) {
93 writeUnaligned<T>(ptr, value);
94 return true;
95 }
96 return false;
97 }
98
101 inline const T& getDefault() const {
102 return defaultValue_;
103 }
104
107 void setDefault(const T& defaultValue) {
108 defaultValue_ = defaultValue;
109 }
110
112 void initToDefault() override {
113 set(getDefault());
114 }
115
120 bool getProperty(const string& propertyName, T& outValue) const {
121 auto iter = properties_.find(propertyName);
122 if (iter != properties_.end()) {
123 outValue = iter->second;
124 return true;
125 }
126 return false;
127 }
131 void setProperty(const string& propertyName, T value) {
132 properties_[propertyName] = value;
133 }
134
138 bool getMin(T& outMin) const {
139 return getProperty(kMinValue, outMin);
140 }
144 bool getMax(T& outMax) const {
145 return getProperty(kMaxValue, outMax);
146 }
150 bool getMinIncrement(T& outMinIncrement) const {
151 return getProperty(kMinIncrement, outMinIncrement);
152 }
156 bool getMaxIncrement(T& outMaxIncrement) const {
157 return getProperty(kMaxIncrement, outMaxIncrement);
158 }
163 void setMin(T min) {
164 properties_[kMinValue] = min;
165 }
170 void setMax(T max) {
171 properties_[kMaxValue] = max;
172 }
178 void setRange(T min, T max) {
179 properties_[kMinValue] = min;
180 properties_[kMaxValue] = max;
181 }
186 void setMinIncrement(T minIncrement) {
187 properties_[kMinIncrement] = minIncrement;
188 }
193 void setMaxIncrement(T maxIncrement) {
194 properties_[kMaxIncrement] = maxIncrement;
195 }
201 void setIncrement(T minIncrement, T maxIncrement) {
202 properties_[kMinIncrement] = minIncrement;
203 properties_[kMaxIncrement] = maxIncrement;
204 }
205
210 bool patchValue(T value) const {
211 auto* patchedPiece = layout_.getMappedPiece<DataPieceValue<T>>(pieceIndex_);
212 return patchedPiece != nullptr && patchedPiece->set(value);
213 }
214
217 bool isAvailable() const override {
218 return layout_.getFixedData<T>(offset_, sizeof(T)) != nullptr;
219 }
220
225 void print(ostream& out, const string& indent) const override;
230 void printCompact(ostream& out, const string& indent) const override;
231
236 bool isSame(const DataPiece* rhs) const override;
237
241 void serialize(JsonWrapper& jsonWrapper, const JsonFormatProfileSpec& profile) override;
242
246 unique_ptr<DataPiece> clone() const override {
247 auto other = std::make_unique<DataPieceValue<T>>(getLabel());
248 other->tags_ = tags_;
249 other->required_ = required_;
250 other->properties_ = properties_;
251 other->defaultValue_ = defaultValue_;
252 return other;
253 }
254
255 protected:
256 bool copyFrom(const DataPiece* original) override {
257 const auto* source = reinterpret_cast<const DataPieceValue<T>*>(original);
258 T value;
259 bool retrieved = source->get(value);
260 set(value);
261 return retrieved;
262 }
263
264 private:
265 map<string, T> properties_;
266 T defaultValue_;
267};
268
282template <typename EnumType, typename StorageType>
283class DataPieceEnum : public DataPieceValue<StorageType> {
284 public:
286 explicit DataPieceEnum(const string& label) : DataPieceValue<StorageType>(label) {}
287
290 DataPieceEnum(const string& label, EnumType defaultValue)
291 : DataPieceValue<StorageType>(label, static_cast<StorageType>(defaultValue)) {}
292
296 EnumType get() const {
297 return static_cast<EnumType>(DataPieceValue<StorageType>::get());
298 }
299
304 bool get(EnumType& e) const {
305 StorageType v{};
307 e = static_cast<EnumType>(v);
308 return r;
309 }
310
314 bool set(const EnumType e) {
315 return DataPieceValue<StorageType>::set(static_cast<StorageType>(e));
316 }
317
320 EnumType getDefault() const {
321 return static_cast<EnumType>(DataPieceValue<StorageType>::getDefault());
322 }
323
327 bool getDefault(EnumType& outDefault) const {
328 StorageType v;
330 outDefault = static_cast<EnumType>(v);
331 return r;
332 }
333
336 void setDefault(const EnumType defaultValue) {
337 DataPieceValue<StorageType>::setDefault(static_cast<StorageType>(defaultValue));
338 }
339};
340
341} // namespace vrs
342
343#endif // DATA_PIECES_VALUE_H
vector< int8_t > & getFixedData()
Definition DataLayout.h:237
T * getMappedPiece(size_t pieceIndex) const
Get a typed piece by index in the mapped datalayout, exclusively.
Definition DataLayout.h:505
DataPieceValue specialization class to store enums more conveniently and safely.
Definition DataPieceValue.h:283
bool get(EnumType &e) const
Definition DataPieceValue.h:304
DataPieceEnum(const string &label, EnumType defaultValue)
Definition DataPieceValue.h:290
EnumType get() const
Definition DataPieceValue.h:296
DataPieceEnum(const string &label)
Definition DataPieceValue.h:286
EnumType getDefault() const
Definition DataPieceValue.h:320
void setDefault(const EnumType defaultValue)
Definition DataPieceValue.h:336
bool set(const EnumType e)
Definition DataPieceValue.h:314
bool getDefault(EnumType &outDefault) const
Definition DataPieceValue.h:327
Abstract class representing a piece of information part of a DataLayout.
Definition DataPieces.h:40
static const string kMinIncrement
Special property name for the minimum increment of the DataPiece.
Definition DataPieces.h:63
static const string kMaxValue
Special property name for the maximum value of the DataPiece.
Definition DataPieces.h:61
static const string kMaxIncrement
Special property name for the maximum increment of the DataPiece.
Definition DataPieces.h:65
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
DataPiece for a single value of type T. The value is stored in DataLayout's fixed size buffer.
Definition DataPieceValue.h:37
void setRange(T min, T max)
Definition DataPieceValue.h:178
void setMaxIncrement(T maxIncrement)
Definition DataPieceValue.h:193
bool get(T &outValue) const
Definition DataPieceValue.h:76
void print(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1240
bool isAvailable() const override
Definition DataPieceValue.h:217
bool getMin(T &outMin) const
Definition DataPieceValue.h:138
void serialize(JsonWrapper &jsonWrapper, const JsonFormatProfileSpec &profile) override
Definition DataLayout.cpp:1283
bool copyFrom(const DataPiece *original) override
Set or stage value from another piece known to be of the same type.
Definition DataPieceValue.h:256
size_t getVariableSize() const override
Definition DataPieceValue.h:59
bool set(const T &value)
Definition DataPieceValue.h:90
bool getProperty(const string &propertyName, T &outValue) const
Definition DataPieceValue.h:120
bool isSame(const DataPiece *rhs) const override
Definition DataLayout.cpp:1273
void setMinIncrement(T minIncrement)
Definition DataPieceValue.h:186
void printCompact(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1264
bool getMaxIncrement(T &outMaxIncrement) const
Definition DataPieceValue.h:156
T get() const
Definition DataPieceValue.h:69
void setMax(T max)
Definition DataPieceValue.h:170
DataPieceValue(string label, T defaultValue={})
Definition DataPieceValue.h:46
void setProperty(const string &propertyName, T value)
Definition DataPieceValue.h:131
void setIncrement(T minIncrement, T maxIncrement)
Definition DataPieceValue.h:201
const string & getElementTypeName() const override
Definition DataPieceValue.h:54
void setDefault(const T &defaultValue)
Definition DataPieceValue.h:107
bool patchValue(T value) const
Definition DataPieceValue.h:210
void setMin(T min)
Definition DataPieceValue.h:163
unique_ptr< DataPiece > clone() const override
Definition DataPieceValue.h:246
bool getMax(T &outMax) const
Definition DataPieceValue.h:144
bool getMinIncrement(T &outMinIncrement) const
Definition DataPieceValue.h:150
const T & getDefault() const
Definition DataPieceValue.h:101
void initToDefault() override
Initialize to default value.
Definition DataPieceValue.h:112
size_t collectVariableData(int8_t *, size_t) override
Definition DataPieceValue.h:64
Definition AsyncDiskFileChunk.hpp:49
DataPieceType
Specifier for a type of DataPiece.
Definition DataLayout.h:57
@ Value
Single value.
When printing out a DataLayout as json, this class allows to specify what should be included in the g...
Definition DataLayout.h:84