13template <
typename T>
class span {
15 span() noexcept : data_(
nullptr), size_(0) {}
19 template <typename U, typename = std::enable_if_t<std::is_same<const U, T>::value>>
20 span(
const std::vector<U>& v) noexcept : data_(v.data()), size_(v.size()) {}
23 span(std::vector<std::remove_const_t<T>>& v) noexcept : data_(v.data()), size_(v.size()) {}
25 T*
data() const noexcept {
return data_; }
26 std::size_t
size() const noexcept {
return size_; }
27 bool empty() const noexcept {
return size_ == 0; }
29 T&
operator[](std::size_t i)
const noexcept {
return data_[i]; }
30 T*
begin() const noexcept {
return data_; }
31 T*
end() const noexcept {
return data_ + size_; }
Minimal C++17 stand-in for std::span: a non-owning view over contiguous memory.
bool empty() const noexcept
T * begin() const noexcept
span(const std::vector< U > &v) noexcept
Implicit view over a const vector, for span<const U>.
span(T *data, std::size_t size) noexcept
std::size_t size() const noexcept
T * data() const noexcept
span(std::vector< std::remove_const_t< T > > &v) noexcept
Implicit view over a mutable vector.
T & operator[](std::size_t i) const noexcept
span subspan(std::size_t offset, std::size_t count) const noexcept