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
103 void setDefault(const T& defaultValue) {
104 defaultValue_ = defaultValue;
105 }
106
109 inline const T& getDefault() const {
110 return defaultValue_;
111 }
112
114 void initToDefault() override {
115 set(getDefault());
116 }
117
122 bool getProperty(const string& propertyName, T& outValue) const {
123 auto iter = properties_.find(propertyName);
124 if (iter != properties_.end()) {
125 outValue = iter->second;
126 return true;
127 }
128 return false;
129 }
133 void setProperty(const string& propertyName, T value) {
134 properties_[propertyName] = value;
135 }
136
140 bool getMin(T& outMin) const {
141 return getProperty(kMinValue, outMin);
142 }
146 bool getMax(T& outMax) const {
147 return getProperty(kMaxValue, outMax);
148 }
152 bool getMinIncrement(T& outMinIncrement) const {
153 return getProperty(kMinIncrement, outMinIncrement);
154 }
158 bool getMaxIncrement(T& outMaxIncrement) const {
159 return getProperty(kMaxIncrement, outMaxIncrement);
160 }
165 void setMin(T min) {
166 properties_[kMinValue] = min;
167 }
172 void setMax(T max) {
173 properties_[kMaxValue] = max;
174 }
180 void setRange(T min, T max) {
181 properties_[kMinValue] = min;
182 properties_[kMaxValue] = max;
183 }
188 void setMinIncrement(T minIncrement) {
189 properties_[kMinIncrement] = minIncrement;
190 }
195 void setMaxIncrement(T maxIncrement) {
196 properties_[kMaxIncrement] = maxIncrement;
197 }
203 void setIncrement(T minIncrement, T maxIncrement) {
204 properties_[kMinIncrement] = minIncrement;
205 properties_[kMaxIncrement] = maxIncrement;
206 }
207
212 bool patchValue(T value) const {
213 auto* patchedPiece = layout_.getMappedPiece<DataPieceValue<T>>(pieceIndex_);
214 return patchedPiece != nullptr && patchedPiece->set(value);
215 }
216
219 bool isAvailable() const override {
220 return layout_.getFixedData<T>(offset_, sizeof(T)) != nullptr;
221 }
222
227 void print(ostream& out, const string& indent) const override;
232 void printCompact(ostream& out, const string& indent) const override;
233
238 bool isSame(const DataPiece* rhs) const override;
239
243 void serialize(JsonWrapper& jsonWrapper, const JsonFormatProfileSpec& profile) override;
244
248 unique_ptr<DataPiece> clone() const override {
249 auto other = std::make_unique<DataPieceValue<T>>(getLabel());
250 other->tags_ = tags_;
251 other->required_ = required_;
252 other->properties_ = properties_;
253 other->defaultValue_ = defaultValue_;
254 return other;
255 }
256
257 protected:
258 bool copyFrom(const DataPiece* original) override {
259 const auto* source = reinterpret_cast<const DataPieceValue<T>*>(original);
260 T value;
261 bool retrieved = source->get(value);
262 set(value);
263 return retrieved;
264 }
265
266 private:
267 map<string, T> properties_;
268 T defaultValue_;
269};
270
284template <typename EnumType, typename StorageType>
285class DataPieceEnum : public DataPieceValue<StorageType> {
286 public:
288 explicit DataPieceEnum(const string& label) : DataPieceValue<StorageType>(label) {}
289
292 DataPieceEnum(const string& label, EnumType defaultValue)
293 : DataPieceValue<StorageType>(label, static_cast<StorageType>(defaultValue)) {}
294
298 EnumType get() const {
299 return static_cast<EnumType>(DataPieceValue<StorageType>::get());
300 }
301
306 bool get(EnumType& e) const {
307 StorageType v{};
309 e = static_cast<EnumType>(v);
310 return r;
311 }
312
316 bool set(const EnumType e) {
317 return DataPieceValue<StorageType>::set(static_cast<StorageType>(e));
318 }
319
323 void setDefault(const EnumType defaultValue) {
324 DataPieceValue<StorageType>::setDefault(static_cast<StorageType>(defaultValue));
325 }
326
329 EnumType getDefault() const {
330 return static_cast<EnumType>(DataPieceValue<StorageType>::getDefault());
331 }
332
336 bool getDefault(EnumType& outDefault) const {
337 StorageType v;
339 outDefault = static_cast<EnumType>(v);
340 return r;
341 }
342};
343
344} // namespace vrs
345
346#endif // DATA_PIECES_VALUE_H
vector< int8_t > & getFixedData()
Definition DataLayout.h:256
T * getMappedPiece(size_t pieceIndex) const
Get a typed piece by index in the mapped datalayout, exclusively.
Definition DataLayout.h:524
DataPieceValue specialization class to store enums more conveniently and safely.
Definition DataPieceValue.h:285
bool get(EnumType &e) const
Definition DataPieceValue.h:306
DataPieceEnum(const string &label, EnumType defaultValue)
Definition DataPieceValue.h:292
EnumType get() const
Definition DataPieceValue.h:298
DataPieceEnum(const string &label)
Definition DataPieceValue.h:288
EnumType getDefault() const
Definition DataPieceValue.h:329
void setDefault(const EnumType defaultValue)
Definition DataPieceValue.h:323
bool set(const EnumType e)
Definition DataPieceValue.h:316
bool getDefault(EnumType &outDefault) const
Definition DataPieceValue.h:336
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:180
void setMaxIncrement(T maxIncrement)
Definition DataPieceValue.h:195
bool get(T &outValue) const
Definition DataPieceValue.h:76
void print(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1229
bool isAvailable() const override
Definition DataPieceValue.h:219
bool getMin(T &outMin) const
Definition DataPieceValue.h:140
void serialize(JsonWrapper &jsonWrapper, const JsonFormatProfileSpec &profile) override
Definition DataLayout.cpp:1272
bool copyFrom(const DataPiece *original) override
Set or stage value from another piece known to be of the same type.
Definition DataPieceValue.h:258
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:122
bool isSame(const DataPiece *rhs) const override
Definition DataLayout.cpp:1262
void setMinIncrement(T minIncrement)
Definition DataPieceValue.h:188
void printCompact(ostream &out, const string &indent) const override
Definition DataLayout.cpp:1253
bool getMaxIncrement(T &outMaxIncrement) const
Definition DataPieceValue.h:158
T get() const
Definition DataPieceValue.h:69
void setMax(T max)
Definition DataPieceValue.h:172
DataPieceValue(string label, T defaultValue={})
Definition DataPieceValue.h:46
void setProperty(const string &propertyName, T value)
Definition DataPieceValue.h:133
void setIncrement(T minIncrement, T maxIncrement)
Definition DataPieceValue.h:203
const string & getElementTypeName() const override
Definition DataPieceValue.h:54
void setDefault(const T &defaultValue)
Definition DataPieceValue.h:103
bool patchValue(T value) const
Definition DataPieceValue.h:212
void setMin(T min)
Definition DataPieceValue.h:165
unique_ptr< DataPiece > clone() const override
Definition DataPieceValue.h:248
bool getMax(T &outMax) const
Definition DataPieceValue.h:146
bool getMinIncrement(T &outMinIncrement) const
Definition DataPieceValue.h:152
const T & getDefault() const
Definition DataPieceValue.h:109
void initToDefault() override
Initialize to default value.
Definition DataPieceValue.h:114
size_t collectVariableData(int8_t *, size_t) override
Definition DataPieceValue.h:64
Definition Compressor.cpp:113
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