17#ifndef FLATBUFFERS_FLATBUFFER_BUILDER_H_
18#define FLATBUFFERS_FLATBUFFER_BUILDER_H_
23#include <initializer_list>
46 const voffset_t fixed_fields =
47 2 *
sizeof(voffset_t);
48 return fixed_fields + field_id *
sizeof(voffset_t);
51template<
typename T,
typename Alloc = std::allocator<T>>
52const T *
data(
const std::vector<T, Alloc> &v) {
56 return v.empty() ?
reinterpret_cast<const T *
>(&t) : &v.front();
58template<
typename T,
typename Alloc = std::allocator<T>>
59T *
data(std::vector<T, Alloc> &v) {
63 return v.empty() ?
reinterpret_cast<T *
>(&t) : &v.front();
80 typename std::conditional<Is64Aware, uoffset64_t, uoffset_t>::type
SizeT;
95 bool own_allocator =
false,
96 size_t buffer_minalign = AlignOf<largest_scalar_t>())
97 :
buf_(initial_size,
allocator, own_allocator, buffer_minalign,
98 static_cast<
SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE
99 : FLATBUFFERS_MAX_BUFFER_SIZE)),
114 :
buf_(1024,
nullptr,
false, AlignOf<largest_scalar_t>(),
115 static_cast<SizeT>(Is64Aware ? FLATBUFFERS_MAX_64_BUFFER_SIZE
116 : FLATBUFFERS_MAX_BUFFER_SIZE)),
183 template<
bool is_64 = Is64Aware>
196 template<
bool is_64 = Is64Aware>
200 return static_cast<uoffset_t
>(
GetSize());
265 void Finished()
const {
287 void Pad(
size_t num_bytes) {
buf_.
fill(num_bytes); }
289 void TrackMinAlign(
size_t elem_size) {
293 void Align(
size_t elem_size) {
294 TrackMinAlign(elem_size);
298 void PushFlatBuffer(
const uint8_t *bytes,
size_t size) {
299 PushBytes(bytes,
size);
303 void PushBytes(
const uint8_t *bytes,
size_t size) {
buf_.
push(bytes,
size); }
305 void PopBytes(
size_t amount) {
buf_.
pop(amount); }
307 template<
typename T>
void AssertScalarT() {
313 template<
typename T,
typename ReturnT = uoffset_t>
314 ReturnT PushElement(T element) {
318 return CalculateOffset<ReturnT>();
321 template<
typename T,
template<
typename>
class OffsetT =
Offset>
322 uoffset_t PushElement(OffsetT<T> off) {
324 return PushElement(ReferTo(off.o));
329 void TrackField(voffset_t field, uoffset_t off) {
330 FieldLoc fl = { off, field };
337 template<
typename T>
void AddElement(voffset_t field, T e, T def) {
340 TrackField(field, PushElement(e));
343 template<
typename T>
void AddElement(voffset_t field, T e) {
344 TrackField(field, PushElement(e));
347 template<
typename T>
void AddOffset(voffset_t field, Offset<T> off) {
348 if (off.IsNull())
return;
349 AddElement(field, ReferTo(off.o),
static_cast<uoffset_t
>(0));
352 template<
typename T>
void AddOffset(voffset_t field, Offset64<T> off) {
353 if (off.IsNull())
return;
354 AddElement(field, ReferTo(off.o),
static_cast<uoffset64_t
>(0));
357 template<
typename T>
void AddStruct(voffset_t field,
const T *structptr) {
358 if (!structptr)
return;
361 TrackField(field, CalculateOffset<uoffset_t>());
364 void AddStructOffset(voffset_t field, uoffset_t off) {
365 TrackField(field, off);
371 uoffset_t ReferTo(uoffset_t off) {
373 Align(
sizeof(uoffset_t));
380 uoffset64_t ReferTo(uoffset64_t off) {
382 Align(
sizeof(uoffset64_t));
384 return ReferTo(off,
GetSize());
387 template<
typename T,
typename T2> T ReferTo(
const T off,
const T2
size) {
389 return size - off +
static_cast<T
>(
sizeof(T));
392 template<
typename T> T ReferTo(
const T off,
const T
size) {
394 return size - off +
static_cast<T
>(
sizeof(T));
413 uoffset_t StartTable() {
422 uoffset_t EndTable(uoffset_t start) {
428 const uoffset_t vtable_offset_loc =
429 static_cast<uoffset_t
>(PushElement<soffset_t>(0));
436 (std::max)(
static_cast<voffset_t
>(
max_voffset_ +
sizeof(voffset_t)),
439 const uoffset_t table_object_size = vtable_offset_loc - start;
442 WriteScalar<voffset_t>(
buf_.
data() +
sizeof(voffset_t),
443 static_cast<voffset_t
>(table_object_size));
448 auto field_location =
reinterpret_cast<FieldLoc *
>(it);
449 const voffset_t pos =
450 static_cast<voffset_t
>(vtable_offset_loc - field_location->off);
453 !ReadScalar<voffset_t>(
buf_.
data() + field_location->id));
454 WriteScalar<voffset_t>(
buf_.
data() + field_location->id, pos);
457 auto vt1 =
reinterpret_cast<voffset_t *
>(
buf_.
data());
458 auto vt1_size = ReadScalar<voffset_t>(vt1);
464 it +=
sizeof(uoffset_t)) {
465 auto vt_offset_ptr =
reinterpret_cast<uoffset_t *
>(it);
466 auto vt2 =
reinterpret_cast<voffset_t *
>(
buf_.
data_at(*vt_offset_ptr));
467 auto vt2_size = ReadScalar<voffset_t>(vt2);
468 if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size))
continue;
469 vt_use = *vt_offset_ptr;
484 static_cast<soffset_t
>(vt_use) -
485 static_cast<soffset_t
>(vtable_offset_loc));
487 return vtable_offset_loc;
491 uoffset_t EndTable(uoffset_t start, voffset_t ) {
492 return EndTable(start);
497 template<
typename T>
void Required(Offset<T> table, voffset_t field) {
498 auto table_ptr =
reinterpret_cast<const Table *
>(
buf_.
data_at(table.o));
499 bool ok = table_ptr->GetOptionalFieldOffset(field) != 0;
505 uoffset_t StartStruct(
size_t alignment) {
512 void ClearOffsets() {
520 void PreAlign(
size_t len,
size_t alignment) {
521 if (len == 0)
return;
522 TrackMinAlign(alignment);
528 template<
typename AlignT>
void PreAlign(
size_t len) {
529 AssertScalarT<AlignT>();
530 PreAlign(len, AlignOf<AlignT>());
538 template<
template<
typename>
class OffsetT =
Offset>
540 CreateStringImpl(str, len);
541 return OffsetT<String>(
542 CalculateOffset<
typename OffsetT<String>::offset_type>());
548 template<
template<
typename>
class OffsetT =
Offset>
550 return CreateString<OffsetT>(str, strlen(str));
556 template<
template<
typename>
class OffsetT =
Offset>
558 return CreateString<OffsetT>(str, strlen(str));
564 template<
template<
typename>
class OffsetT =
Offset>
566 return CreateString<OffsetT>(str.c_str(), str.length());
570 #ifdef FLATBUFFERS_HAS_STRING_VIEW
574 template<
template <
typename>
class OffsetT =
Offset>
575 OffsetT<String>
CreateString(flatbuffers::string_view str) {
576 return CreateString<OffsetT>(str.data(), str.size());
584 template<
template<
typename>
class OffsetT =
Offset>
586 return str ? CreateString<OffsetT>(str->c_str(), str->size()) : 0;
593 template<
template<
typename>
class OffsetT =
Offset,
596 int &...ExplicitArgumentBarrier,
typename T>
598 return CreateString<OffsetT>(str.c_str(), str.length());
614 const size_t size_before_string =
buf_.
size();
617 const Offset<String> off = CreateString<Offset>(str, len);
630#ifdef FLATBUFFERS_HAS_STRING_VIEW
673 template<
typename LenT = uoffset_t,
typename ReturnT = uoffset_t>
674 ReturnT EndVector(
size_t len) {
677 return PushElement<LenT, ReturnT>(
static_cast<LenT
>(len));
680 template<
template<
typename>
class OffsetT =
Offset,
typename LenT = uint32_t>
681 void StartVector(
size_t len,
size_t elemsize,
size_t alignment) {
686 PreAlign<LenT>(len * elemsize);
687 PreAlign(len * elemsize, alignment);
690 template<
typename T,
template<
typename>
class OffsetT =
Offset,
691 typename LenT = uint32_t>
692 void StartVector(
size_t len) {
693 return StartVector<OffsetT, LenT>(len,
sizeof(T), AlignOf<T>());
701 void ForceVectorAlignment(
size_t len,
size_t elemsize,
size_t alignment) {
702 if (len == 0)
return;
704 PreAlign(len * elemsize, alignment);
708 void ForceStringAlignment(
size_t len,
size_t alignment) {
709 if (len == 0)
return;
711 PreAlign((len + 1) *
sizeof(
char), alignment);
725 template<
typename T,
template<
typename...>
class OffsetT =
Offset,
726 template<
typename...>
class VectorT =
Vector>
729 typedef typename VectorT<T>::size_type LenT;
730 typedef typename OffsetT<VectorT<T>>::offset_type offset_type;
734 StartVector<T, OffsetT, LenT>(len);
737 #if FLATBUFFERS_LITTLEENDIAN
738 PushBytes(
reinterpret_cast<const uint8_t *
>(v), len *
sizeof(T));
740 if (
sizeof(T) == 1) {
741 PushBytes(
reinterpret_cast<const uint8_t *
>(v), len);
743 for (
auto i = len; i > 0; ) {
750 return OffsetT<VectorT<T>>(EndVector<LenT, offset_type>(len));
760 template<
typename T,
class C> Offset<Vector<T>>
CreateVector(
const C &array) {
775 Offset<Vector<Offset<T>>>
CreateVector(
const Offset<T> *v,
size_t len) {
776 StartVector<Offset<T>>(len);
777 for (
auto i = len; i > 0;) { PushElement(v[--i]); }
778 return Offset<Vector<Offset<T>>>(EndVector(len));
787 template<
typename T,
typename Alloc = std::allocator<T>>
792 template<
template<
typename...>
class VectorT =
Vector64,
793 int &...ExplicitArgumentBarrier,
typename T>
795 return CreateVector<T, Offset64, VectorT>(
data(v), v.size());
802 StartVector<uint8_t>(v.size());
803 for (
auto i = v.size(); i > 0;) {
804 PushElement(
static_cast<uint8_t
>(v[--i]));
806 return Offset<Vector<uint8_t>>(EndVector(v.size()));
818 const std::function<T(
size_t i)> &f) {
820 std::vector<T> elems(vector_size);
821 for (
size_t i = 0; i < vector_size; i++) elems[i] = f(i);
836 template<
typename T,
typename F,
typename S>
839 std::vector<T> elems(vector_size);
840 for (
size_t i = 0; i < vector_size; i++) elems[i] = f(i, state);
852 template<
typename StringType = std::string,
853 typename Alloc = std::allocator<StringType>>
855 const std::vector<StringType, Alloc> &v) {
868 auto scratch_buffer_usage =
size *
sizeof(Offset<String>);
873 for (
auto it =
begin; it != end; ++it) {
876 StartVector<Offset<String>>(
size);
877 for (
auto i = 1; i <=
size; i++) {
880 PushElement(*
reinterpret_cast<Offset<String> *
>(
884 return Offset<Vector<Offset<String>>>(EndVector(
size));
894 template<
typename T,
template<
typename...>
class OffsetT =
Offset,
895 template<
typename...>
class VectorT =
Vector>
898 typedef typename VectorT<T>::size_type LenT;
899 typedef typename OffsetT<VectorT<const T *>>::offset_type offset_type;
901 StartVector<OffsetT, LenT>(len *
sizeof(T) / AlignOf<T>(),
sizeof(T),
904 PushBytes(
reinterpret_cast<const uint8_t *
>(v),
sizeof(T) * len);
906 return OffsetT<VectorT<const T *>>(EndVector<LenT, offset_type>(len));
919 size_t vector_size,
const std::function<
void(
size_t i, T *)> &filler) {
920 T *structs = StartVectorOfStructs<T>(vector_size);
921 for (
size_t i = 0; i < vector_size; i++) {
925 return EndVectorOfStructs<T>(vector_size);
937 template<
typename T,
typename F,
typename S>
940 T *structs = StartVectorOfStructs<T>(vector_size);
941 for (
size_t i = 0; i < vector_size; i++) {
942 f(i, structs, state);
945 return EndVectorOfStructs<T>(vector_size);
954 template<
typename T,
template<
typename...>
class OffsetT =
Offset,
955 template<
typename...>
class VectorT =
Vector,
956 typename Alloc = std::allocator<T>>
958 const std::vector<T, Alloc> &v) {
959 return CreateVectorOfStructs<T, OffsetT, VectorT>(
data(v), v.size());
962 template<
template<
typename...>
class VectorT =
Vector64,
int &...,
typename T>
964 const std::vector<T> &v) {
965 return CreateVectorOfStructs<T, Offset64, VectorT>(
data(v), v.size());
978 template<
typename T,
typename S>
980 const S *v,
size_t len, T (*
const pack_func)(
const S &)) {
982 auto structs = StartVectorOfStructs<T>(len);
983 for (
size_t i = 0; i < len; i++) { structs[i] = pack_func(v[i]); }
984 return EndVectorOfStructs<T>(len);
995 template<
typename T,
typename S>
998 extern T Pack(
const S &);
1012 template<
typename T,
typename S,
typename Alloc = std::allocator<T>>
1014 const std::vector<S, Alloc> &v, T (*
const pack_func)(
const S &)) {
1015 return CreateVectorOfNativeStructs<T, S>(
data(v), v.size(), pack_func);
1026 template<
typename T,
typename S,
typename Alloc = std::allocator<S>>
1028 const std::vector<S, Alloc> &v) {
1029 return CreateVectorOfNativeStructs<T, S>(
data(v), v.size());
1033 template<
typename T>
struct StructKeyComparator {
1034 bool operator()(
const T &a,
const T &b)
const {
1035 return a.KeyCompareLessThan(&b);
1047 template<
typename T,
typename Alloc = std::allocator<T>>
1049 std::vector<T, Alloc> *v) {
1061 template<
typename T,
typename S,
typename Alloc = std::allocator<T>>
1063 std::vector<S, Alloc> *v) {
1064 return CreateVectorOfSortedNativeStructs<T, S>(
data(*v), v->size());
1075 template<
typename T>
1077 std::stable_sort(v, v + len, StructKeyComparator<T>());
1090 template<
typename T,
typename S>
1093 extern T Pack(
const S &);
1094 auto structs = StartVectorOfStructs<T>(len);
1095 for (
size_t i = 0; i < len; i++) { structs[i] = Pack(v[i]); }
1096 std::stable_sort(structs, structs + len, StructKeyComparator<T>());
1097 return EndVectorOfStructs<T>(len);
1101 template<
typename T>
struct TableKeyComparator {
1103 TableKeyComparator(
const TableKeyComparator &other) : buf_(other.buf_) {}
1104 bool operator()(
const Offset<T> &a,
const Offset<T> &b)
const {
1105 auto table_a =
reinterpret_cast<T *
>(buf_.data_at(a.o));
1106 auto table_b =
reinterpret_cast<T *
>(buf_.data_at(
b.o));
1107 return table_a->KeyCompareLessThan(table_b);
1109 vector_downward<SizeT> &buf_;
1112 FLATBUFFERS_DELETE_FUNC(
1113 TableKeyComparator &
operator=(
const TableKeyComparator &other));
1125 template<
typename T>
1128 std::stable_sort(v, v + len, TableKeyComparator<T>(
buf_));
1139 template<
typename T,
typename Alloc = std::allocator<T>>
1141 std::vector<Offset<T>, Alloc> *v) {
1153 size_t alignment, uint8_t **buf) {
1155 StartVector(len, elemsize, alignment);
1158 auto vec_end = EndVector(len);
1177 template<
typename T>
1181 reinterpret_cast<uint8_t **
>(buf));
1184 template<
typename T>
1188 reinterpret_cast<uint8_t **
>(buf));
1194 template<
typename T,
typename U>
1198 StartVector<T>(len);
1199 for (
auto i = len; i > 0;) { PushElement(
static_cast<T
>(v[--i])); }
1200 return Offset<Vector<T>>(EndVector(len));
1206 Align(AlignOf<T>());
1208 return Offset<const T *>(
1209 CalculateOffset<
typename Offset<const T *>::offset_type>());
1215 template<
typename T>
1216 void Finish(Offset<T> root,
const char *file_identifier =
nullptr) {
1217 Finish(root.o, file_identifier,
false);
1227 template<
typename T>
1229 const char *file_identifier =
nullptr) {
1230 Finish(root.o, file_identifier,
true);
1239 ::flatbuffers::kFileIdentifierLength;
1246 void Finish(uoffset_t root,
const char *file_identifier,
bool size_prefix) {
1250 const size_t prefix_size = size_prefix ?
sizeof(
SizeT) : 0;
1252 TrackMinAlign(prefix_size);
1254 const size_t root_offset_size =
sizeof(uoffset_t);
1258 PreAlign(prefix_size + root_offset_size + file_id_size,
minalign_);
1260 if (file_identifier) {
1262 PushBytes(
reinterpret_cast<const uint8_t *
>(file_identifier),
1265 PushElement(ReferTo(root));
1266 if (size_prefix) { PushElement(
GetSize()); }
1319 bool operator()(
const Offset<String> &a,
const Offset<String> &b)
const {
1322 return StringLessThan(stra->data(), stra->size(), strb->data(),
1333 void CanAddOffset64() {
1346 static_assert(Is64Aware,
"cannot add 64-bit offset to a 32-bit builder");
1360 void CreateStringImpl(
const char *str,
size_t len) {
1362 PreAlign<uoffset_t>(len + 1);
1364 PushBytes(
reinterpret_cast<const uint8_t *
>(str), len);
1365 PushElement(
static_cast<uoffset_t
>(len));
1370 template<
typename T,
template<
typename>
class OffsetT =
Offset>
1371 T *StartVectorOfStructs(
size_t vector_size) {
1372 StartVector<OffsetT>(vector_size *
sizeof(T) / AlignOf<T>(),
sizeof(T),
1374 return reinterpret_cast<T *
>(
buf_.
make_space(vector_size *
sizeof(T)));
1379 template<
typename T,
template<
typename>
class OffsetT =
Offset>
1380 OffsetT<Vector<const T *>> EndVectorOfStructs(
size_t vector_size) {
1381 return OffsetT<Vector<const T *>>(
1382 EndVector<typename Vector<const T *>::size_type,
1383 typename OffsetT<Vector<const T *>>::offset_type>(
1387 template<
typename T>
1388 typename std::enable_if<std::is_same<T, uoffset_t>::value, T>
::type
1397 template<
typename T>
1398 typename std::enable_if<std::is_same<T, uoffset64_t>::value, T>
::type
1401 static_assert(Is64Aware,
"invalid 64-bit offset in 32-bit builder");
1424 CreateStringImpl(str, len);
1425 return Offset64<String>(
1426 CalculateOffset<
typename Offset64<String>::offset_type>());
1435inline void FlatBufferBuilder64::StartVector<Offset64, uint32_t>(
1436 size_t len,
size_t elemsize,
size_t alignment) {
1438 StartVector<EmptyOffset, uint32_t>(len, elemsize, alignment);
1443inline void FlatBufferBuilder64::StartVector<Offset64, uint64_t>(
1444 size_t len,
size_t elemsize,
size_t alignment) {
1446 StartVector<EmptyOffset, uint64_t>(len, elemsize, alignment);
1460 return GetMutableTemporaryPointer<T>(fbb,
offset);
int Offset(const Dims< 4 > &dims, int i0, int i1, int i2, int i3)
#define FLATBUFFERS_ASSERT
static const size_t kFileIdentifierLength
The length of a FlatBuffer file header.
uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, size_t alignment, uint8_t **buf)
Specialized version of CreateVector for non-copying use cases. Write the data any time later to the r...
uint8_t * ReleaseRaw(size_t &size, size_t &offset)
Get the released pointer to the serialized buffer.
OffsetT< String > CreateString(char *str)
Store a string in the buffer, which is null-terminated.
Offset< const T * > CreateStruct(const T &structobj)
Write a struct by itself, typically to be part of a union.
FlatBufferBuilderImpl & operator=(FlatBufferBuilderImpl &&other) noexcept
Move assignment operator for FlatBufferBuilder.
FlatBufferBuilderImpl(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf< largest_scalar_t >())
Default constructor for FlatBufferBuilder.
OffsetT< String > CreateString(const String *str)
Store a string in the buffer, which can contain any binary data.
OffsetT< String > CreateString(const char *str, size_t len)
Store a string in the buffer, which can contain any binary data.
uint8_t * GetCurrentBufferPointer() const
Get a pointer to an unfinished buffer.
size_t GetBufferMinAlignment() const
get the minimum alignment this buffer needs to be accessed properly. This is only known once all elem...
void Finish(uoffset_t root, const char *file_identifier, bool size_prefix)
Offset< String > CreateSharedString(const String *str)
Store a string in the buffer, which can contain any binary data. If a string with this exact contents...
Offset< Vector< const T * > > CreateUninitializedVectorOfStructs(size_t len, T **buf)
std::set< Offset< String >, StringOffsetCompare > StringOffsetMap
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S, Alloc > &v, T(*const pack_func)(const S &))
Serialize a std::vector of native structs into a FlatBuffer vector.
Offset< String > CreateSharedString(const std::string &str)
Store a string in the buffer, which can contain any binary data. If a string with this exact contents...
Offset< Vector< T > > CreateVector(size_t vector_size, F f, S *state)
Serialize values returned by a function into a FlatBuffer vector. This is a convenience function that...
Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T >, Alloc > *v)
Serialize an array of table offsets as a vector in the buffer in sorted order.
OffsetT< String > CreateString(const T &str)
Store a string in the buffer, which can contain any binary data.
Offset< Vector< T > > CreateVector(size_t vector_size, const std::function< T(size_t i)> &f)
Serialize values returned by a function into a FlatBuffer vector. This is a convenience function that...
Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, const std::function< void(size_t i, T *)> &filler)
Serialize an array of structs into a FlatBuffer vector.
Offset< Vector< T > > CreateVectorScalarCast(const U *v, size_t len)
FlatBufferBuilderImpl(const FlatBufferBuilderImpl &)
std::conditional< Is64Aware, uoffset64_t, uoffset_t >::type SizeT
Offset< Vector< uint8_t > > CreateVector(const std::vector< bool > &v)
Offset< Vector< const T * > > CreateVectorOfSortedNativeStructs(S *v, size_t len)
Serialize an array of native structs into a FlatBuffer vector in sorted order.
Offset< Vector< Offset< T > > > CreateVector(const Offset< T > *v, size_t len)
Offset< String > CreateSharedString(const char *str, size_t len)
Store a string in the buffer, which can contain any binary data. If a string with this exact contents...
Offset< Vector< Offset< String > > > CreateVectorOfStrings(It begin, It end)
Serialize a collection of Strings into a FlatBuffer vector. This is a convenience function for a comm...
void Finish(Offset< T > root, const char *file_identifier=nullptr)
Finish serializing a buffer by writing the root offset.
Offset< Vector< T > > CreateVector(std::initializer_list< T > v)
Serialize an initializer list into a FlatBuffer vector.
Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< StringType, Alloc > &v)
Serialize a std::vector<StringType> into a FlatBuffer vector. whereas StringType is any type that is ...
size_t length_of_64_bit_region_
vector_downward< SizeT > buf_
OffsetT< String > CreateString(const std::string &str)
Store a string in the buffer, which can contain any binary data.
SizeT GetSize() const
The current size of the serialized buffer, counting from the end.
Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, F f, S *state)
Serialize an array of structs into a FlatBuffer vector.
Offset< Vector< const T * > > CreateVectorOfSortedStructs(std::vector< T, Alloc > *v)
Serialize a std::vector of structs into a FlatBuffer vector in sorted order.
DetachedBuffer Release()
Get the released DetachedBuffer.
std::enable_if<!is_64, uoffset_t >::type GetSizeRelative32BitRegion() const
FLATBUFFERS_ATTRIBUTE() DetachedBuffer ReleaseBufferPointer()
Get the released pointer to the serialized buffer.
Offset< Vector< T > > CreateVector(const std::vector< T, Alloc > &v)
Serialize a std::vector into a FlatBuffer vector.
void Clear()
Reset all the state in this FlatBufferBuilder so it can be reused to construct another buffer.
Offset64< VectorT< const T * > > CreateVectorOfStructs64(const std::vector< T > &v)
OffsetT< VectorT< const T * > > CreateVectorOfStructs(const std::vector< T, Alloc > &v)
Serialize a std::vector of structs into a FlatBuffer vector.
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S, Alloc > &v)
Serialize a std::vector of native structs into a FlatBuffer vector.
void Swap(FlatBufferBuilderImpl &other)
void FinishSizePrefixed(Offset< T > root, const char *file_identifier=nullptr)
Finish a buffer with a 32 bit size field pre-fixed (size of the buffer following the size field)....
StringOffsetMap * string_pool
Offset< Vector< const T * > > CreateVectorOfSortedNativeStructs(std::vector< S, Alloc > *v)
Serialize a std::vector of native structs into a FlatBuffer vector in sorted order.
Offset64< VectorT< T > > CreateVector64(const std::vector< T > &v)
Offset< String > CreateSharedString(const char *str)
Store a string in the buffer, which null-terminated. If a string with this exact contents has already...
OffsetT< String > CreateString(const char *str)
Store a string in the buffer, which is null-terminated.
FlatBufferBuilderImpl(FlatBufferBuilderImpl &&other) noexcept
Move constructor for FlatBufferBuilder.
void ForceDefaults(bool fd)
In order to save space, fields that are set to their default value don't get serialized into the buff...
OffsetT< VectorT< T > > CreateVector(const T *v, size_t len)
Serialize an array into a FlatBuffer vector.
flatbuffers::span< uint8_t > GetBufferSpan() const
Get the serialized buffer (after you call Finish()) as a span.
void DedupVtables(bool dedup)
By default vtables are deduped in order to save space.
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const S *v, size_t len, T(*const pack_func)(const S &))
Serialize an array of native structs into a FlatBuffer vector.
Offset< Vector< T > > CreateUninitializedVector(size_t len, T **buf)
Specialized version of CreateVector for non-copying use cases. Write the data any time later to the r...
std::enable_if< is_64, uoffset_t >::type GetSizeRelative32BitRegion() const
The current size of the serialized buffer relative to the end of the 32-bit region.
Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)
Serialize an array of table offsets as a vector in the buffer in sorted order.
Offset< Vector< const T * > > CreateVectorOfSortedStructs(T *v, size_t len)
Serialize an array of structs into a FlatBuffer vector in sorted order.
Offset< Vector< T > > CreateVector(const C &array)
Serialize an array like object into a FlatBuffer vector.
uint8_t * GetBufferPointer() const
Get the serialized buffer (after you call Finish()).
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const S *v, size_t len)
Serialize an array of native structs into a FlatBuffer vector.
FlatBufferBuilderImpl & operator=(const FlatBufferBuilderImpl &)
OffsetT< VectorT< const T * > > CreateVectorOfStructs(const T *v, size_t len)
Serialize an array of structs into a FlatBuffer vector.
void SwapBufAllocator(FlatBufferBuilderImpl &other)
void scratch_pop(size_t bytes_to_remove)
void fill(size_t zero_pad_bytes)
void push(const uint8_t *bytes, size_t num)
void swap_allocator(vector_downward &other)
uint8_t * make_space(size_t len)
uint8_t * release_raw(size_t &allocated_bytes, size_t &offset)
void swap(vector_downward &other)
void scratch_push_small(const T &t)
void fill_big(size_t zero_pad_bytes)
void push_small(const T &little_endian_t)
void pop(size_t bytes_to_remove)
uint8_t * scratch_data() const
size_t ensure_space(size_t len)
uint8_t * data_at(size_t offset) const
uint8_t * scratch_end() const
__global uchar * offset(const Image *img, int x, int y)
T * GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset< T > offset)
const T * GetTemporaryPointer(FlatBufferBuilder &fbb, Offset< T > offset)
voffset_t FieldIndexToOffset(voffset_t field_id)
Vector< T, uoffset64_t > Vector64
const T * data(const std::vector< T, Alloc > &v)
const vector_downward< SizeT > * buf_
StringOffsetCompare(const vector_downward< SizeT > &buf)
bool operator()(const Offset< String > &a, const Offset< String > &b) const