VRS
A file format for sensor data.
Loading...
Searching...
No Matches
DataPieces.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_H
20#define DATA_PIECES_H
21
22#include <cstring>
23
24#include <map>
25#include <ostream>
26
27#include "DataLayout.h"
28
29namespace vrs {
30
31using std::map;
32using std::ostream;
33using std::string;
34
40class DataPiece {
41 public:
44 struct MakerBundle;
45
46 protected:
51 DataPiece(const string& label, DataPieceType type, size_t size);
52
54 static const string kUnit;
56 static const string kDescription;
57
59 static const string kMinValue;
61 static const string kMaxValue;
63 static const string kMinIncrement;
65 static const string kMaxIncrement;
66
67 public:
68 virtual ~DataPiece();
71 const DataLayout& getDataLayout() const {
72 return layout_;
73 }
76 const string& getLabel() const {
77 return label_;
78 }
82 return pieceType_;
83 }
84
87 string getTypeName() const;
88
96 size_t getOffset() const {
97 return offset_;
98 }
101 bool hasFixedSize() const {
102 return fixedSize_ != DataLayout::kVariableSize;
103 }
106 size_t getFixedSize() const {
107 return fixedSize_;
108 }
113 bool getTag(const string& tagName, string& outTag) const;
117 void setTag(const string& tagName, const string& tag) {
118 tags_[tagName] = tag;
119 }
123 bool getUnit(string& outUnit) const {
124 return getTag(kUnit, outUnit);
125 }
128 void setUnit(const string& unit) {
129 tags_[kUnit] = unit;
130 }
131
135 bool getDescription(string& outDescription) const {
136 return getTag(kDescription, outDescription);
137 }
140 void setDescription(const string& description) {
141 tags_[kDescription] = description;
142 }
143
146 void setRequired(bool required = true) {
147 required_ = required;
148 }
152 bool isRequired() const {
153 return required_;
154 }
155
159 virtual size_t getVariableSize() const = 0;
164 virtual size_t collectVariableData(int8_t* data, size_t bufferSize) = 0;
168 virtual const string& getElementTypeName() const = 0;
172 virtual bool isAvailable() const = 0;
177 virtual void print(ostream& out, const string& indent = "") const = 0;
182 virtual void printCompact(ostream& out, const string& indent = "") const = 0;
186 virtual void serialize(JsonWrapper& jsonWrapper, const JsonFormatProfileSpec& profile);
192 virtual bool stageCurrentValue() {
193 return isAvailable();
194 }
196 virtual unique_ptr<DataPiece> clone() const = 0;
197
198 protected:
200 bool isMatch(const DataPiece& rhs) const;
202 virtual bool isSame(const DataPiece* rhs) const;
203 void setOffset(size_t offset) {
204 offset_ = offset;
205 }
207 virtual bool stageFrom(const DataPiece* original) = 0;
208
209 const string label_;
210 const DataPieceType pieceType_;
211 const size_t fixedSize_;
212 size_t offset_;
213 DataLayout& layout_;
214 map<string, string> tags_;
215 bool required_;
216
217 friend class DataLayout;
218};
219
221template <class T>
222const string& getTypeName();
223
224template <>
225inline const string& getTypeName<string>() {
226 static const string sName("string");
227 return sName;
228}
229
235#pragma pack(push, 1) // tells the compiler that the data might not be aligned
236template <class T>
238 T value;
239};
240#pragma pack(pop)
241
243template <class T>
244T readUnaligned(const void* ptr) {
245 return reinterpret_cast<const UnalignedValue<T>*>(ptr)->value;
246}
247
249template <class T>
250void writeUnaligned(void* ptr, const T& value) {
251 reinterpret_cast<UnalignedValue<T>*>(ptr)->value = value;
252}
253
254} // namespace vrs
255
256// These are required pretty much every single time we use DataLayout. Just include them all.
257#include "DataPieceTypes.h"
258
259#ifndef DATA_PIECES_ARRAY_H
260#include "DataPieceArray.h"
261#endif
262
263#ifndef DATA_PIECES_STRING_H
264#include "DataPieceString.h"
265#endif
266
267#ifndef DATA_PIECES_STRING_MAP_H
268#include "DataPieceStringMap.h"
269#endif
270
271#ifndef DATA_PIECES_VALUE_H
272#include "DataPieceValue.h"
273#endif
274
275#ifndef DATA_PIECES_VECTOR_H
276#include "DataPieceVector.h"
277#endif
278
279#endif // DATA_PIECES_H
The DataLayout class describes the data stored inside a DataLayoutContentBlock.
Definition DataLayout.h:191
static const size_t kVariableSize
Special value used for a DataPiece size, telling that that DataPiece has a variable size.
Definition DataLayout.h:206
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
void setRequired(bool required=true)
Definition DataPieces.h:146
bool getDescription(string &outDescription) const
Definition DataPieces.h:135
static const string kMaxValue
Special property name for the maximum value of the DataPiece.
Definition DataPieces.h:61
bool getTag(const string &tagName, string &outTag) const
Definition DataLayout.cpp:1093
bool isRequired() const
Definition DataPieces.h:152
void setDescription(const string &description)
Definition DataPieces.h:140
virtual bool isSame(const DataPiece *rhs) const
Match signature & properties (default value, min/max, etc).
Definition DataLayout.cpp:747
bool getUnit(string &outUnit) const
Definition DataPieces.h:123
static const string kMaxIncrement
Special property name for the maximum increment of the DataPiece.
Definition DataPieces.h:65
bool isMatch(const DataPiece &rhs) const
Match signature only.
Definition DataLayout.cpp:1102
virtual void printCompact(ostream &out, const string &indent="") const =0
virtual size_t collectVariableData(int8_t *data, size_t bufferSize)=0
virtual bool stageCurrentValue()
Definition DataPieces.h:192
virtual void serialize(JsonWrapper &jsonWrapper, const JsonFormatProfileSpec &profile)
Definition DataLayout.cpp:1126
bool hasFixedSize() const
Definition DataPieces.h:101
virtual bool isAvailable() const =0
virtual void print(ostream &out, const string &indent="") const =0
static const string kMinValue
Special property name for the minimum value of the DataPiece.
Definition DataPieces.h:59
string getTypeName() const
Definition DataLayout.cpp:1122
size_t getOffset() const
Definition DataPieces.h:96
DataPieceType getPieceType() const
Definition DataPieces.h:81
const string & getLabel() const
Definition DataPieces.h:76
const DataLayout & getDataLayout() const
Definition DataPieces.h:71
virtual bool stageFrom(const DataPiece *original)=0
Stage value from another piece known to be of the same type.
virtual unique_ptr< DataPiece > clone() const =0
Create a new DataPiece of the same type, with the same label.
static const string kDescription
Special tag name to specify a human readable description the DataPiece.
Definition DataPieces.h:56
void setUnit(const string &unit)
Definition DataPieces.h:128
static const string kUnit
Special tag name to specify a unit of the DataPiece.
Definition DataPieces.h:54
void setTag(const string &tagName, const string &tag)
Definition DataPieces.h:117
size_t getFixedSize() const
Definition DataPieces.h:106
virtual size_t getVariableSize() const =0
virtual const string & getElementTypeName() const =0
Definition AsyncDiskFileChunk.hpp:49
void writeUnaligned(void *ptr, const T &value)
Helper to make dereferencing a pointer to write an unaligned POD object safe.
Definition DataPieces.h:250
const string & getTypeName()
Get the name of the type <T>.
T readUnaligned(const void *ptr)
Helper to make dereferencing a pointer to read an unaligned POD object safe.
Definition DataPieces.h:244
DataPieceType
Specifier for a type of DataPiece.
Definition DataLayout.h:57
Definition DataLayout.cpp:1114
When printing out a DataLayout as json, this class allows to specify what should be included in the g...
Definition DataLayout.h:84
Template to represent some POD object without memory alignment.
Definition DataPieces.h:237