constexpr T* data() noexcept { return begin_; }
constexpr const T* data() const noexcept { return begin_; }
constexpr std::size_t size() const noexcept { return size_; }
protected:
constexpr span_base(T* b, std::size_t s) noexcept : begin_(b), size_(s) {}
constexpr T* data() noexcept { return begin_; }
constexpr const T* data() const noexcept { return begin_; }
constexpr std::size_t size() const noexcept { return size_; }
protected:
constexpr span_base(T* b, std::size_t s) noexcept : begin_(b), size_(s) {}
constexpr span(pointer first, pointer last)
: span(first, static_cast<std::size_t>(last - first)) {
constexpr span(pointer first, pointer last)
: span(first, static_cast<std::size_t>(last - first)) {
: span(dtl::data(arr), N) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
: span(dtl::data(arr), N) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
- decltype(dtl::size(std::declval<Container>()),
- dtl::data(std::declval<Container>())),
+ decltype(dtl::size(std::declval<const Container&>()),
+ dtl::data(std::declval<const Container&>())),
pointer>::value> >
constexpr span(const Container& cont) : span(dtl::data(cont), dtl::size(cont)) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
pointer>::value> >
constexpr span(const Container& cont) : span(dtl::data(cont), dtl::size(cont)) {}
template <class Container, class = std::enable_if_t<std::is_convertible<
- decltype(dtl::size(std::declval<Container>()),
- dtl::data(std::declval<Container>())),
+ decltype(dtl::size(std::declval<Container&>()),
+ dtl::data(std::declval<Container&>())),
const_reverse_iterator rend() const { return reverse_iterator(begin()); }
const_reverse_iterator crend() { return reverse_iterator(begin()); }
const_reverse_iterator rend() const { return reverse_iterator(begin()); }
const_reverse_iterator crend() { return reverse_iterator(begin()); }
- constexpr reference front() { *base::data(); }
- constexpr reference back() { *(base::data() + base::size() - 1); }
+ constexpr reference front() { return *base::data(); }
+ constexpr reference back() { return *(base::data() + base::size() - 1); }
template <std::size_t Count>
constexpr span<element_type, Count> first() const {
template <std::size_t Count>
constexpr span<element_type, Count> first() const {
return span<element_type, Count>(base::data(), Count);
}
constexpr span<element_type, dynamic_extent> first(std::size_t count) const {
return span<element_type, Count>(base::data(), Count);
}
constexpr span<element_type, dynamic_extent> first(std::size_t count) const {
return span<element_type, dynamic_extent>(base::data(), count);
}
template <std::size_t Count>
constexpr span<element_type, Count> last() const {
return span<element_type, dynamic_extent>(base::data(), count);
}
template <std::size_t Count>
constexpr span<element_type, Count> last() const {
return span<element_type, Count>(base::data() + base::size() - Count, Count);
}
constexpr span<element_type, dynamic_extent> last(std::size_t count) const {
return span<element_type, Count>(base::data() + base::size() - Count, Count);
}
constexpr span<element_type, dynamic_extent> last(std::size_t count) const {
return span<element_type, E>(base::data() + Offset,
Count == dynamic_extent ? base::size() - Offset : Count);
}
constexpr span<element_type, dynamic_extent> subspan(
std::size_t offset, std::size_t count = dynamic_extent) const {
return span<element_type, E>(base::data() + Offset,
Count == dynamic_extent ? base::size() - Offset : Count);
}
constexpr span<element_type, dynamic_extent> subspan(
std::size_t offset, std::size_t count = dynamic_extent) const {