17#ifndef FLATBUFFERS_ARRAY_H_
18#define FLATBUFFERS_ARRAY_H_
30template<
typename T, u
int16_t length>
class Array {
40 typedef typename IndirectHelper<IndirectHelperType>::return_type
return_type;
46 (scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN ||
sizeof(T) == 1)) ||
49 FLATBUFFERS_CONSTEXPR uint16_t
size()
const {
return length; }
53 return IndirectHelper<IndirectHelperType>::Read(
Data(), i);
61 template<
typename E> E
GetEnum(uoffset_t i)
const {
62 return static_cast<E
>(
Get(i));
89 return const_cast<T *
>(&
data()[i]);
101 const T *
data()
const {
return reinterpret_cast<const T *
>(
Data()); }
102 T *
data() {
return reinterpret_cast<T *
>(
Data()); }
107 const auto p1 =
reinterpret_cast<const uint8_t *
>(src.data());
108 const auto p2 =
Data();
110 !(p2 >= p1 && p2 < (p1 + length)));
119 WriteScalar(
data() + i, val);
127 flatbuffers::span<const T, length> src) {
131 std::memcpy(
data(), src.data(), length *
sizeof(T));
136 flatbuffers::span<const T, length> src) {
145#if defined(__cpp_constexpr)
162template<
typename T, u
int16_t length,
template<
typename>
class OffsetT>
187template<
class U, u
int16_t N>
189 FLATBUFFERS_NOEXCEPT {
192 "wrong type U, only plain struct, LE-scalar, or byte types are allowed");
193 return span<U, N>(arr.data(), N);
196template<
class U, u
int16_t N>
197FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U, N>
make_span(
201 "wrong type U, only plain struct, LE-scalar, or byte types are allowed");
202 return span<const U, N>(arr.data(), N);
205template<
class U, u
int16_t N>
206FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<uint8_t,
sizeof(U) * N>
209 "internal error, Array<T> might hold only scalars or structs");
210 return span<uint8_t, sizeof(U) * N>(arr.Data(),
sizeof(U) * N);
213template<
class U, u
int16_t N>
214FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<
const uint8_t,
sizeof(U) * N>
217 "internal error, Array<T> might hold only scalars or structs");
218 return span<const uint8_t, sizeof(U) * N>(arr.Data(),
sizeof(U) * N);
224template<
typename T, u
int16_t length>
229template<
typename T, u
int16_t length>
234template<
typename E,
typename T, u
int16_t length>
236 static_assert(
sizeof(E) ==
sizeof(T),
"invalid enum type E");
240template<
typename E,
typename T, u
int16_t length>
242 static_assert(
sizeof(E) ==
sizeof(T),
"invalid enum type E");
246template<
typename T, u
int16_t length>
249 return std::addressof(lhs) == std::addressof(rhs) ||
250 (lhs.size() == rhs.size() &&
251 std::memcmp(lhs.Data(), rhs.Data(), rhs.size() *
sizeof(T)) == 0);
#define FLATBUFFERS_ASSERT
return_type operator[](uoffset_t) const
const uint8_t * Data() const
const_reverse_iterator crbegin() const
IndirectHelper< IndirectHelperType >::return_type return_type
const_iterator cend() const
void Mutate(uoffset_t i, const T &val)
const_reverse_iterator crend() const
FLATBUFFERS_CONSTEXPR uint16_t size() const
void CopyFromSpan(flatbuffers::span< const T, length > src)
return_type Get(uoffset_t i) const
void CopyFromSpanImpl(flatbuffers::true_type, flatbuffers::span< const T, length > src)
flatbuffers::conditional< scalar_tag::value, void, T * >::type GetMutablePointer(uoffset_t i) const
const_iterator end() const
static FLATBUFFERS_CONSTEXPR bool is_span_observable
void MutateImpl(flatbuffers::true_type, uoffset_t i, const T &val)
E GetEnum(uoffset_t i) const
const_reverse_iterator rend() const
void CopyFromSpanImpl(flatbuffers::false_type, 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)]
VectorConstIterator< T, return_type, uoffset_t > const_iterator
void MutateImpl(flatbuffers::false_type, uoffset_t i, const T &val)
const_reverse_iterator rbegin() const
const_iterator begin() const
Array< E, length > & CastToArrayOfEnum(T(&arr)[length])
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span< U, N > make_span(Array< U, N > &arr) FLATBUFFERS_NOEXCEPT
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span< uint8_t, sizeof(U) *N > make_bytes_span(Array< U, N > &arr) FLATBUFFERS_NOEXCEPT
bool operator==(const Array< T, length > &lhs, const Array< T, length > &rhs) noexcept
Array< T, length > & CastToArray(T(&arr)[length])