24#ifndef FLATBUFFERS_CPP98_STL
28#if defined(FLATBUFFERS_NAN_DEFAULTS)
37template <
typename T>
inline bool IsTheSameAs(T e, T def) {
return e == def; }
39#if defined(FLATBUFFERS_NAN_DEFAULTS) && defined(FLATBUFFERS_HAS_NEW_STRTOD) && \
40 (FLATBUFFERS_HAS_NEW_STRTOD > 0)
42template <
typename T>
inline bool IsFloatTheSameAs(T e, T def)
44 return (e == def) || ((def != def) && (e != e));
46template <>
inline bool IsTheSameAs<float>(
float e,
float def) {
return IsFloatTheSameAs(e, def); }
47template <>
inline bool IsTheSameAs<double>(
double e,
double def)
49 return IsFloatTheSameAs(e, def);
56template <
typename T>
inline bool IsOutRange(
const T &v,
const T &low,
const T &high)
58 return (v < low) || (high < v);
56template <
typename T>
inline bool IsOutRange(
const T &v,
const T &low,
const T &high) {
…}
62template <
typename T>
inline bool IsInRange(
const T &v,
const T &low,
const T &high)
62template <
typename T>
inline bool IsInRange(
const T &v,
const T &low,
const T &high) {
…}
82 FLATBUFFERS_ASSERT(*
reinterpret_cast<char *
>(&endiantest) == FLATBUFFERS_LITTLEENDIAN);
86template <
typename T> FLATBUFFERS_CONSTEXPR
size_t AlignOf()
92 return __alignof__(T);
86template <
typename T> FLATBUFFERS_CONSTEXPR
size_t AlignOf() {
…}
115 return EndianScalar((
reinterpret_cast<const T *
>(
p))[i]);
125 p += i *
sizeof(uoffset_t);
126 return reinterpret_cast<return_type>(
p + ReadScalar<uoffset_t>(
p));
133 static const size_t element_stride =
sizeof(T);
136 return reinterpret_cast<const T *
>(
p + i *
sizeof(T));
163#if !defined(FLATBUFFERS_CPP98_STL)
240 const uint8_t *data_;
251 auto tmp = std::reverse_iterator<Iterator>::current;
259 auto tmp = std::reverse_iterator<Iterator>::current;
280 uoffset_t Length()
const {
return size(); }
297 template <
typename E> E
GetEnum(uoffset_t i)
const {
return static_cast<E
>(
Get(i)); }
301 template <
typename U>
const U *
GetAs(uoffset_t i)
const
303 return reinterpret_cast<const U *
>(
Get(i));
301 template <
typename U>
const U *
GetAs(uoffset_t i)
const {
…}
312 return reinterpret_cast<const void *
>(
Data() + o);
340 WriteScalar(
data() + i, val);
349 static_assert(
sizeof(T) ==
sizeof(uoffset_t),
"Unrelated types");
350 WriteScalar(
data() + i,
static_cast<uoffset_t
>(val - (
Data() + i *
sizeof(uoffset_t))));
361 const uint8_t *
Data()
const {
return reinterpret_cast<const uint8_t *
>(&
length_ + 1); }
363 uint8_t *
Data() {
return reinterpret_cast<uint8_t *
>(&
length_ + 1); }
366 const T *
data()
const {
return reinterpret_cast<const T *
>(
Data()); }
367 T *
data() {
return reinterpret_cast<T *
>(
Data()); }
371 void *search_result =
379 const uint8_t *element =
reinterpret_cast<const uint8_t *
>(search_result);
397 template <
typename K>
static int KeyCompare(
const void *ap,
const void *bp)
399 const K *key =
reinterpret_cast<const K *
>(ap);
400 const uint8_t *
data =
reinterpret_cast<const uint8_t *
>(bp);
405 return -table->KeyCompareWithValue(*key);
416 const uint8_t *
Data()
const {
return reinterpret_cast<const uint8_t *
>(&
length_ + 1); }
417 uint8_t *
Data() {
return reinterpret_cast<uint8_t *
>(&
length_ + 1); }
429#ifndef FLATBUFFERS_CPP98_STL
432 static_assert(std::is_base_of<T, U>::value,
"Unrelated types");
438 static_assert(std::is_base_of<T, U>::value,
"Unrelated types");
445template <
typename T>
static inline size_t VectorLength(
const Vector<T> *v)
447 return v ? v->size() : 0;
451template <
typename T, u
int16_t length>
class Array
464 FLATBUFFERS_CONSTEXPR uint16_t
size()
const {
return length; }
477 template <
typename E> E
GetEnum(uoffset_t i)
const {
return static_cast<E
>(
Get(i)); }
500 return const_cast<T *
>(&
data()[i]);
512 const T *
data()
const {
return reinterpret_cast<const T *
>(
Data()); }
513 T *
data() {
return reinterpret_cast<T *
>(
Data()); }
519 const auto p1 =
reinterpret_cast<const uint8_t *
>(src.data());
520 const auto p2 =
Data();
521 FLATBUFFERS_ASSERT(!(p1 >= p2 && p1 < (p2 + length)) && !(p2 >= p1 && p2 < (p1 + length)));
526 !scalar_tag::value ||
sizeof(T) == 1 || FLATBUFFERS_LITTLEENDIAN > (), src);
533 WriteScalar(
data() + i, val);
542 flatbuffers::span<const T, length> src)
547 std::memcpy(
data(), src.data(), length *
sizeof(T));
552 flatbuffers::span<const T, length> src)
565#if defined(__cpp_constexpr)
451template <
typename T, u
int16_t length>
class Array {
…};
582template <
typename T, u
int16_t length>
class Array<
Offset<T>, length>
582template <
typename T, u
int16_t length>
class Array<
Offset<T>, length> {
…};
619template <
typename E,
typename T, u
int16_t length>
622 static_assert(
sizeof(E) ==
sizeof(T),
"invalid enum type E");
626template <
typename E,
typename T, u
int16_t length>
629 static_assert(
sizeof(E) ==
sizeof(T),
"invalid enum type E");
635static inline bool StringLessThan(
const char *a_data, uoffset_t a_size,
const char *b_data,
638 const auto cmp = memcmp(a_data, b_data, (std::min)(a_size, b_size));
639 return cmp == 0 ? a_size < b_size : cmp < 0;
644 const char *
c_str()
const {
return reinterpret_cast<const char *
>(
Data()); }
647#ifdef FLATBUFFERS_HAS_STRING_VIEW
648 flatbuffers::string_view string_view()
const {
return flatbuffers::string_view(
c_str(),
size()); }
660static inline std::string GetString(
const String *
str) {
return str ?
str->str() :
""; }
664static inline const char *GetCstring(
const String *
str) {
return str ?
str->c_str() :
""; }
666#ifdef FLATBUFFERS_HAS_STRING_VIEW
669static inline flatbuffers::string_view GetStringView(
const String *
str)
671 return str ?
str->string_view() : flatbuffers::string_view();
694 size_t in_use_back,
size_t in_use_front)
697 uint8_t *new_p =
allocate(new_size);
698 memcpy_downward(old_p, old_size, new_p, new_size, in_use_back, in_use_front);
708 void memcpy_downward(uint8_t *old_p,
size_t old_size, uint8_t *new_p,
size_t new_size,
709 size_t in_use_back,
size_t in_use_front)
711 memcpy(new_p + new_size - in_use_back, old_p + old_size - in_use_back, in_use_back);
712 memcpy(new_p, old_p, in_use_front);
722 void deallocate(uint8_t *
p,
size_t) FLATBUFFERS_OVERRIDE {
delete[]
p; }
724 static void dealloc(
void *
p,
size_t) {
delete[]
static_cast<uint8_t *
>(
p); }
745 size_t new_size,
size_t in_use_back,
size_t in_use_front)
748 ?
allocator->reallocate_downward(old_p, old_size, new_size, in_use_back, in_use_front)
766 uint8_t *cur,
size_t sz)
772#if !defined(FLATBUFFERS_CPP98_STL)
782#if !defined(FLATBUFFERS_CPP98_STL)
817 return verifier.Verify<T>(
nullptr);
821 const T* GetRoot()
const {
822 return flatbuffers::GetRoot<T>(
data());
827 return flatbuffers::GetRoot<T>(
data());
831#if !defined(FLATBUFFERS_CPP98_STL)
879 size_t buffer_minalign)
880 : allocator_(
allocator), own_allocator_(own_allocator), initial_size_(initial_size),
881 buffer_minalign_(buffer_minalign), reserved_(0), buf_(nullptr), cur_(nullptr),
886#if !defined(FLATBUFFERS_CPP98_STL)
892 : allocator_(other.allocator_), own_allocator_(other.own_allocator_),
893 initial_size_(other.initial_size_), buffer_minalign_(other.buffer_minalign_),
894 reserved_(other.reserved_), buf_(other.buf_), cur_(other.cur_), scratch_(other.scratch_)
899 other.own_allocator_ =
false;
901 other.buf_ =
nullptr;
902 other.cur_ =
nullptr;
903 other.scratch_ =
nullptr;
906#if !defined(FLATBUFFERS_CPP98_STL)
934 cur_ = buf_ + reserved_;
948 if (own_allocator_ && allocator_)
952 allocator_ =
nullptr;
953 own_allocator_ =
false;
967 allocated_bytes = reserved_;
968 offset =
static_cast<size_t>(cur_ - buf_);
984 allocator_ =
nullptr;
985 own_allocator_ =
false;
995 if (len >
static_cast<size_t>(cur_ - scratch_))
1017 return static_cast<uoffset_t
>(reserved_ -
static_cast<size_t>(cur_ - buf_));
1020 uoffset_t
scratch_size()
const {
return static_cast<uoffset_t
>(scratch_ - buf_); }
1044 void push(
const uint8_t *bytes,
size_t num)
1044 void push(
const uint8_t *bytes,
size_t num) {
…}
1056 *
reinterpret_cast<T *
>(cur_) = little_endian_t;
1062 *
reinterpret_cast<T *
>(scratch_) = t;
1063 scratch_ +=
sizeof(T);
1071 for (
size_t i = 0; i < zero_pad_bytes; i++)
1079 void pop(
size_t bytes_to_remove) { cur_ += bytes_to_remove; }
1080 void scratch_pop(
size_t bytes_to_remove) { scratch_ -= bytes_to_remove; }
1085 swap(allocator_, other.allocator_);
1086 swap(own_allocator_, other.own_allocator_);
1087 swap(initial_size_, other.initial_size_);
1088 swap(buffer_minalign_, other.buffer_minalign_);
1089 swap(reserved_, other.reserved_);
1090 swap(buf_, other.buf_);
1091 swap(cur_, other.cur_);
1092 swap(scratch_, other.scratch_);
1098 swap(allocator_, other.allocator_);
1099 swap(own_allocator_, other.own_allocator_);
1108 bool own_allocator_;
1109 size_t initial_size_;
1110 size_t buffer_minalign_;
1116 void reallocate(
size_t len)
1118 auto old_reserved = reserved_;
1119 auto old_size =
size();
1121 reserved_ += (std::max)(len, old_reserved ? old_reserved / 2 : initial_size_);
1122 reserved_ = (reserved_ + buffer_minalign_ - 1) & ~(buffer_minalign_ - 1);
1126 ReallocateDownward(allocator_, buf_, old_reserved, reserved_, old_size, old_scratch_size);
1130 buf_ =
Allocate(allocator_, reserved_);
1132 cur_ = buf_ + reserved_ - old_size;
1133 scratch_ = buf_ + old_scratch_size;
1141 const int fixed_fields = 2;
1142 return static_cast<voffset_t
>((field_id + fixed_fields) *
sizeof(voffset_t));
1145template <
typename T,
typename Alloc>
const T *
data(
const std::vector<T, Alloc> &v)
1150 return v.empty() ?
reinterpret_cast<const T *
>(&t) : &v.front();
1145template <
typename T,
typename Alloc>
const T *
data(
const std::vector<T, Alloc> &v) {
…}
1152template <
typename T,
typename Alloc> T *
data(std::vector<T, Alloc> &v)
1157 return v.empty() ?
reinterpret_cast<T *
>(&t) : &v.front();
1152template <
typename T,
typename Alloc> T *
data(std::vector<T, Alloc> &v) {
…}
1186 bool own_allocator =
false,
1187 size_t buffer_minalign = AlignOf<largest_scalar_t>())
1196#if !defined(FLATBUFFERS_CPP98_STL)
1211#if !defined(FLATBUFFERS_CPP98_STL)
1335 void Finished()
const
1358 void Pad(
size_t num_bytes) {
buf_.
fill(num_bytes); }
1360 void TrackMinAlign(
size_t elem_size)
1366 void Align(
size_t elem_size)
1368 TrackMinAlign(elem_size);
1372 void PushFlatBuffer(
const uint8_t *bytes,
size_t size)
1374 PushBytes(bytes,
size);
1378 void PushBytes(
const uint8_t *bytes,
size_t size) {
buf_.
push(bytes,
size); }
1380 void PopBytes(
size_t amount) {
buf_.
pop(amount); }
1382 template <
typename T>
void AssertScalarT()
1389 template <
typename T> uoffset_t PushElement(T element)
1392 T litle_endian_element = EndianScalar(element);
1398 template <
typename T> uoffset_t PushElement(Offset<T> off)
1401 return PushElement(ReferTo(off.o));
1406 void TrackField(voffset_t field, uoffset_t off)
1408 FieldLoc fl = {off, field};
1415 template <
typename T>
void AddElement(voffset_t field, T e, T def)
1420 auto off = PushElement(e);
1421 TrackField(field, off);
1424 template <
typename T>
void AddElement(voffset_t field, T e)
1426 auto off = PushElement(e);
1427 TrackField(field, off);
1430 template <
typename T>
void AddOffset(voffset_t field, Offset<T> off)
1434 AddElement(field, ReferTo(off.o),
static_cast<uoffset_t
>(0));
1437 template <
typename T>
void AddStruct(voffset_t field,
const T *structptr)
1441 Align(AlignOf<T>());
1446 void AddStructOffset(voffset_t field, uoffset_t off) { TrackField(field, off); }
1451 uoffset_t ReferTo(uoffset_t off)
1454 Align(
sizeof(uoffset_t));
1457 return GetSize() - off +
static_cast<uoffset_t
>(
sizeof(uoffset_t));
1477 uoffset_t StartTable()
1487 uoffset_t EndTable(uoffset_t start)
1493 auto vtableoffsetloc = PushElement<soffset_t>(0);
1502 auto table_object_size = vtableoffsetloc - start;
1505 WriteScalar<voffset_t>(
buf_.
data() +
sizeof(voffset_t),
1506 static_cast<voffset_t
>(table_object_size));
1510 it +=
sizeof(FieldLoc))
1512 auto field_location =
reinterpret_cast<FieldLoc *
>(it);
1513 auto pos =
static_cast<voffset_t
>(vtableoffsetloc - field_location->off);
1516 WriteScalar<voffset_t>(
buf_.
data() + field_location->id, pos);
1519 auto vt1 =
reinterpret_cast<voffset_t *
>(
buf_.
data());
1520 auto vt1_size = ReadScalar<voffset_t>(vt1);
1528 auto vt_offset_ptr =
reinterpret_cast<uoffset_t *
>(it);
1529 auto vt2 =
reinterpret_cast<voffset_t *
>(
buf_.
data_at(*vt_offset_ptr));
1530 auto vt2_size = ReadScalar<voffset_t>(vt2);
1531 if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size))
1533 vt_use = *vt_offset_ptr;
1549 static_cast<soffset_t
>(vt_use) -
static_cast<soffset_t
>(vtableoffsetloc));
1552 return vtableoffsetloc;
1556 uoffset_t EndTable(uoffset_t start, voffset_t ) {
return EndTable(start); }
1560 template <
typename T>
void Required(Offset<T> table, voffset_t field);
1562 uoffset_t StartStruct(
size_t alignment)
1568 uoffset_t EndStruct() {
return GetSize(); }
1579 void PreAlign(
size_t len,
size_t alignment)
1581 TrackMinAlign(alignment);
1584 template <
typename T>
void PreAlign(
size_t len)
1587 PreAlign(len,
sizeof(T));
1598 PreAlign<uoffset_t>(len + 1);
1600 PushBytes(
reinterpret_cast<const uint8_t *
>(
str), len);
1601 PushElement(
static_cast<uoffset_t
>(len));
1622#ifdef FLATBUFFERS_HAS_STRING_VIEW
1660 auto size_before_string =
buf_.
size();
1677#ifdef FLATBUFFERS_HAS_STRING_VIEW
1720 uoffset_t EndVector(
size_t len)
1724 return PushElement(
static_cast<uoffset_t
>(len));
1727 void StartVector(
size_t len,
size_t elemsize)
1731 PreAlign<uoffset_t>(len * elemsize);
1732 PreAlign(len * elemsize, elemsize);
1740 void ForceVectorAlignment(
size_t len,
size_t elemsize,
size_t alignment)
1743 PreAlign(len * elemsize, alignment);
1747 void ForceStringAlignment(
size_t len,
size_t alignment)
1750 PreAlign((len + 1) *
sizeof(
char), alignment);
1767 StartVector(len,
sizeof(T));
1773#if FLATBUFFERS_LITTLEENDIAN
1774 PushBytes(
reinterpret_cast<const uint8_t *
>(v), len *
sizeof(T));
1778 PushBytes(
reinterpret_cast<const uint8_t *
>(v), len);
1782 for (
auto i = len; i > 0;)
1784 PushElement(v[--i]);
1795 for (
auto i = len; i > 0;)
1797 PushElement(v[--i]);
1818 StartVector(v.size(),
sizeof(uint8_t));
1819 for (
auto i = v.size(); i > 0;)
1821 PushElement(
static_cast<uint8_t
>(v[--i]));
1826#ifndef FLATBUFFERS_CPP98_STL
1834 template <
typename T>
1837 std::vector<T> elems(vector_size);
1838 for (
size_t i = 0; i < vector_size; i++)
1854 template <
typename T,
typename F,
typename S>
1857 std::vector<T> elems(vector_size);
1858 for (
size_t i = 0; i < vector_size; i++)
1859 elems[i] = f(i, state);
1871 std::vector<Offset<String>> offsets(v.size());
1872 for (
size_t i = 0; i < v.size(); i++)
1886 StartVector(len *
sizeof(T) / AlignOf<T>(), AlignOf<T>());
1887 PushBytes(
reinterpret_cast<const uint8_t *
>(v),
sizeof(T) * len);
1901 template <
typename T,
typename S>
1903 T((*
const pack_func)(
const S &)))
1906 std::vector<T> vv(len);
1907 std::transform(v, v + len, vv.begin(), pack_func);
1908 return CreateVectorOfStructs<T>(
data(vv), vv.size());
1919 template <
typename T,
typename S>
1922 extern T Pack(
const S &);
1926#ifndef FLATBUFFERS_CPP98_STL
1935 template <
typename T>
1937 const std::function<
void(
size_t i, T *)> &filler)
1939 T *structs = StartVectorOfStructs<T>(vector_size);
1940 for (
size_t i = 0; i < vector_size; i++)
1945 return EndVectorOfStructs<T>(vector_size);
1959 template <
typename T,
typename F,
typename S>
1962 T *structs = StartVectorOfStructs<T>(vector_size);
1963 for (
size_t i = 0; i < vector_size; i++)
1965 f(i, structs, state);
1968 return EndVectorOfStructs<T>(vector_size);
1977 template <
typename T,
typename Alloc>
1993 template <
typename T,
typename S>
1995 T((*
const pack_func)(
const S &)))
1997 return CreateVectorOfNativeStructs<T, S>(
data(v), v.size(), pack_func);
2008 template <
typename T,
typename S>
2011 return CreateVectorOfNativeStructs<T, S>(
data(v), v.size());
2015 template <
typename T>
struct StructKeyComparator
2017 bool operator()(
const T &a,
const T &b)
const {
return a.KeyCompareLessThan(&b); }
2019 FLATBUFFERS_DELETE_FUNC(StructKeyComparator &
operator=(
const StructKeyComparator &));
2043 template <
typename T,
typename S>
2046 return CreateVectorOfSortedNativeStructs<T, S>(
data(*v), v->size());
2059 std::sort(v, v + len, StructKeyComparator<T>());
2072 template <
typename T,
typename S>
2075 extern T Pack(
const S &);
2076 typedef T (*Pack_t)(
const S &);
2077 std::vector<T> vv(len);
2078 std::transform(v, v + len, vv.begin(),
static_cast<Pack_t &
>(Pack));
2079 return CreateVectorOfSortedStructs<T>(vv, len);
2083 template <
typename T>
struct TableKeyComparator
2086 TableKeyComparator(
const TableKeyComparator &other) : buf_(other.buf_) {}
2087 bool operator()(
const Offset<T> &a,
const Offset<T> &b)
const
2089 auto table_a =
reinterpret_cast<T *
>(buf_.data_at(a.o));
2090 auto table_b =
reinterpret_cast<T *
>(buf_.data_at(
b.o));
2091 return table_a->KeyCompareLessThan(table_b);
2093 vector_downward &buf_;
2096 FLATBUFFERS_DELETE_FUNC(TableKeyComparator &
operator=(
const TableKeyComparator &other));
2108 template <
typename T>
2111 std::sort(v, v + len, TableKeyComparator<T>(
buf_));
2122 template <
typename T>
2138 StartVector(len, elemsize);
2141 auto vec_end = EndVector(len);
2160 template <
typename T>
2173 StartVector(len,
sizeof(T));
2174 for (
auto i = len; i > 0;)
2176 PushElement(
static_cast<T
>(v[--i]));
2185 Align(AlignOf<T>());
2198 Finish(root.o, file_identifier,
false);
2208 template <
typename T>
2211 Finish(root.o, file_identifier,
true);
2221 void Finish(uoffset_t root,
const char *file_identifier,
bool size_prefix)
2226 PreAlign((size_prefix ?
sizeof(uoffset_t) : 0) +
sizeof(uoffset_t) +
2229 if (file_identifier)
2234 PushElement(ReferTo(root));
2221 void Finish(uoffset_t root,
const char *file_identifier,
bool size_prefix) {
…}
2276 return StringLessThan(stra->data(), stra->size(), strb->data(), strb->size());
2288 template <
typename T> T *StartVectorOfStructs(
size_t vector_size)
2290 StartVector(vector_size *
sizeof(T) / AlignOf<T>(), AlignOf<T>());
2291 return reinterpret_cast<T *
>(
buf_.
make_space(vector_size *
sizeof(T)));
2305template <
typename T> T *GetMutableRoot(
void *buf)
2308 return reinterpret_cast<T *
>(
reinterpret_cast<uint8_t *
>(
buf) +
2309 EndianScalar(*
reinterpret_cast<uoffset_t *
>(buf)));
2312template <
typename T>
const T *
GetRoot(
const void *buf)
2314 return GetMutableRoot<T>(
const_cast<void *
>(buf));
2317template <
typename T>
const T *GetSizePrefixedRoot(
const void *buf)
2319 return GetRoot<T>(
reinterpret_cast<const uint8_t *
>(buf) +
sizeof(uoffset_t));
2325template <
typename T> T *GetMutableTemporaryPointer(FlatBufferBuilder &fbb, Offset<T>
offset)
2327 return reinterpret_cast<T *
>(fbb.GetCurrentBufferPointer() + fbb.GetSize() -
offset.o);
2330template <
typename T>
const T *GetTemporaryPointer(FlatBufferBuilder &fbb, Offset<T>
offset)
2332 return GetMutableTemporaryPointer<T>(fbb,
offset);
2342inline const char *GetBufferIdentifier(
const void *buf,
bool size_prefixed =
false)
2344 return reinterpret_cast<const char *
>(
buf) +
2345 ((size_prefixed) ? 2 *
sizeof(uoffset_t) : sizeof(uoffset_t));
2349inline bool BufferHasIdentifier(
const void *buf,
const char *identifier,
bool size_prefixed =
false)
2351 return strncmp(GetBufferIdentifier(buf, size_prefixed), identifier,
2356class Verifier FLATBUFFERS_FINAL_CLASS
2359 Verifier(
const uint8_t *buf,
size_t buf_len, uoffset_t _max_depth = 64,
2360 uoffset_t _max_tables = 1000000,
bool _check_alignment =
true)
2361 : buf_(
buf), size_(buf_len), depth_(0), max_depth_(_max_depth), num_tables_(0),
2362 max_tables_(_max_tables), upper_bound_(0), check_alignment_(_check_alignment)
2368 bool Check(
bool ok)
const
2370#ifdef FLATBUFFERS_DEBUG_VERIFICATION_FAILURE
2373#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
2382 bool Verify(
size_t elem,
size_t elem_len)
const
2384#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
2385 auto upper_bound = elem + elem_len;
2386 if (upper_bound_ < upper_bound)
2387 upper_bound_ = upper_bound;
2390 return Check(elem_len < size_ && elem <= size_ - elem_len);
2393 template <
typename T>
bool VerifyAlignment(
size_t elem)
const
2395 return Check((elem & (
sizeof(T) - 1)) == 0 || !check_alignment_);
2399 template <
typename T>
bool Verify(
size_t elem)
const
2401 return VerifyAlignment<T>(elem) &&
Verify(elem,
sizeof(T));
2404 bool VerifyFromPointer(
const uint8_t *
p,
size_t len)
2406 auto o =
static_cast<size_t>(
p - buf_);
2411 bool Verify(
const uint8_t *base, voffset_t elem_off,
size_t elem_len)
const
2413 return Verify(
static_cast<size_t>(base - buf_) + elem_off, elem_len);
2416 template <
typename T>
bool Verify(
const uint8_t *base, voffset_t elem_off)
const
2418 return Verify(
static_cast<size_t>(base - buf_) + elem_off,
sizeof(T));
2422 template <
typename T>
bool VerifyTable(
const T *table) {
return !table || table->Verify(*
this); }
2425 template <
typename T>
bool VerifyVector(
const Vector<T> *vec)
const
2427 return !vec || VerifyVectorOrString(
reinterpret_cast<const uint8_t *
>(vec),
sizeof(T));
2433 return VerifyVector(
reinterpret_cast<const Vector<T> *
>(vec));
2437 bool VerifyString(
const String *str)
const
2440 return !
str || (VerifyVectorOrString(
reinterpret_cast<const uint8_t *
>(str), 1, &end) &&
2442 Check(buf_[end] ==
'\0'));
2446 bool VerifyVectorOrString(
const uint8_t *vec,
size_t elem_size,
size_t *end =
nullptr)
const
2448 auto veco =
static_cast<size_t>(vec - buf_);
2450 if (!Verify<uoffset_t>(veco))
2454 auto size = ReadScalar<uoffset_t>(vec);
2455 auto max_elems = FLATBUFFERS_MAX_BUFFER_SIZE / elem_size;
2456 if (!Check(
size < max_elems))
2458 auto byte_size =
sizeof(
size) + elem_size *
size;
2460 *
end = veco + byte_size;
2461 return Verify(veco, byte_size);
2465 bool VerifyVectorOfStrings(
const Vector<Offset<String>> *vec)
const
2469 for (uoffset_t i = 0; i < vec->size(); i++)
2471 if (!VerifyString(vec->Get(i)))
2479 template <
typename T>
bool VerifyVectorOfTables(
const Vector<Offset<T>> *vec)
2483 for (uoffset_t i = 0; i < vec->size(); i++)
2485 if (!vec->Get(i)->Verify(*
this))
2492 __supress_ubsan__(
"unsigned-integer-overflow") bool VerifyTableStart(const uint8_t *table)
2495 auto tableo =
static_cast<size_t>(table - buf_);
2496 if (!Verify<soffset_t>(tableo))
2500 auto vtableo = tableo -
static_cast<size_t>(ReadScalar<soffset_t>(table));
2502 return VerifyComplexity() && Verify<voffset_t>(vtableo) &&
2503 VerifyAlignment<voffset_t>(ReadScalar<voffset_t>(buf_ + vtableo)) &&
2504 Verify(vtableo, ReadScalar<voffset_t>(buf_ + vtableo));
2507 template <
typename T>
bool VerifyBufferFromStart(
const char *identifier,
size_t start)
2509 if (identifier && !Check((size_ >= 2 *
sizeof(flatbuffers::uoffset_t) &&
2510 BufferHasIdentifier(buf_ + start, identifier))))
2516 auto o = VerifyOffset(start);
2517 return o &&
reinterpret_cast<const T *
>(buf_ + start + o)->
Verify(*
this)
2518#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
2519 && GetComputedSize()
2526 template <
typename T>
bool VerifyBuffer() {
return VerifyBuffer<T>(
nullptr); }
2528 template <
typename T>
bool VerifyBuffer(
const char *identifier)
2530 return VerifyBufferFromStart<T>(identifier, 0);
2533 template <
typename T>
bool VerifySizePrefixedBuffer(
const char *identifier)
2535 return Verify<uoffset_t>(0U) && ReadScalar<uoffset_t>(buf_) == size_ -
sizeof(uoffset_t) &&
2536 VerifyBufferFromStart<T>(identifier,
sizeof(uoffset_t));
2539 uoffset_t VerifyOffset(
size_t start)
const
2541 if (!Verify<uoffset_t>(start))
2543 auto o = ReadScalar<uoffset_t>(buf_ + start);
2548 if (!Check(
static_cast<soffset_t
>(o) >= 0))
2552 if (!
Verify(start + o, 1))
2557 uoffset_t VerifyOffset(
const uint8_t *base, voffset_t start)
const
2559 return VerifyOffset(
static_cast<size_t>(base - buf_) + start);
2566 bool VerifyComplexity()
2570 return Check(depth_ <= max_depth_ && num_tables_ <= max_tables_);
2581 size_t GetComputedSize()
const
2583#ifdef FLATBUFFERS_TRACK_VERIFIER_BUFFER_SIZE
2584 uintptr_t
size = upper_bound_;
2586 size = (
size - 1 +
sizeof(uoffset_t)) & ~(
sizeof(uoffset_t) - 1);
2598 const uint8_t *buf_;
2601 uoffset_t max_depth_;
2602 uoffset_t num_tables_;
2603 uoffset_t max_tables_;
2604 mutable size_t upper_bound_;
2605 bool check_alignment_;
2614template <
typename T>
struct BufferRef : BufferRefBase
2616 BufferRef() :
buf(nullptr), len(0), must_free(false) {}
2617 BufferRef(uint8_t *_buf, uoffset_t _len) :
buf(_buf), len(_len), must_free(false) {}
2625 const T *
GetRoot()
const {
return flatbuffers::GetRoot<T>(buf); }
2629 Verifier verifier(buf, len);
2630 return verifier.VerifyBuffer<T>(
nullptr);
2642class Struct FLATBUFFERS_FINAL_CLASS
2645 template <
typename T> T GetField(uoffset_t o)
const {
return ReadScalar<T>(&data_[o]); }
2647 template <
typename T> T GetStruct(uoffset_t o)
const {
return reinterpret_cast<T
>(&data_[o]); }
2649 const uint8_t *GetAddressOf(uoffset_t o)
const {
return &data_[o]; }
2650 uint8_t *GetAddressOf(uoffset_t o) {
return &data_[o]; }
2656 Struct(
const Struct &);
2657 Struct &operator=(
const Struct &);
2667 const uint8_t *GetVTable()
const {
return data_ - ReadScalar<soffset_t>(data_); }
2671 voffset_t GetOptionalFieldOffset(voffset_t field)
const
2674 auto vtable = GetVTable();
2676 auto vtsize = ReadScalar<voffset_t>(vtable);
2679 return field < vtsize ? ReadScalar<voffset_t>(vtable + field) : 0;
2682 template <
typename T> T GetField(voffset_t field, T defaultval)
const
2684 auto field_offset = GetOptionalFieldOffset(field);
2685 return field_offset ? ReadScalar<T>(data_ + field_offset) : defaultval;
2688 template <
typename P> P GetPointer(voffset_t field)
2690 auto field_offset = GetOptionalFieldOffset(field);
2691 auto p = data_ + field_offset;
2692 return field_offset ?
reinterpret_cast<P
>(
p + ReadScalar<uoffset_t>(
p)) : nullptr;
2694 template <
typename P> P GetPointer(voffset_t field)
const
2696 return const_cast<Table *
>(
this)->GetPointer<P>(field);
2699 template <
typename P> P GetStruct(voffset_t field)
const
2701 auto field_offset = GetOptionalFieldOffset(field);
2702 auto p =
const_cast<uint8_t *
>(data_ + field_offset);
2703 return field_offset ?
reinterpret_cast<P
>(
p) : nullptr;
2706 template <
typename Raw,
typename Face>
2707 flatbuffers::Optional<Face> GetOptional(voffset_t field)
const
2709 auto field_offset = GetOptionalFieldOffset(field);
2710 auto p = data_ + field_offset;
2711 return field_offset ? Optional<Face>(
static_cast<Face
>(ReadScalar<Raw>(
p))) : Optional<Face>();
2714 template <
typename T>
bool SetField(voffset_t field, T val, T def)
2716 auto field_offset = GetOptionalFieldOffset(field);
2719 WriteScalar(data_ + field_offset, val);
2722 template <
typename T>
bool SetField(voffset_t field, T val)
2724 auto field_offset = GetOptionalFieldOffset(field);
2727 WriteScalar(data_ + field_offset, val);
2731 bool SetPointer(voffset_t field,
const uint8_t *val)
2733 auto field_offset = GetOptionalFieldOffset(field);
2736 WriteScalar(data_ + field_offset,
static_cast<uoffset_t
>(val - (data_ + field_offset)));
2740 uint8_t *GetAddressOf(voffset_t field)
2742 auto field_offset = GetOptionalFieldOffset(field);
2743 return field_offset ? data_ + field_offset :
nullptr;
2745 const uint8_t *GetAddressOf(voffset_t field)
const
2747 return const_cast<Table *
>(
this)->GetAddressOf(field);
2750 bool CheckField(voffset_t field)
const {
return GetOptionalFieldOffset(field) != 0; }
2754 bool VerifyTableStart(Verifier &verifier)
const {
return verifier.VerifyTableStart(data_); }
2757 template <
typename T>
bool VerifyField(
const Verifier &verifier, voffset_t field)
const
2761 auto field_offset = GetOptionalFieldOffset(field);
2763 return !field_offset || verifier.Verify<T>(data_, field_offset);
2767 template <
typename T>
bool VerifyFieldRequired(
const Verifier &verifier, voffset_t field)
const
2769 auto field_offset = GetOptionalFieldOffset(field);
2770 return verifier.Check(field_offset != 0) && verifier.Verify<T>(data_, field_offset);
2774 bool VerifyOffset(
const Verifier &verifier, voffset_t field)
const
2776 auto field_offset = GetOptionalFieldOffset(field);
2777 return !field_offset || verifier.VerifyOffset(data_, field_offset);
2780 bool VerifyOffsetRequired(
const Verifier &verifier, voffset_t field)
const
2782 auto field_offset = GetOptionalFieldOffset(field);
2783 return verifier.Check(field_offset != 0) && verifier.VerifyOffset(data_, field_offset);
2790 Table(
const Table &other);
2791 Table &operator=(
const Table &);
2799inline flatbuffers::Optional<bool> Table::GetOptional<uint8_t, bool>(voffset_t field)
const
2801 auto field_offset = GetOptionalFieldOffset(field);
2802 auto p = data_ + field_offset;
2803 return field_offset ? Optional<bool>(ReadScalar<uint8_t>(
p) != 0) : Optional<bool>();
2806template <
typename T>
void FlatBufferBuilder::Required(Offset<T> table, voffset_t field)
2808 auto table_ptr =
reinterpret_cast<const Table *
>(
buf_.
data_at(table.o));
2809 bool ok = table_ptr->GetOptionalFieldOffset(field) != 0;
2819inline const uint8_t *GetBufferStartFromRootPointer(
const void *root)
2821 auto table =
reinterpret_cast<const Table *
>(
root);
2822 auto vtable = table->GetVTable();
2824 auto start = (std::min)(vtable,
reinterpret_cast<const uint8_t *
>(root));
2826 start =
reinterpret_cast<const uint8_t *
>(
reinterpret_cast<uintptr_t
>(start) &
2827 ~(
sizeof(uoffset_t) - 1));
2838 "file_identifier is assumed to be the same size as uoffset_t");
2839 for (
auto possible_roots = FLATBUFFERS_MAX_ALIGNMENT /
sizeof(uoffset_t) + 1; possible_roots;
2842 start -=
sizeof(uoffset_t);
2843 if (ReadScalar<uoffset_t>(start) + start ==
reinterpret_cast<const uint8_t *
>(
root))
2855inline uoffset_t GetPrefixedSize(
const uint8_t *buf) {
return ReadScalar<uoffset_t>(buf); }
2872typedef uint64_t hash_value_t;
2874#ifdef FLATBUFFERS_CPP98_STL
2875 typedef void (*resolver_function_t)(
void **pointer_adr, hash_value_t hash);
2876 typedef hash_value_t (*rehasher_function_t)(
void *pointer);
2878 typedef std::function<void (
void **pointer_adr, hash_value_t hash)>
2879 resolver_function_t;
2880 typedef std::function<hash_value_t (
void *pointer)> rehasher_function_t;
2891template <
typename T>
bool IsFieldPresent(
const T *table,
typename T::FlatBuffersVTableOffset field)
2894 return reinterpret_cast<const Table *
>(table)->CheckField(
static_cast<voffset_t
>(field));
2900inline int LookupEnum(
const char **names,
const char *name)
2902 for (
const char **
p = names; *
p;
p++)
2903 if (!strcmp(*
p, name))
2904 return static_cast<int>(
p - names);
2919#if defined(_MSC_VER)
2920 #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \
2922 struct __declspec(align(alignment))
2923 #define FLATBUFFERS_STRUCT_END(name, size) \
2925 static_assert(sizeof(name) == size, "compiler breaks packing rules")
2926#elif defined(__GNUC__) || defined(__clang__) || defined(__ICCARM__)
2927 #define FLATBUFFERS_MANUALLY_ALIGNED_STRUCT(alignment) \
2928 _Pragma("pack(1)") \
2929 struct __attribute__((aligned(alignment)))
2930 #define FLATBUFFERS_STRUCT_END(name, size) \
2932 static_assert(sizeof(name) == size, "compiler breaks packing rules")
2934 #error Unknown compiler, please define structure alignment macros
2958#define FLATBUFFERS_GEN_ELEMENTARY_TYPES(ET) \
2974enum ElementaryType {
2975 #define FLATBUFFERS_ET(E) E,
2976 FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)
2977 #undef FLATBUFFERS_ET
2980inline const char *
const *ElementaryTypeNames() {
2981 static const char *
const names[] = {
2982 #define FLATBUFFERS_ET(E) #E,
2983 FLATBUFFERS_GEN_ELEMENTARY_TYPES(FLATBUFFERS_ET)
2984 #undef FLATBUFFERS_ET
2997 unsigned short base_type : 4;
2999 unsigned short is_repeating : 1;
3001 signed short sequence_ref : 11;
3004static_assert(
sizeof(TypeCode) == 2,
"TypeCode");
3009typedef const TypeTable *(*TypeFunction)();
3015 const TypeCode *type_codes;
3016 const TypeFunction *type_refs;
3017 const int16_t *array_sizes;
3018 const int64_t *values;
3019 const char *
const *names;
3033#if !defined(_WIN32) && !defined(__CYGWIN__)
3035extern volatile __attribute__((weak))
const char *flatbuffer_version_string;
3036volatile __attribute__((weak))
const char *flatbuffer_version_string =
3038 FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MAJOR)
"."
3039 FLATBUFFERS_STRING(FLATBUFFERS_VERSION_MINOR)
"."
3040 FLATBUFFERS_STRING(FLATBUFFERS_VERSION_REVISION);
3044#define FLATBUFFERS_DEFINE_BITMASK_OPERATORS(E, T)\
3045 inline E operator | (E lhs, E rhs){\
3046 return E(T(lhs) | T(rhs));\
3048 inline E operator & (E lhs, E rhs){\
3049 return E(T(lhs) & T(rhs));\
3051 inline E operator ^ (E lhs, E rhs){\
3052 return E(T(lhs) ^ T(rhs));\
3054 inline E operator ~ (E lhs){\
3057 inline E operator |= (E &lhs, E rhs){\
3061 inline E operator &= (E &lhs, E rhs){\
3065 inline E operator ^= (E &lhs, E rhs){\
3069 inline bool operator !(E rhs) \
3071 return !bool(T(rhs)); \
#define FLATBUFFERS_ASSERT
virtual uint8_t * reallocate_downward(uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front)
virtual uint8_t * allocate(size_t size)=0
virtual void deallocate(uint8_t *p, size_t size)=0
void memcpy_downward(uint8_t *old_p, size_t old_size, uint8_t *new_p, size_t new_size, size_t in_use_back, size_t in_use_front)
const uint8_t * Data() const
return_type operator[](uoffset_t) const
const_reverse_iterator crbegin() const
void MutateImpl(flatbuffers::integral_constant< bool, false >, uoffset_t i, const T &val)
IndirectHelper< IndirectHelperType >::return_type return_type
const_iterator cend() const
void Mutate(uoffset_t i, const T &val)
const_reverse_iterator crend() const
VectorIterator< T, return_type > const_iterator
FLATBUFFERS_CONSTEXPR uint16_t size() const
void CopyFromSpan(flatbuffers::span< const T, length > src)
return_type Get(uoffset_t i) const
flatbuffers::conditional< scalar_tag::value, void, T * >::type GetMutablePointer(uoffset_t i) const
const_iterator end() const
void MutateImpl(flatbuffers::integral_constant< bool, true >, uoffset_t i, const T &val)
void CopyFromSpanImpl(flatbuffers::integral_constant< bool, true >, flatbuffers::span< const T, length > src)
E GetEnum(uoffset_t i) const
const_reverse_iterator rend() const
void CopyFromSpanImpl(flatbuffers::integral_constant< bool, false >, flatbuffers::span< const T, length > src)
const_iterator cbegin() const
return_type operator[](uoffset_t i) const
const uint8_t * Data() const
VectorReverseIterator< const_iterator > const_reverse_iterator
uint8_t data_[length *sizeof(T)]
const_reverse_iterator rbegin() const
const_iterator begin() const
static void dealloc(void *p, size_t)
void deallocate(uint8_t *p, size_t) FLATBUFFERS_OVERRIDE
uint8_t * allocate(size_t size) FLATBUFFERS_OVERRIDE
const uint8_t * data() const
FLATBUFFERS_DELETE_FUNC(DetachedBuffer &operator=(const DetachedBuffer &other))
DetachedBuffer & operator=(DetachedBuffer &&other)
DetachedBuffer(Allocator *allocator, bool own_allocator, uint8_t *buf, size_t reserved, uint8_t *cur, size_t sz)
DetachedBuffer(DetachedBuffer &&other)
FLATBUFFERS_DELETE_FUNC(DetachedBuffer(const DetachedBuffer &other))
Helper class to hold data needed in creation of a FlatBuffer. To serialize data, you typically call o...
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S > &v)
Serialize a std::vector of native structs into a FlatBuffer vector.
Offset< Vector< T > > CreateVector(const std::vector< T > &v)
Serialize a std::vector into a FlatBuffer vector.
void Finish(Offset< T > root, const char *file_identifier=nullptr)
Finish serializing a buffer by writing the root offset.
Offset< Vector< const T * > > CreateVectorOfSortedNativeStructs(std::vector< S > *v)
Serialize a std::vector of native structs into a FlatBuffer vector in sorted order.
Offset< Vector< const T * > > CreateVectorOfSortedStructs(std::vector< T > *v)
Serialize a std::vector of structs into a FlatBuffer vector in sorted order.
void ForceDefaults(bool fd)
In order to save space, fields that are set to their default value don't get serialized into the buff...
Offset< Vector< const T * > > CreateUninitializedVectorOfStructs(size_t len, T **buf)
Offset< String > CreateString(char *str)
Store a string in the buffer, which is null-terminated.
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.
void Finish(uoffset_t root, const char *file_identifier, bool size_prefix)
Offset< Vector< T > > CreateVectorScalarCast(const U *v, size_t len)
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...
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< String > CreateString(const std::string &str)
Store a string in the buffer, which can contain any binary data.
size_t GetBufferMinAlignment() const
get the minimum alignment this buffer needs to be accessed properly. This is only known once all elem...
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< String > CreateString(const char *str, size_t len)
Store a string in the buffer, which can contain any binary data.
Offset< Vector< Offset< T > > > CreateVectorOfSortedTables(std::vector< Offset< T > > *v)
Serialize an array of table offsets as a vector in the buffer in sorted order.
void Swap(FlatBufferBuilder &other)
DetachedBuffer Release()
Get the released DetachedBuffer.
FLATBUFFERS_ATTRIBUTE(deprecated("use Release() instead")) DetachedBuffer ReleaseBufferPointer()
Get the released pointer to the serialized buffer.
Offset< Vector< const T * > > CreateVectorOfStructs(const T *v, size_t len)
Serialize an array of structs into a FlatBuffer vector.
uoffset_t GetSize() const
The current size of the serialized buffer, counting from the end.
flatbuffers::span< uint8_t > GetBufferSpan() const
Get the serialized buffer (after you call Finish()) as a span.
uint8_t * ReleaseRaw(size_t &size, size_t &offset)
Get the released pointer to the serialized buffer.
Offset< Vector< const T * > > CreateVectorOfStructs(const std::vector< T, Alloc > &v)
Serialize a std::vector of structs into a FlatBuffer vector.
Offset< Vector< const T * > > CreateVectorOfSortedNativeStructs(S *v, size_t len)
Serialize an array of native structs into a FlatBuffer vector in sorted order.
uint8_t * GetBufferPointer() const
Get the serialized buffer (after you call Finish()).
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)....
FlatBufferBuilder(FlatBufferBuilder &&other)
Move constructor for FlatBufferBuilder.
Offset< Vector< const T * > > CreateVectorOfStructs(size_t vector_size, F f, S *state)
Serialize an array of structs into a FlatBuffer vector.
Offset< String > CreateString(const String *str)
Store a string in the buffer, which can contain any binary data.
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...
std::set< Offset< String >, StringOffsetCompare > StringOffsetMap
Offset< Vector< uint8_t > > CreateVector(const std::vector< bool > &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...
FlatBufferBuilder & operator=(FlatBufferBuilder &&other)
Move assignment operator for FlatBufferBuilder.
StringOffsetMap * string_pool
void DedupVtables(bool dedup)
By default vtables are deduped in order to save space.
FlatBufferBuilder(size_t initial_size=1024, Allocator *allocator=nullptr, bool own_allocator=false, size_t buffer_minalign=AlignOf< largest_scalar_t >())
Default constructor for FlatBufferBuilder.
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(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...
FlatBufferBuilder & operator=(const FlatBufferBuilder &)
Offset< Vector< Offset< String > > > CreateVectorOfStrings(const std::vector< std::string > &v)
Serialize a std::vector<std::string> into a FlatBuffer vector. This is a convenience function for a c...
Offset< Vector< T > > CreateVector(const T *v, size_t len)
Serialize an array into a FlatBuffer vector.
Offset< String > CreateString(const T &str)
Store a string in the buffer, which can contain any binary data.
uoffset_t CreateUninitializedVector(size_t len, size_t elemsize, uint8_t **buf)
Specialized version of CreateVector for non-copying use cases. Write the data any time later to the r...
void SwapBufAllocator(FlatBufferBuilder &other)
uint8_t * GetCurrentBufferPointer() const
Get a pointer to an unfinished buffer.
FlatBufferBuilder(const FlatBufferBuilder &)
Offset< Vector< Offset< T > > > CreateVector(const Offset< T > *v, size_t len)
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< 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< T > > > CreateVectorOfSortedTables(Offset< T > *v, size_t len)
Serialize an array of table offsets as a vector in the buffer in sorted order.
void Clear()
Reset all the state in this FlatBufferBuilder so it can be reused to construct another buffer.
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const std::vector< S > &v, T((*const pack_func)(const S &)))
Serialize a std::vector of native structs into a FlatBuffer vector.
Offset< Vector< const T * > > CreateVectorOfNativeStructs(const S *v, size_t len)
Serialize an array of native structs into a FlatBuffer vector.
static const size_t kFileIdentifierLength
The length of a FlatBuffer file header.
Offset< const T * > CreateStruct(const T &structobj)
Write a struct by itself, typically to be part of a union.
Offset< String > CreateString(const char *str)
Store a string in the buffer, which is null-terminated.
const String * GetAsString(uoffset_t i) const
return_type Get(uoffset_t i) const
VectorIterator< T, typename IndirectHelper< T >::mutable_return_type > iterator
const_reverse_iterator crend() const
FLATBUFFERS_ATTRIBUTE(deprecated("use size() instead")) uoffset_t Length() const
const_reverse_iterator rbegin() const
E GetEnum(uoffset_t i) const
IndirectHelper< T >::return_type return_type
void MutateOffset(uoffset_t i, const uint8_t *val)
const void * GetStructFromOffset(size_t o) const
const_reverse_iterator crbegin() const
const_reverse_iterator rend() const
VectorIterator< T, typename IndirectHelper< T >::return_type > const_iterator
IndirectHelper< T >::mutable_return_type mutable_return_type
const uint8_t * Data() const
void Mutate(uoffset_t i, const T &val)
reverse_iterator rbegin()
const_iterator end() const
const_iterator cbegin() const
return_type LookupByKey(K key) const
return_type operator[](uoffset_t i) const
const_iterator begin() const
mutable_return_type GetMutableObject(uoffset_t i) const
const U * GetAs(uoffset_t i) const
VectorReverseIterator< iterator > reverse_iterator
const_iterator cend() const
VectorReverseIterator< const_iterator > const_reverse_iterator
const uint8_t * Data() const
uint8_t * release_raw(size_t &allocated_bytes, size_t &offset)
void swap_allocator(vector_downward &other)
uint8_t * data_at(size_t offset) const
void swap(vector_downward &other)
void pop(size_t bytes_to_remove)
void push_small(const T &little_endian_t)
uoffset_t scratch_size() const
void scratch_push_small(const T &t)
vector_downward(vector_downward &&other)
size_t ensure_space(size_t len)
uint8_t * scratch_data() const
void fill(size_t zero_pad_bytes)
vector_downward & operator=(vector_downward &&other)
void push(const uint8_t *bytes, size_t num)
vector_downward(size_t initial_size, Allocator *allocator, bool own_allocator, size_t buffer_minalign)
void scratch_pop(size_t bytes_to_remove)
void fill_big(size_t zero_pad_bytes)
uint8_t * scratch_end() const
uint8_t * make_space(size_t len)
Allocator * get_custom_allocator()
__global uchar * offset(const Image *img, int x, int y)
uint64_t num_elems(const nnfw_tensorinfo *ti)
Op * root(Op *)
Return the root Op from a given Op node.
bool IsOutRange(const T &v, const T &low, const T &high)
uint8_t * ReallocateDownward(Allocator *allocator, uint8_t *old_p, size_t old_size, size_t new_size, size_t in_use_back, size_t in_use_front)
Array< E, length > & CastToArrayOfEnum(T(&arr)[length])
int64_t LookupEnum(int64_t enum_val, const int64_t *values, size_t num_values)
bool Verify(const reflection::Schema &schema, const reflection::Object &root, const uint8_t *buf, size_t length, uoffset_t max_depth=64, uoffset_t max_tables=1000000)
bool SetField(Table *table, const reflection::Field &field, T val)
__supress_ubsan__("float-cast-overflow") inline void strtoval_impl(float *val
FLATBUFFERS_CONSTEXPR size_t AlignOf()
Vector< Offset< T > > * VectorCast(Vector< Offset< U > > *ptr)
void Deallocate(Allocator *allocator, uint8_t *p, size_t size)
voffset_t FieldIndexToOffset(voffset_t field_id)
bool IsTheSameAs(T e, T def)
Array< T, length > & CastToArray(T(&arr)[length])
const T * data(const std::vector< T, Alloc > &v)
uint8_t * Allocate(Allocator *allocator, size_t size)
bool IsInRange(const T &v, const T &low, const T &high)
Reference GetRoot(const uint8_t *buffer, size_t size)
ShapeIterator end(const Shape &s)
struct __attribute__((packed)) Header
StringOffsetCompare(const vector_downward &buf)
bool operator()(const Offset< String > &a, const Offset< String > &b) const
const vector_downward * buf_
static return_type Read(const uint8_t *p, uoffset_t i)
static return_type Read(const uint8_t *p, uoffset_t i)
static const size_t element_stride
static return_type Read(const uint8_t *p, uoffset_t i)
Offset< void > Union() const
bool operator<(const String &o) const
const char * c_str() const
ptrdiff_t difference_type
bool operator!=(const VectorIterator &other) const
VectorIterator operator--(int)
VectorIterator & operator-=(const uoffset_t &offset)
VectorIterator & operator--()
bool operator<(const VectorIterator &other) const
VectorIterator(const uint8_t *data, uoffset_t i)
VectorIterator operator++(int)
VectorIterator & operator+=(const uoffset_t &offset)
VectorIterator & operator++()
VectorIterator(const VectorIterator &other)
difference_type operator-(const VectorIterator &other) const
VectorIterator & operator=(const VectorIterator &other)
VectorIterator operator-(const uoffset_t &offset) const
bool operator==(const VectorIterator &other) const
std::random_access_iterator_tag iterator_category
VectorIterator & operator=(VectorIterator &&other)
VectorIterator operator+(const uoffset_t &offset) const
Iterator::value_type operator*() const
VectorReverseIterator(Iterator iter)
Iterator::value_type operator->() const