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#include <memory>
22#include <type_traits>
23#include <vector>
24
25#include <vrs/DataSlice.h>
26#include <vrs/VrsExport.h>
27
28namespace vrs {
29
30using std::is_pointer;
31using std::vector;
32
33class DataLayout;
34class WriteFileHandler;
35
43struct VRS_API DataLayoutChunk {
45 DataLayoutChunk() = default;
47 explicit DataLayoutChunk(DataLayout& dataLayout);
48
50 size_t size() const {
51 return layoutFixedSize_ + layoutVariableSize_;
52 }
54 void fillAndAdvanceBuffer(uint8_t*& buffer) const;
55
56 DataLayout* const dataLayout_{};
57 const size_t layoutFixedSize_{};
58 const size_t layoutVariableSize_{};
59};
60
72class VRS_API DataSourceChunk {
73 public:
75 DataSourceChunk(const DataSourceChunk& other) = default;
76 DataSourceChunk(DataSourceChunk&& other) noexcept = default;
77
79 DataSourceChunk() = default;
81 DataSourceChunk(const void* _data, size_t _size);
83 template <typename T>
84 /* implicit */ DataSourceChunk(const vector<T>& vectorT)
85 : data_{vectorT.data()}, size_{sizeof(T) * vectorT.size()} {}
86 virtual ~DataSourceChunk() = default;
87
88 DataSourceChunk& operator=(const DataSourceChunk& other) = default;
89 DataSourceChunk& operator=(DataSourceChunk&& other) noexcept = default;
90
92 template <
93 typename T,
94 // T must be trivially copyable.
95 std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0,
96 // T may not be a pointer.
97 typename = typename std::enable_if<!is_pointer<T>::value, T>::type>
98 /* implicit */ DataSourceChunk(const T& object) : data_{&object}, size_{sizeof(T)} {}
99
102 virtual void fillAndAdvanceBuffer(uint8_t*& buffer) const;
103
104 const void* data() const {
105 return data_;
106 }
107
109 size_t size() const {
110 return size_;
111 }
112
113 private:
114 const void* data_{};
115 size_t size_{0};
116};
117
120class VRS_API NonContiguousChunk final : public vrs::DataSourceChunk {
121 public:
128 NonContiguousChunk(const void* data, size_t blockSize, size_t numBlocks, size_t strideInBytes);
129
130 void fillAndAdvanceBuffer(uint8_t*& buffer) const final;
131
132 private:
133 const size_t blockSize_;
134 const size_t numBlocks_;
135 const size_t strideInBytes_;
136};
137
154class VRS_API DataSource {
155 public:
158 explicit DataSource(size_t size = 0) : size_{size} {}
159 virtual ~DataSource() = default;
161 explicit DataSource(const DataSourceChunk& chunk) : chunk1_{chunk}, size_{chunk.size()} {}
163 explicit DataSource(const DataSourceChunk& firstChunk, const DataSourceChunk& secondChunk)
164 : chunk1_{firstChunk}, chunk2_{secondChunk}, size_{firstChunk.size() + secondChunk.size()} {}
166 explicit DataSource(
167 const DataSourceChunk& firstChunk,
168 const DataSourceChunk& secondChunk,
169 const DataSourceChunk& thirdChunk)
170 : chunk1_{firstChunk}, chunk2_{secondChunk}, chunk3_{thirdChunk}, size_{getChunksSize()} {}
172 explicit DataSource(DataLayout& dataLayout)
173 : dataLayout1_{dataLayout}, size_{dataLayout1_.size()} {}
175 explicit DataSource(DataLayout& dataLayout, const DataSourceChunk& chunk)
176 : dataLayout1_{dataLayout}, chunk1_{chunk}, size_{dataLayout1_.size() + chunk1_.size()} {}
178 explicit DataSource(
179 DataLayout& dataLayout,
180 const DataSourceChunk& firstChunk,
181 const DataSourceChunk& secondChunk);
183 explicit DataSource(
184 DataLayout& dataLayout,
185 const DataSourceChunk& firstChunk,
186 const DataSourceChunk& secondChunk,
187 const DataSourceChunk& thirdChunk);
189 explicit DataSource(DataLayout& dataLayout1, DataLayout& dataLayout2);
191 explicit DataSource(
192 DataLayout& dataLayout1,
193 DataLayout& dataLayout2,
194 const DataSourceChunk& chunk);
196 explicit DataSource(
197 DataLayout& dataLayout1,
198 DataLayout& dataLayout2,
199 const DataSourceChunk& firstChunk,
200 const DataSourceChunk& secondChunk);
202 explicit DataSource(
203 DataLayout& dataLayout1,
204 DataLayout& dataLayout2,
205 const DataSourceChunk& firstChunk,
206 const DataSourceChunk& secondChunk,
207 const DataSourceChunk& thirdChunk);
208
209 DataSource(const DataSource&) = delete;
210 DataSource(DataSource&&) = delete;
211
212 DataSource& operator=(const DataSource&) = delete;
213 DataSource& operator=(DataSource&&) = delete;
214
218 size_t getDataSize() const {
219 return size_;
220 }
221
225 virtual void copyTo(uint8_t* buffer) const;
226
227 protected:
228 static DataSourceChunk kEmptyDataSourceChunk;
229
232 size_t getChunksSize();
233
234 const DataLayoutChunk dataLayout1_;
235 const DataLayoutChunk dataLayout2_;
236 const DataSourceChunk& chunk1_{kEmptyDataSourceChunk};
237 const DataSourceChunk& chunk2_{kEmptyDataSourceChunk};
238 const DataSourceChunk& chunk3_{kEmptyDataSourceChunk};
239 const size_t size_;
240};
241
251 public:
252 virtual ~DirectWriteRecordData() = default;
253
255 virtual size_t getDataSize() const = 0;
256
258 virtual int write(WriteFileHandler& file) const = 0;
259};
260
267class VRS_API BorrowedData {
268 public:
269 BorrowedData(const void* data, size_t size, std::shared_ptr<void> owner)
270 : segments_{{data, size}}, owner_{std::move(owner)}, size_{size} {}
271
272 // The slices are copied; only referenced memory is borrowed, owned by `owner` until written.
273 BorrowedData(const DataSlice* dataSlices, size_t dataSliceCount, std::shared_ptr<void> owner)
274 : owner_{std::move(owner)} {
275 segments_.reserve(dataSliceCount);
276 for (size_t i = 0; i < dataSliceCount; ++i) {
277 segments_.push_back(dataSlices[i]);
278 size_ += dataSlices[i].size;
279 }
280 }
281
282 const std::vector<DataSlice>& getSegments() const {
283 return segments_;
284 }
285
286 size_t getDataSize() const {
287 return size_;
288 }
289
290 private:
291 std::vector<DataSlice> segments_;
292 std::shared_ptr<void> owner_;
293 size_t size_{0};
294};
295
296} // namespace vrs
Class to hold borrowed data that is not copied into the record's buffer, like DirectWriteRecordData,...
Definition DataSource.h:267
The DataLayout class describes the data stored inside a DataLayoutContentBlock.
Definition DataLayout.h:211
Elementary part of a DataSource for a simple block of memory.
Definition DataSource.h:72
size_t size() const
For performance, do not make this method virtual.
Definition DataSource.h:109
DataSourceChunk(const T &object)
Constructor for a trivially copyable type T.
Definition DataSource.h:98
DataSourceChunk()=default
Empty DataSourceChunk.
DataSourceChunk(const vector< T > &vectorT)
Constructor for a vector<T> of objects of POD type T.
Definition DataSource.h:84
DataSourceChunk(const DataSourceChunk &other)=default
Not copyable as there are derived classes that aren't safe to copy from the base class.
A class referencing data to be captured in a record at creation.
Definition DataSource.h:154
size_t getDataSize() const
Definition DataSource.h:218
DataSource(const DataSourceChunk &firstChunk, const DataSourceChunk &secondChunk)
Constructor for two DataSourceChunk objects.
Definition DataSource.h:163
DataSource(const DataSourceChunk &firstChunk, const DataSourceChunk &secondChunk, const DataSourceChunk &thirdChunk)
Constructor for three DataSourceChunk objects.
Definition DataSource.h:166
DataSource(size_t size=0)
Definition DataSource.h:158
DataSource(const DataSourceChunk &chunk)
Constructor for a single DataSourceChunk.
Definition DataSource.h:161
DataSource(DataLayout &dataLayout, const DataSourceChunk &chunk)
Constructor for single DataLayout, single DataSourceChunk.
Definition DataSource.h:175
DataSource(DataLayout &dataLayout)
Constructor for a single DataLayout, no DataSourceChunk.
Definition DataSource.h:172
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:250
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:120
The WriteFileHandler interface adds write operations to the FileHandler interface.
Definition WriteFileHandler.h:43
Definition Compressor.cpp:130
Class referencing a DataLayout object, and abstracting the interactions for DataSource.
Definition DataSource.h:43
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:50
A non-owning view of a contiguous block of memory.
Definition DataSlice.h:24