27#include <vrs/ForwardDefinitions.h>
28#include <vrs/VrsExport.h>
38class AutoDataLayoutEnd;
47class DataPieceStringMap;
52struct DataPieceFactory;
87 bool publicNames =
false;
88 bool prettyJson =
false;
92 bool shortType =
false;
96 bool properties =
true;
234 void setOffset(
size_t offset) {
235 offset_ =
static_cast<uint32_t
>(offset);
237 size_t getOffset()
const {
238 return static_cast<uint32_t
>(offset_);
240 void setLength(
size_t length) {
241 length_ =
static_cast<uint32_t
>(length);
243 size_t getLength()
const {
244 return static_cast<uint32_t
>(length_);
269 return fixedDataSizeNeeded_;
277 void initDataPiecesToDefaultValue();
287 size_t getVarDataSizeFromIndex()
const;
292 size_t getVarDataSizeNeeded()
const;
296 void collectVariableDataAndUpdateIndex();
301 void collectVariableDataAndUpdateIndex(
void* destination);
305 void getRawData(vector<int8_t>& outRawData)
const;
311 void stageCurrentValues();
317 bool copyClonedDataPieceValues(
const DataLayout& originalLayout);
330 size_t copyDataPieceValuesFromMappedLayout(
const DataLayout& mappedLayout);
353 return mappedDataLayout_ !=
nullptr;
361 return mappedDataLayout_ ==
nullptr || hasAllRequiredPieces_;
364 void requireAllPieces();
371 void printLayout(ostream& out,
const string& indent =
"")
const;
375 void printLayoutCompact(ostream& out,
const string& indent =
"")
const;
389 string getListOfPiecesSpec()
const;
396 bool isSame(
const DataLayout& otherLayout)
const;
402 static unique_ptr<DataLayout> makeFromJson(
const string& json);
417 const DataPieceArray<T>* findDataPieceArray(
const string& label,
size_t arraySize)
const;
446 const std::function<
void(
const DataPiece*)>&,
456 bool isVarDataIndexValid()
const;
460 return fixedSizePieces_.size();
465 return varSizePieces_.size();
471 size_t getAvailableFixedDataPiecesCount()
const;
476 size_t getAvailableVarDataPiecesCount()
const;
486 if (mappedDataLayout_ !=
nullptr) {
487 return mappedDataLayout_->getFixedData<T>(offset, size);
489 if (offset != kNotFound && offset + size <= fixedData_.size()) {
490 return reinterpret_cast<T*
>(fixedData_.data() + offset);
497 const IndexEntry* getVarSizeIndex()
const;
501 IndexEntry* getVarSizeIndex();
509 if (mappedDataLayout_ !=
nullptr) {
510 return mappedDataLayout_->getVarData<T>(varPieceIndex, outCount);
512 if (varPieceIndex < varSizePieces_.size()) {
513 const IndexEntry& indexEntry = getVarSizeIndex()[varPieceIndex];
514 if (indexEntry.getOffset() + indexEntry.getLength() <= varData_.size()) {
515 outCount = indexEntry.getLength() /
sizeof(T);
516 return reinterpret_cast<T*
>(varData_.data() + indexEntry.getOffset());
523 DataPiece* getPieceByIndex(
size_t pieceIndex);
527 return mappedDataLayout_ !=
nullptr
528 ?
static_cast<T*
>(mappedDataLayout_->getPieceByIndex(pieceIndex))
543 static DataPiece* findMatch(
DataPiece* piece,
const vector<DataPiece*>& pieces,
size_t& start);
544 static bool mapPieces(
545 const vector<DataPiece*>& searchPieces,
546 const vector<DataPiece*>& givenPieces);
547 static size_t copyMappedValues(
548 const vector<DataPiece*>& pieces,
549 const vector<DataPiece*>& mappedPieces);
570 size_t fixedDataSizeNeeded_{};
574 bool hasAllRequiredPieces_{
true};
639 DataPiece* add(unique_ptr<DataPiece> dataPiece);
645 vector<unique_ptr<DataPiece>> manualPieces;
646 bool layoutInProgress_;
683 static void dataLayoutStructEnd(
const string& structName);
686#define DATA_LAYOUT_STRUCT(DATA_LAYOUT_STRUCT_TYPE) \
687 explicit DATA_LAYOUT_STRUCT_TYPE(const std::string& _structName_) \
688 : DataLayoutStruct(_structName_) { \
689 dataLayoutStructEnd(_structName_); \
692#define DATA_LAYOUT_STRUCT_WITH_INIT(DATA_LAYOUT_STRUCT_TYPE) \
693 explicit DATA_LAYOUT_STRUCT_TYPE(const std::string& _structName_) \
694 : DataLayoutStruct(_structName_) { \
695 dataLayoutStructEnd(_structName_); \
727template <
typename T,
size_t Size>
730 std::array<T, Size> array{createArrayHelper<T>(std::make_index_sequence<Size>())};
732 T& operator[](
const size_t index) {
736 constexpr const T& operator[](
const size_t index)
const {
740 constexpr std::size_t size()
const noexcept {
744 template <
typename S,
size_t... Indices>
745 static constexpr auto createArrayHelper(std::index_sequence<Indices...>) {
746 return std::array<S,
sizeof...(Indices)>{S{std::to_string(Indices)}...};
753template <
class OptionalFields>
757 : std::unique_ptr<OptionalFields>(
758 allocateFields ? std::make_unique<OptionalFields>() :
nullptr) {}
For use within an AutoDataLayout class, to end the AutoDataLayout's construction.
Definition DataLayout.h:611
Specialized DataLayout class to declare a DataLayout in struct format.
Definition DataLayout.h:605
Specification of a VRS record content block.
Definition RecordFormat.h:512
Describes where the data of a variable size DataPiece is in the varData_ buffer.
Definition DataLayout.h:232
The DataLayout class describes the data stored inside a DataLayoutContentBlock.
Definition DataLayout.h:211
vector< DataPiece * > fixedSizePieces_
Ordered fixed-size DataPieces.
Definition DataLayout.h:564
T * getFixedData(size_t offset, size_t size)
Definition DataLayout.h:485
bool hasAllRequiredPieces() const
Definition DataLayout.h:360
static const size_t kVariableSize
Special value used for a DataPiece size, telling that that DataPiece has a variable size.
Definition DataLayout.h:227
void forEachDataPiece(const std::function< void(const DataPiece *)> &, DataPieceType type=DataPieceType::Undefined) const
T * getVarData(size_t varPieceIndex, size_t &outCount)
Definition DataLayout.h:508
vector< int8_t > & getVarData()
Definition DataLayout.h:263
vector< DataPiece * > varSizePieces_
Ordered variable-size DataPieces.
Definition DataLayout.h:566
bool isMapped() const
Definition DataLayout.h:352
size_t getFixedDataSizeNeeded() const
Definition DataLayout.h:268
static const size_t kNotFound
Special OffsetAndLength offset value marking that a piece of data isn't available.
Definition DataLayout.h:225
vector< int8_t > & getFixedData()
Definition DataLayout.h:258
T * getMappedPiece(size_t pieceIndex) const
Get a typed piece by index in the mapped datalayout, exclusively.
Definition DataLayout.h:526
size_t getDeclaredVarDataPiecesCount() const
Definition DataLayout.h:464
size_t getDeclaredFixedDataPiecesCount() const
Definition DataLayout.h:459
void forEachDataPiece(const std::function< void(DataPiece *)> &, DataPieceType type=DataPieceType::Undefined)
Same as above, but as a non-const version.
vector< int8_t > fixedData_
Buffer to hold fixed-size pieces, and the index of var size pieces (if any).
Definition DataLayout.h:568
vector< int8_t > varData_
Buffer holding variable-size pieces, after they've been collected, or read from disk.
Definition DataLayout.h:572
Fixed size array of POD values.
Definition DataPieceArray.h:39
Abstract class representing a piece of information part of a DataLayout.
Definition DataPieces.h:42
DataPiece for variable length string.
Definition DataPieceString.h:38
DataPiece map container, with string keys and values of type T.
Definition DataPieceStringMap.h:36
DataPiece for a single value of type T. The value is stored in DataLayout's fixed size buffer.
Definition DataPieceValue.h:37
Vector of type T and variable size.
Definition DataPieceVector.h:37
When you just need a placeholder for a DataLayout.
Definition DataLayout.h:580
Specialized DataLayout for programmatic DataLayout generation.
Definition DataLayout.h:620
Helper function to allocate optional fields only when it is enabled.
Definition DataLayout.h:754
Helper class to manage the registration of DataPiece objects within a single DataLayout.
Definition DataLayout.cpp:408
Definition Compressor.cpp:113
@ Undefined
when not set explicitly
JsonFormatProfile
Enum for a DataLayout printout json formatting profile.
Definition DataLayout.h:71
@ ExternalCompact
for external tools (VRStools in particular), but compact.
@ VrsFormat
for internal VRS usage. (default)
@ Public
for public use cases, avoiding VRS internal names
@ ExternalPretty
for external tools (VRStools in particular), formatted for readability.
DataPieceType
Specifier for a type of DataPiece.
Definition DataLayout.h:59
@ String
Variable size array of char, null terminated.
@ Vector
Variable size array of T.
@ StringMap
Map with string keys, and T values.
Helper class to include DataLayout structs containing a sliced array of DataPieceXXX and DataLayoutSt...
Definition DataLayout.h:728
Helper class to include DataLayout structs containing a set of DataPieceXXX and DataLayoutStruct whil...
Definition DataLayout.h:681