VRS
A file format for sensor data.
Loading...
Searching...
No Matches
DataSource.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#include <cstddef>
20#include <cstdint>
21
22#include <type_traits>
23#include <vector>
24
25namespace vrs {
26
27using std::is_base_of;
28using std::is_pointer;
29using std::vector;
30
31class DataLayout;
32class WriteFileHandler;
33
43 DataLayoutChunk() = default;
45 explicit DataLayoutChunk(DataLayout& dataLayout);
46
48 size_t size() const {
49 return layoutFixedSize_ + layoutVariableSize_;
50 }
52 void fillAndAdvanceBuffer(uint8_t*& buffer) const;
53
54 DataLayout* const dataLayout_{};
55 const size_t layoutFixedSize_{};
56 const size_t layoutVariableSize_{};
57};
58
71 public:
73 DataSourceChunk(const DataSourceChunk& other) = delete;
74 const DataSourceChunk& operator=(const DataSourceChunk& other) = delete;
75
77 DataSourceChunk() : data_{}, size_{} {}
79 DataSourceChunk(const void* _data, size_t _size);
81 template <typename T>
82 // NOLINTNEXTLINE(hicpp-explicit-conversions)
83 DataSourceChunk(const vector<T>& vectorT)
84 : data_{vectorT.data()}, size_{sizeof(T) * vectorT.size()} {}
85 virtual ~DataSourceChunk() = default;
86
88 template <
89 typename T,
90 // T must be trivially copyable.
91 std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0,
92 // T may not be a pointer.
93 typename = typename std::enable_if<!is_pointer<T>::value, T>::type>
94 // NOLINTNEXTLINE(hicpp-explicit-conversions)
95 DataSourceChunk(const T& object) : data_{&object}, size_{sizeof(T)} {}
96
99 virtual void fillAndAdvanceBuffer(uint8_t*& buffer) const;
100
101 const void* data() const {
102 return data_;
103 }
104
106 size_t size() const {
107 return size_;
108 }
109
110 private:
111 const void* const data_;
112 const size_t size_;
113};
114
118 public:
125 NonContiguousChunk(const void* data, size_t blockSize, size_t numBlocks, size_t strideInBytes);
126
127 void fillAndAdvanceBuffer(uint8_t*& buffer) const final;
128
129 private:
130 const size_t blockSize_;
131 const size_t numBlocks_;
132 const size_t strideInBytes_;
133};
134
152 public:
155 explicit DataSource(size_t size = 0) : size_{size} {}
156 virtual ~DataSource() = default;
158 explicit DataSource(const DataSourceChunk& chunk) : chunk1_{chunk}, size_{chunk.size()} {}
160 explicit DataSource(const DataSourceChunk& firstChunk, const DataSourceChunk& secondChunk)
161 : chunk1_{firstChunk}, chunk2_{secondChunk}, size_{firstChunk.size() + secondChunk.size()} {}
163 explicit DataSource(
164 const DataSourceChunk& firstChunk,
165 const DataSourceChunk& secondChunk,
166 const DataSourceChunk& thirdChunk)
167 : chunk1_{firstChunk}, chunk2_{secondChunk}, chunk3_{thirdChunk}, size_{getChunksSize()} {}
169 explicit DataSource(DataLayout& dataLayout)
170 : dataLayout1_{dataLayout}, size_{dataLayout1_.size()} {}
172 explicit DataSource(DataLayout& dataLayout, const DataSourceChunk& chunk)
173 : dataLayout1_{dataLayout}, chunk1_{chunk}, size_{dataLayout1_.size() + chunk1_.size()} {}
175 explicit DataSource(
176 DataLayout& dataLayout,
177 const DataSourceChunk& firstChunk,
178 const DataSourceChunk& secondChunk);
180 explicit DataSource(
181 DataLayout& dataLayout,
182 const DataSourceChunk& firstChunk,
183 const DataSourceChunk& secondChunk,
184 const DataSourceChunk& thirdChunk);
186 explicit DataSource(DataLayout& dataLayout1, DataLayout& dataLayout2);
188 explicit DataSource(
189 DataLayout& dataLayout1,
190 DataLayout& dataLayout2,
191 const DataSourceChunk& chunk);
193 explicit DataSource(
194 DataLayout& dataLayout1,
195 DataLayout& dataLayout2,
196 const DataSourceChunk& firstChunk,
197 const DataSourceChunk& secondChunk);
199 explicit DataSource(
200 DataLayout& dataLayout1,
201 DataLayout& dataLayout2,
202 const DataSourceChunk& firstChunk,
203 const DataSourceChunk& secondChunk,
204 const DataSourceChunk& thirdChunk);
205
206 DataSource(const DataSource&) = delete;
207 DataSource& operator=(const DataSource&) = delete;
208
212 size_t getDataSize() const {
213 return size_;
214 }
215
219 virtual void copyTo(uint8_t* buffer) const;
220
221 protected:
222 static DataSourceChunk kEmptyDataSourceChunk;
223
226 size_t getChunksSize();
227
228 const DataLayoutChunk dataLayout1_;
229 const DataLayoutChunk dataLayout2_;
230 const DataSourceChunk& chunk1_{kEmptyDataSourceChunk};
231 const DataSourceChunk& chunk2_{kEmptyDataSourceChunk};
232 const DataSourceChunk& chunk3_{kEmptyDataSourceChunk};
233 const size_t size_;
234};
235
245 public:
246 virtual ~DirectWriteRecordData() = default;
247
249 virtual size_t getDataSize() const = 0;
250
252 virtual int write(WriteFileHandler& file) const = 0;
253};
254
255} // namespace vrs
The DataLayout class describes the data stored inside a DataLayoutContentBlock.
Definition DataLayout.h:191
Elementary part of a DataSource for a simple block of memory.
Definition DataSource.h:70
DataSourceChunk(const DataSourceChunk &other)=delete
Not copyable as there are derived classes that aren't safe to copy from the base class.
size_t size() const
For performance, do not make this method virtual.
Definition DataSource.h:106
DataSourceChunk(const T &object)
Constructor for a trivially copyable type T.
Definition DataSource.h:95
DataSourceChunk(const vector< T > &vectorT)
Constructor for a vector<T> of objects of POD type T.
Definition DataSource.h:83
DataSourceChunk()
Empty DataSourceChunk.
Definition DataSource.h:77
virtual void fillAndAdvanceBuffer(uint8_t *&buffer) const
Definition DataSource.cpp:48
A class referencing data to be captured in a record at creation.
Definition DataSource.h:151
size_t getDataSize() const
Definition DataSource.h:212
DataSource(const DataSourceChunk &firstChunk, const DataSourceChunk &secondChunk)
Constructor for two DataSourceChunk objects.
Definition DataSource.h:160
DataSource(const DataSourceChunk &firstChunk, const DataSourceChunk &secondChunk, const DataSourceChunk &thirdChunk)
Constructor for three DataSourceChunk objects.
Definition DataSource.h:163
size_t getChunksSize()
Definition DataSource.cpp:147
DataSource(size_t size=0)
Definition DataSource.h:155
DataSource(const DataSourceChunk &chunk)
Constructor for a single DataSourceChunk.
Definition DataSource.h:158
virtual void copyTo(uint8_t *buffer) const
Definition DataSource.cpp:133
DataSource(DataLayout &dataLayout, const DataSourceChunk &chunk)
Constructor for single DataLayout, single DataSourceChunk.
Definition DataSource.h:172
DataSource(DataLayout &dataLayout)
Constructor for a single DataLayout, no DataSourceChunk.
Definition DataSource.h:169
Class to hold data that is written directly in the file at the end of a record. Record data held by D...
Definition DataSource.h:244
virtual size_t getDataSize() const =0
Get the total amount of data that will be written to disk. This value may not change.
virtual int write(WriteFileHandler &file) const =0
Class to represent a data chunk composed of multiple smaller chunks that each have fixed offsets from...
Definition DataSource.h:117
void fillAndAdvanceBuffer(uint8_t *&buffer) const final
Definition DataSource.cpp:67
The WriteFileHandler interface adds write operations to the FileHandler interface.
Definition WriteFileHandler.h:45
Definition AsyncDiskFileChunk.hpp:49
Class referencing a DataLayout object, and abstracting the interactions for DataSource.
Definition DataSource.h:41
DataLayoutChunk()=default
Default constructor to no DataLayout.
size_t size() const
Get the data size required to hold all of the DataLayout's data.
Definition DataSource.h:48
void fillAndAdvanceBuffer(uint8_t *&buffer) const
Copy the data of the DataLayout (if any), and move the given pointer accordingly.
Definition DataSource.cpp:32