Skip to content

Commit 2eb39fa

Browse files
committed
Updated flatbuffers.
1 parent b912869 commit 2eb39fa

File tree

7 files changed

+173
-44
lines changed

7 files changed

+173
-44
lines changed

Shared/external/flatbuffers/array.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@ class Array {
3939
typedef VectorConstIterator<T, return_type, uoffset_t> const_iterator;
4040
typedef VectorReverseIterator<const_iterator> const_reverse_iterator;
4141

42-
// If T is a LE-scalar or a struct (!scalar_tag::value).
42+
// If T is a non-pointer and a LE-scalar or a struct (!scalar_tag::value).
4343
static FLATBUFFERS_CONSTEXPR bool is_span_observable =
44-
(scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1)) ||
45-
!scalar_tag::value;
44+
!std::is_pointer<T>::value &&
45+
((scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1)) ||
46+
!scalar_tag::value);
4647

4748
FLATBUFFERS_CONSTEXPR uint16_t size() const { return length; }
4849

Shared/external/flatbuffers/base.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,8 +140,8 @@
140140
#endif // !defined(FLATBUFFERS_LITTLEENDIAN)
141141

142142
#define FLATBUFFERS_VERSION_MAJOR 25
143-
#define FLATBUFFERS_VERSION_MINOR 9
144-
#define FLATBUFFERS_VERSION_REVISION 23
143+
#define FLATBUFFERS_VERSION_MINOR 12
144+
#define FLATBUFFERS_VERSION_REVISION 19
145145
#define FLATBUFFERS_STRING_EXPAND(X) #X
146146
#define FLATBUFFERS_STRING(X) FLATBUFFERS_STRING_EXPAND(X)
147147
namespace flatbuffers {
@@ -267,11 +267,11 @@ namespace flatbuffers {
267267

268268
#ifndef FLATBUFFERS_LOCALE_INDEPENDENT
269269
// Enable locale independent functions {strtof_l, strtod_l,strtoll_l,
270-
// strtoull_l}.
270+
// strtoull_l} on platforms that support them.
271271
#if (defined(_MSC_VER) && _MSC_VER >= 1800) || \
272-
(defined(__ANDROID_API__) && __ANDROID_API__>= 21) || \
272+
(defined(__ANDROID__) && defined(__ANDROID_API__) && __ANDROID_API__>= 26) || \
273273
(defined(_XOPEN_VERSION) && (_XOPEN_VERSION >= 700)) && \
274-
(!defined(__Fuchsia__) && !defined(__ANDROID_API__))
274+
!defined(__Fuchsia__)
275275
#define FLATBUFFERS_LOCALE_INDEPENDENT 1
276276
#else
277277
#define FLATBUFFERS_LOCALE_INDEPENDENT 0

Shared/external/flatbuffers/flatbuffer_builder.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,8 @@ class FlatBufferBuilderImpl {
470470
for (auto it = buf_.scratch_data(); it < buf_.scratch_end();
471471
it += sizeof(uoffset_t)) {
472472
auto vt_offset_ptr = reinterpret_cast<uoffset_t*>(it);
473-
auto vt2 = reinterpret_cast<voffset_t*>(buf_.data_at(*vt_offset_ptr));
473+
auto vt2 = reinterpret_cast<voffset_t*>(
474+
buf_.data_at(*vt_offset_ptr + length_of_64_bit_region_));
474475
auto vt2_size = ReadScalar<voffset_t>(vt2);
475476
if (vt1_size != vt2_size || 0 != memcmp(vt2, vt1, vt1_size)) continue;
476477
vt_use = *vt_offset_ptr;
@@ -834,6 +835,16 @@ class FlatBufferBuilderImpl {
834835
return Offset<Vector<uint8_t>>(EndVector(v.size()));
835836
}
836837

838+
Offset64<Vector64<uint8_t>> CreateVector64(const std::vector<bool>& v) {
839+
StartVector<uint8_t, Offset64, Vector64<uint8_t>::size_type>(v.size());
840+
for (auto i = v.size(); i > 0;) {
841+
PushElement(static_cast<uint8_t>(v[--i]));
842+
}
843+
return Offset64<Vector64<uint8_t>>(
844+
EndVector<Vector64<uint8_t>::size_type,
845+
Offset64<Vector64<uint8_t>>::offset_type>(v.size()));
846+
}
847+
837848
/// @brief Serialize values returned by a function into a FlatBuffer `vector`.
838849
/// This is a convenience function that takes care of iteration for you.
839850
/// @tparam T The data type of the `std::vector` elements.

Shared/external/flatbuffers/stl_emulation.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@
4747
// See: https://en.cppreference.com/w/cpp/utility/feature_test
4848
#if defined(__cplusplus) && __cplusplus >= 202002L \
4949
|| (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L)
50-
#define FLATBUFFERS_USE_STD_SPAN 1
50+
#if __has_include(<span>)
51+
#define FLATBUFFERS_USE_STD_SPAN 1
52+
#endif
5153
#endif
5254
#endif // FLATBUFFERS_USE_STD_SPAN
5355

@@ -321,7 +323,7 @@ namespace internal {
321323
SpanIterator(pointer ptr) : ptr_(ptr) {}
322324
reference operator*() const { return *ptr_; }
323325
pointer operator->() { return ptr_; }
324-
SpanIterator& operator++() { ptr_++; return *this; }
326+
SpanIterator& operator++() { ptr_++; return *this; }
325327
SpanIterator operator++(int) { auto tmp = *this; ++(*this); return tmp; }
326328

327329
friend bool operator== (const SpanIterator& lhs, const SpanIterator& rhs) { return lhs.ptr_ == rhs.ptr_; }

Shared/external/flatbuffers/table.h

Lines changed: 84 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#define FLATBUFFERS_TABLE_H_
1919

2020
#include "flatbuffers/base.h"
21+
#include "flatbuffers/vector.h"
2122
#include "flatbuffers/verifier.h"
2223

2324
namespace flatbuffers {
@@ -70,6 +71,32 @@ class Table {
7071
return GetPointer<P, uoffset64_t>(field);
7172
}
7273

74+
template <typename P, typename SizeT = uoffset_t,
75+
typename OffsetSize = uoffset_t>
76+
const Vector<P, SizeT>* GetVectorPointerOrEmpty(voffset_t field) const {
77+
auto* ptr = GetPointer<const Vector<P, SizeT>*, OffsetSize>(field);
78+
return ptr ? ptr : EmptyVector<P, SizeT>();
79+
}
80+
81+
template <typename P, typename SizeT = uoffset_t>
82+
const Vector<P, SizeT>* GetVectorPointer64OrEmpty(voffset_t field) const {
83+
return GetVectorPointerOrEmpty<P, SizeT, uoffset64_t>(field);
84+
}
85+
86+
template <typename P, typename SizeT = uoffset_t,
87+
typename OffsetSize = uoffset_t>
88+
Vector<P, SizeT>* GetMutableVectorPointerOrEmpty(voffset_t field) {
89+
auto* ptr = GetPointer<Vector<P, SizeT>*, OffsetSize>(field);
90+
// This is a const_cast, but safe, since all mutable operations on an
91+
// empty vector are NOPs.
92+
return ptr ? ptr : const_cast<Vector<P, SizeT>*>(EmptyVector<P, SizeT>());
93+
}
94+
95+
template <typename P, typename SizeT = uoffset_t>
96+
Vector<P, SizeT>* GetMutableVectorPointer64OrEmpty(voffset_t field) {
97+
return GetMutableVectorPointerOrEmpty<P, SizeT, uoffset64_t>(field);
98+
}
99+
73100
template <typename P>
74101
P GetStruct(voffset_t field) const {
75102
auto field_offset = GetOptionalFieldOffset(field);
@@ -122,52 +149,94 @@ class Table {
122149

123150
// Verify the vtable of this table.
124151
// Call this once per table, followed by VerifyField once per field.
125-
bool VerifyTableStart(Verifier& verifier) const {
152+
template <bool B>
153+
bool VerifyTableStart(VerifierTemplate<B>& verifier) const {
126154
return verifier.VerifyTableStart(data_);
127155
}
128156

129157
// Verify a particular field.
130-
template <typename T>
131-
bool VerifyField(const Verifier& verifier, voffset_t field,
158+
template <typename T, bool B>
159+
bool VerifyField(const VerifierTemplate<B>& verifier, voffset_t field,
132160
size_t align) const {
133161
// Calling GetOptionalFieldOffset should be safe now thanks to
134162
// VerifyTable().
135163
auto field_offset = GetOptionalFieldOffset(field);
136164
// Check the actual field.
137-
return !field_offset || verifier.VerifyField<T>(data_, field_offset, align);
165+
return !field_offset ||
166+
verifier.template VerifyField<T>(data_, field_offset, align);
138167
}
139168

140169
// VerifyField for required fields.
141-
template <typename T>
142-
bool VerifyFieldRequired(const Verifier& verifier, voffset_t field,
170+
template <typename T, bool B>
171+
bool VerifyFieldRequired(const VerifierTemplate<B>& verifier, voffset_t field,
143172
size_t align) const {
144173
auto field_offset = GetOptionalFieldOffset(field);
145174
return verifier.Check(field_offset != 0) &&
146-
verifier.VerifyField<T>(data_, field_offset, align);
175+
verifier.template VerifyField<T>(data_, field_offset, align);
147176
}
148177

149178
// Versions for offsets.
150-
template <typename OffsetT = uoffset_t>
151-
bool VerifyOffset(const Verifier& verifier, voffset_t field) const {
179+
template <typename OffsetT = uoffset_t, bool B = false>
180+
bool VerifyOffset(const VerifierTemplate<B>& verifier,
181+
voffset_t field) const {
152182
auto field_offset = GetOptionalFieldOffset(field);
153-
return !field_offset || verifier.VerifyOffset<OffsetT>(data_, field_offset);
183+
return !field_offset ||
184+
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
154185
}
155186

156-
template <typename OffsetT = uoffset_t>
157-
bool VerifyOffsetRequired(const Verifier& verifier, voffset_t field) const {
187+
template <typename OffsetT = uoffset_t, bool B = false>
188+
bool VerifyOffsetRequired(const VerifierTemplate<B>& verifier,
189+
voffset_t field) const {
158190
auto field_offset = GetOptionalFieldOffset(field);
159191
return verifier.Check(field_offset != 0) &&
160-
verifier.VerifyOffset<OffsetT>(data_, field_offset);
192+
verifier.template VerifyOffset<OffsetT>(data_, field_offset);
161193
}
162194

163-
bool VerifyOffset64(const Verifier& verifier, voffset_t field) const {
195+
template <bool B>
196+
bool VerifyOffset64(const VerifierTemplate<B>& verifier,
197+
voffset_t field) const {
164198
return VerifyOffset<uoffset64_t>(verifier, field);
165199
}
166200

167-
bool VerifyOffset64Required(const Verifier& verifier, voffset_t field) const {
201+
template <bool B>
202+
bool VerifyOffset64Required(const VerifierTemplate<B>& verifier,
203+
voffset_t field) const {
168204
return VerifyOffsetRequired<uoffset64_t>(verifier, field);
169205
}
170206

207+
// Verify a string that may have a default value.
208+
template <typename OffsetT = uoffset_t>
209+
bool VerifyStringWithDefault(const Verifier& verifier,
210+
voffset_t field) const {
211+
auto field_offset = GetOptionalFieldOffset(field);
212+
return field_offset == 0 ||
213+
verifier.VerifyString(GetPointer<const String*, OffsetT>(field));
214+
}
215+
216+
// Verify a vector that has a default empty value.
217+
template <typename P, typename SizeT = uoffset_t,
218+
typename OffsetSize = uoffset_t>
219+
bool VerifyVectorWithDefault(const Verifier& verifier,
220+
voffset_t field) const {
221+
auto field_offset = GetOptionalFieldOffset(field);
222+
return field_offset == 0 ||
223+
verifier.VerifyVector(
224+
GetPointer<const Vector<P, SizeT>*, OffsetSize>(field));
225+
}
226+
227+
template <typename P, typename SizeT = uoffset_t>
228+
bool VerifyVector64WithDefault(const Verifier& verifier,
229+
voffset_t field) const {
230+
return VerifyVectorWithDefault<P, SizeT, uoffset64_t>(verifier, field);
231+
}
232+
233+
protected:
234+
template <typename T, typename SizeT = uoffset_t>
235+
static const Vector<T, SizeT>* EmptyVector() {
236+
static const SizeT empty_vector_length = 0;
237+
return reinterpret_cast<const Vector<T, SizeT>*>(&empty_vector_length);
238+
}
239+
171240
private:
172241
// private constructor & copy constructor: you obtain instances of this
173242
// class by pointing to existing data only

Shared/external/flatbuffers/vector.h

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ class Vector {
172172
scalar_tag;
173173

174174
static FLATBUFFERS_CONSTEXPR bool is_span_observable =
175-
scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1);
175+
scalar_tag::value && !std::is_pointer<T>::value &&
176+
(FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1);
176177

177178
SizeT size() const { return EndianScalar(length_); }
178179

@@ -359,6 +360,22 @@ FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const uint8_t> make_bytes_span(
359360
return span<const uint8_t>(vec.Data(), vec.size() * sizeof(U));
360361
}
361362

363+
#if FLATBUFFERS_LITTLEENDIAN
364+
365+
template <class U>
366+
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(
367+
Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {
368+
return span<U>(reinterpret_cast<U*>(vec.data()), vec.size());
369+
}
370+
371+
template <class U>
372+
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(
373+
const Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {
374+
return span<const U>(reinterpret_cast<const U*>(vec.data()), vec.size());
375+
}
376+
377+
#endif
378+
362379
// Convenient helper functions to get a span of any vector, regardless
363380
// of whether it is null or not (the field is not set).
364381
template <class U>
@@ -377,6 +394,22 @@ FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_span(
377394
return ptr ? make_span(*ptr) : span<const U>();
378395
}
379396

397+
#if FLATBUFFERS_LITTLEENDIAN
398+
399+
template <class U>
400+
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(
401+
Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {
402+
return ptr ? make_span(*ptr) : span<U>();
403+
}
404+
405+
template <class U>
406+
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(
407+
const Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {
408+
return ptr ? make_span(*ptr) : span<const U>();
409+
}
410+
411+
#endif
412+
380413
// Represent a vector much like the template above, but in this case we
381414
// don't know what the element types are (used with reflection.h).
382415
class VectorOfAny {

0 commit comments

Comments
 (0)