17#ifndef FLATBUFFERS_VECTOR_H_
18#define FLATBUFFERS_VECTOR_H_
30template<
typename T,
typename IT,
typename Data = uint8_t *,
31 typename SizeT = uoffset_t>
56 return data_ == other.data_;
60 return data_ < other.data_;
64 return data_ != other.data_;
73 IT
operator*()
const {
return IndirectHelper<T>::Read(data_, 0); }
77 IT
operator->()
const {
return IndirectHelper<T>::Read(data_, 0); }
123template<
typename T,
typename IT,
typename SizeT = uoffset_t>
126template<
typename Iterator>
129 :
std::reverse_iterator<Iterator>(iter) {}
134 auto tmp = std::reverse_iterator<Iterator>::current;
141 auto tmp = std::reverse_iterator<Iterator>::current;
148template<
typename T,
typename SizeT = uoffset_t>
class Vector {
162 scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN ||
sizeof(T) == 1);
168 SizeT Length()
const {
return size(); }
177 return IndirectHelper<T>::Read(
Data(), i);
185 template<
typename E> E
GetEnum(SizeT i)
const {
186 return static_cast<E
>(
Get(i));
191 template<
typename U>
const U *
GetAs(SizeT i)
const {
192 return reinterpret_cast<const U *
>(
Get(i));
198 return reinterpret_cast<const String *
>(
Get(i));
202 return reinterpret_cast<const void *
>(
Data() + o);
233 WriteScalar(
data() + i, val);
241 static_assert(
sizeof(T) ==
sizeof(SizeT),
"Unrelated types");
242 WriteScalar(
data() + i,
243 static_cast<SizeT
>(val - (
Data() + i *
sizeof(SizeT))));
254 return reinterpret_cast<const uint8_t *
>(&
length_ + 1);
257 uint8_t *
Data() {
return reinterpret_cast<uint8_t *
>(&
length_ + 1); }
260 const T *
data()
const {
return reinterpret_cast<const T *
>(
Data()); }
261 T *
data() {
return reinterpret_cast<T *
>(
Data()); }
264 void *search_result = std::bsearch(
265 &key,
Data(),
size(), IndirectHelper<T>::element_stride, KeyCompare<K>);
267 if (!search_result) {
271 const uint8_t *element =
reinterpret_cast<const uint8_t *
>(search_result);
273 return IndirectHelper<T>::Read(element, 0);
293 template<
typename K>
static int KeyCompare(
const void *ap,
const void *bp) {
294 const K *key =
reinterpret_cast<const K *
>(ap);
295 const uint8_t *
data =
reinterpret_cast<const uint8_t *
>(bp);
296 auto table = IndirectHelper<T>::Read(
data, 0);
300 return -table->KeyCompareWithValue(*key);
308 FLATBUFFERS_NOEXCEPT {
310 "wrong type U, only LE-scalar, or byte types are allowed");
311 return span<U>(vec.data(), vec.size());
315FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U>
make_span(
316 const Vector<U> &vec) FLATBUFFERS_NOEXCEPT {
318 "wrong type U, only LE-scalar, or byte types are allowed");
319 return span<const U>(vec.data(), vec.size());
326 "wrong type U, only LE-scalar, or byte types are allowed");
327 return span<uint8_t>(vec.Data(), vec.size() *
sizeof(U));
332 const Vector<U> &vec) FLATBUFFERS_NOEXCEPT {
334 "wrong type U, only LE-scalar, or byte types are allowed");
335 return span<const uint8_t>(vec.Data(), vec.size() *
sizeof(U));
342 FLATBUFFERS_NOEXCEPT {
344 "wrong type U, only LE-scalar, or byte types are allowed");
345 return ptr ?
make_span(*ptr) : span<U>();
349FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U>
make_span(
350 const Vector<U> *ptr) FLATBUFFERS_NOEXCEPT {
352 "wrong type U, only LE-scalar, or byte types are allowed");
353 return ptr ?
make_span(*ptr) : span<const U>();
363 return reinterpret_cast<const uint8_t *
>(&
length_ + 1);
365 uint8_t *
Data() {
return reinterpret_cast<uint8_t *
>(&
length_ + 1); }
377template<
typename T,
typename U>
379 static_assert(std::is_base_of<T, U>::value,
"Unrelated types");
383template<
typename T,
typename U>
385 static_assert(std::is_base_of<T, U>::value,
"Unrelated types");
391template<
typename T>
static inline size_t VectorLength(
const Vector<T> *v) {
392 return v ? v->size() : 0;
#define FLATBUFFERS_ASSERT
const String * GetAsString(SizeT i) const
const_iterator cbegin() const
const void * GetStructFromOffset(size_t o) const
const_iterator end() const
mutable_return_type MutableLookupByKey(K key)
VectorIterator< T, typename IndirectHelper< T >::mutable_return_type, uint8_t *, SizeT > iterator
return_type LookupByKey(K key) const
return_type operator[](SizeT i) const
IndirectHelper< T >::return_type return_type
void Mutate(SizeT i, const T &val)
VectorReverseIterator< const_iterator > const_reverse_iterator
const_reverse_iterator crbegin() const
const U * GetAs(SizeT i) const
return_type Get(SizeT i) const
static FLATBUFFERS_CONSTEXPR bool is_span_observable
const_reverse_iterator rbegin() const
flatbuffers::bool_constant< flatbuffers::is_scalar< T >::value > scalar_tag
const uint8_t * Data() const
void MutateOffset(SizeT i, const uint8_t *val)
const_iterator cend() const
VectorReverseIterator< iterator > reverse_iterator
IndirectHelper< T >::mutable_return_type mutable_return_type
const_reverse_iterator crend() const
reverse_iterator rbegin()
const_iterator begin() const
const_reverse_iterator rend() const
VectorConstIterator< T, typename IndirectHelper< T >::return_type, SizeT > const_iterator
FLATBUFFERS_ATTRIBUTE() SizeT Length() const
mutable_return_type GetMutableObject(SizeT i) const
const uint8_t * Data() const
__global uchar * offset(const Image *img, int x, int y)
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
Vector< Offset< T > > * VectorCast(Vector< Offset< U > > *ptr)
const T * data(const std::vector< T, Alloc > &v)
std::vector< uint8_t > Data
bool operator<(const VectorIterator &other) const
VectorIterator operator++(int)
VectorIterator & operator-=(const SizeT &offset)
ptrdiff_t difference_type
std::random_access_iterator_tag iterator_category
VectorIterator & operator++()
VectorIterator & operator--()
VectorIterator operator-(const SizeT &offset) const
VectorIterator operator--(int)
VectorIterator operator+(const SizeT &offset) const
VectorIterator & operator+=(const SizeT &offset)
VectorIterator(Data data, SizeT i)
difference_type operator-(const VectorIterator &other) const
bool operator==(const VectorIterator &other) const
static const SizeT element_stride
VectorIterator & operator=(VectorIterator &&other)
bool operator!=(const VectorIterator &other) const
VectorIterator(const VectorIterator &other)
VectorIterator & operator=(const VectorIterator &other)
Iterator::value_type operator*() const
VectorReverseIterator(Iterator iter)
Iterator::value_type operator->() const