27#include "ForwardDefinitions.h"
37class AutoDataLayoutEnd;
46class DataPieceStringMap;
213 void setOffset(
size_t offset) {
214 offset_ =
static_cast<uint32_t
>(offset);
216 size_t getOffset()
const {
217 return static_cast<uint32_t
>(offset_);
219 void setLength(
size_t length) {
220 length_ =
static_cast<uint32_t
>(length);
222 size_t getLength()
const {
223 return static_cast<uint32_t
>(length_);
277 void getRawData(vector<int8_t>& outRawData)
const;
330 void printLayout(ostream& out,
const string& indent =
"")
const;
361 static unique_ptr<DataLayout>
makeFromJson(
const string& json);
405 const std::function<
void(
const DataPiece*)>&,
449 return reinterpret_cast<T*
>(
fixedData_.data() + offset);
473 if (indexEntry.getOffset() + indexEntry.getLength() <=
varData_.size()) {
474 outCount = indexEntry.getLength() /
sizeof(T);
475 return reinterpret_cast<T*
>(
varData_.data() + indexEntry.getOffset());
493 static bool mapPieces(
494 const vector<DataPiece*>& searchPieces,
495 const vector<DataPiece*>& givenPieces);
591 vector<unique_ptr<DataPiece>> manualPieces;
592 bool layoutInProgress_;
629 static void dataLayoutStructEnd(
const string& structName);
632#define DATA_LAYOUT_STRUCT(DATA_LAYOUT_STRUCT_TYPE) \
633 explicit DATA_LAYOUT_STRUCT_TYPE(const std::string& _structName_) \
634 : DataLayoutStruct(_structName_) { \
635 dataLayoutStructEnd(_structName_); \
638#define DATA_LAYOUT_STRUCT_WITH_INIT(DATA_LAYOUT_STRUCT_TYPE) \
639 explicit DATA_LAYOUT_STRUCT_TYPE(const std::string& _structName_) \
640 : DataLayoutStruct(_structName_) { \
641 dataLayoutStructEnd(_structName_); \
673template <
typename T,
size_t Size>
676 std::array<T, Size> array{createArrayHelper<T>(std::make_index_sequence<Size>())};
678 T& operator[](
const size_t index) {
682 constexpr const T& operator[](
const size_t index)
const {
686 constexpr std::size_t size()
const noexcept {
690 template <
typename S,
size_t... Indices>
691 static constexpr auto createArrayHelper(std::index_sequence<Indices...>) {
692 return std::array<S,
sizeof...(Indices)>{S{std::to_string(Indices)}...};
699template <
class OptionalFields>
703 : std::unique_ptr<OptionalFields>(
704 allocateFields ? std::make_unique<OptionalFields>() :
nullptr) {}
For use within an AutoDataLayout class, to end the AutoDataLayout's construction.
Definition DataLayout.h:557
Specialized DataLayout class to declare a DataLayout in struct format.
Definition DataLayout.h:551
Specification of a VRS record content block.
Definition RecordFormat.h:474
Describes where the data of a variable size DataPiece is in the varData_ buffer.
Definition DataLayout.h:211
The DataLayout class describes the data stored inside a DataLayoutContentBlock.
Definition DataLayout.h:191
vector< DataPiece * > fixedSizePieces_
Ordered fixed-size DataPieces.
Definition DataLayout.h:510
T * getFixedData(size_t offset, size_t size)
Definition DataLayout.h:444
static unique_ptr< DataLayout > makeFromJson(const string &json)
Definition DataLayout.cpp:310
void initLayout()
Definition DataLayout.cpp:226
bool hasAllRequiredPieces() const
Definition DataLayout.h:319
const DataPieceValue< T > * findDataPieceValue(const string &label) const
Definition DataLayout.cpp:523
size_t getVarDataSizeFromIndex() const
Definition DataLayout.cpp:297
size_t fixedDataSizeNeeded_
Byte count for all the fixed size pieces + var size index.
Definition DataLayout.h:516
static const size_t kVariableSize
Special value used for a DataPiece size, telling that that DataPiece has a variable size.
Definition DataLayout.h:206
void forEachDataPiece(const std::function< void(const DataPiece *)> &, DataPieceType type=DataPieceType::Undefined) const
void requireAllPieces()
Mark all the fields of the layout as required.
Definition DataLayout.cpp:134
void printLayoutCompact(ostream &out, const string &indent="") const
Definition DataLayout.cpp:161
const DataPieceArray< T > * findDataPieceArray(const string &label, size_t arraySize) const
Definition DataLayout.cpp:541
T * getVarData(size_t varPieceIndex, size_t &outCount)
Definition DataLayout.h:467
void serialize(JsonWrapper &rj, const JsonFormatProfileSpec &profile) const
Definition DataLayout.cpp:188
size_t getAvailableFixedDataPiecesCount() const
Definition DataLayout.cpp:727
vector< int8_t > & getVarData()
Definition DataLayout.h:242
const IndexEntry * getVarSizeIndex() const
Definition DataLayout.cpp:657
size_t getAvailableVarDataPiecesCount() const
Definition DataLayout.cpp:737
bool copyClonedDataPieceValues(const DataLayout &originalLayout)
Definition DataLayout.cpp:267
ContentBlock getContentBlock() const
Definition DataLayout.cpp:220
vector< DataPiece * > varSizePieces_
Ordered variable-size DataPieces.
Definition DataLayout.h:512
bool isSame(const DataLayout &otherLayout) const
Definition DataLayout.cpp:314
bool hasAllRequiredPieces_
Tells all the required pieces have been mapped successfully.
Definition DataLayout.h:520
string getListOfPiecesSpec() const
Get a text list of fields, types & names, one per line. Useful for tests.
Definition DataLayout.cpp:208
void stageCurrentValues()
Definition DataLayout.cpp:260
bool isMapped() const
Definition DataLayout.h:311
size_t getFixedDataSizeNeeded() const
Definition DataLayout.h:247
void collectVariableDataAndUpdateIndex()
Definition DataLayout.cpp:62
bool isVarDataIndexValid() const
Definition DataLayout.cpp:673
static const size_t kNotFound
Special OffsetAndLength offset value marking that a piece of data isn't available.
Definition DataLayout.h:204
vector< int8_t > & getFixedData()
Definition DataLayout.h:237
const DataPieceString * findDataPieceString(const string &label) const
Definition DataLayout.cpp:605
const DataPieceVector< T > * findDataPieceVector(const string &label) const
Definition DataLayout.cpp:561
size_t getVarDataSizeNeeded() const
Definition DataLayout.cpp:54
bool mapLayout(DataLayout &targetLayout)
Definition DataLayout.cpp:126
const DataPieceStringMap< T > * findDataPieceStringMap(const string &label) const
Definition DataLayout.cpp:583
void printLayout(ostream &out, const string &indent="") const
Definition DataLayout.cpp:143
void getRawData(vector< int8_t > &outRawData) const
Definition DataLayout.cpp:246
size_t getDeclaredVarDataPiecesCount() const
Definition DataLayout.h:423
size_t getDeclaredFixedDataPiecesCount() const
Definition DataLayout.h:418
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:514
DataLayout * mappedDataLayout_
DataLayout this layout has been mapped to, if any.
Definition DataLayout.h:522
string asJson(JsonFormatProfile profile) const
Definition DataLayout.cpp:175
vector< int8_t > varData_
Buffer holding variable-size pieces, after they've been collected, or read from disk.
Definition DataLayout.h:518
Fixed size array of POD values.
Definition DataPieceArray.h:39
Abstract class representing a piece of information part of a DataLayout.
Definition DataPieces.h:40
DataPiece for variable length string.
Definition DataPieceString.h:36
DataPiece map container, with string keys and values of type T.
Definition DataPieceStringMap.h:37
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:526
Specialized DataLayout for programmatic DataLayout generation.
Definition DataLayout.h:566
void endLayout()
End the construction of the DataLayout. Do not call add() after calling this method.
Definition DataLayout.cpp:1848
ManualDataLayout()
For manual construction using "add()": don't forget to call endLayout() when you're done.
Definition DataLayout.cpp:1778
DataPiece * add(unique_ptr< DataPiece > dataPiece)
Definition DataLayout.cpp:1840
Helper function to allocate optional fields only when it is enabled.
Definition DataLayout.h:700
Helper class to manage the registration of DataPiece objects within a single DataLayout.
Definition DataLayout.cpp:345
Definition AsyncDiskFileChunk.hpp:49
@ Undefined
when not set explicitly
JsonFormatProfile
Enum for a DataLayout printout json formatting profile.
Definition DataLayout.h:69
@ 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:57
@ String
Variable size array of char, null terminated.
@ Vector
Variable size array of T.
@ StringMap
Map with string keys, and T values.
@ Undefined
Undefined type.
Helper class to include DataLayout structs containing a sliced array of DataPieceXXX and DataLayoutSt...
Definition DataLayout.h:674
Helper class to include DataLayout structs containing a set of DataPieceXXX and DataLayoutStruct whil...
Definition DataLayout.h:627