Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions include/flatbuffers/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,11 @@ class Array {
typedef VectorConstIterator<T, return_type, uoffset_t> const_iterator;
typedef VectorReverseIterator<const_iterator> const_reverse_iterator;

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

FLATBUFFERS_CONSTEXPR uint16_t size() const { return length; }

Expand Down
36 changes: 35 additions & 1 deletion include/flatbuffers/vector.h
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,8 @@ class Vector {
scalar_tag;

static FLATBUFFERS_CONSTEXPR bool is_span_observable =
scalar_tag::value && (FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1);
scalar_tag::value && !std::is_pointer<T>::value &&
(FLATBUFFERS_LITTLEENDIAN || sizeof(T) == 1);

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

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

#if FLATBUFFERS_LITTLEENDIAN

template <class U>
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(
Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {
return span<U>(reinterpret_cast<U*>(vec.data()), vec.size());
}

template <class U>
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(
const Vector<const U*>& vec) FLATBUFFERS_NOEXCEPT {
return span<const U>(reinterpret_cast<const U*>(vec.data()), vec.size());
}

#endif

// Convenient helper functions to get a span of any vector, regardless
// of whether it is null or not (the field is not set).
template <class U>
Expand All @@ -377,6 +394,23 @@ FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_span(
return ptr ? make_span(*ptr) : span<const U>();
}

#if FLATBUFFERS_LITTLEENDIAN

template <class U>
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<U> make_structs_span(
Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {
return ptr ? make_span(*ptr) : span<U>();
}

template <class U>
FLATBUFFERS_CONSTEXPR_CPP11 flatbuffers::span<const U> make_structs_span(
const Vector<const U*>* ptr) FLATBUFFERS_NOEXCEPT {
return ptr ? make_span(*ptr) : span<const U>();
}

#endif


// Represent a vector much like the template above, but in this case we
// don't know what the element types are (used with reflection.h).
class VectorOfAny {
Expand Down
Loading