Changeset View
Changeset View
Standalone View
Standalone View
source/ps/containers/Span.h
Show All 32 Lines | |||||
* TODO: remove as soon as std::span become available. | * TODO: remove as soon as std::span become available. | ||||
*/ | */ | ||||
template<typename T> | template<typename T> | ||||
class span | class span | ||||
{ | { | ||||
public: | public: | ||||
using element_type = T; | using element_type = T; | ||||
using value_type = std::remove_cv_t<T>; | using value_type = std::remove_cv_t<T>; | ||||
using size_type = std::size_t; | using size_type = size_t; | ||||
using pointer = T*; | using pointer = T*; | ||||
using reference = T&; | using reference = T&; | ||||
using iterator = pointer; | using iterator = pointer; | ||||
constexpr span() | constexpr span() | ||||
: m_Pointer(nullptr), m_Extent(0) {} | : m_Pointer(nullptr), m_Extent(0) {} | ||||
constexpr span(iterator first, size_type extent) | constexpr span(iterator first, size_type extent) | ||||
: m_Pointer(first), m_Extent(extent) {} | : m_Pointer(first), m_Extent(extent) {} | ||||
constexpr span(iterator first, iterator last) | constexpr span(iterator first, iterator last) | ||||
: m_Pointer(first), m_Extent(static_cast<size_type>(last - first)) {} | : m_Pointer(first), m_Extent(static_cast<size_type>(last - first)) {} | ||||
template<typename OtherT, size_t n> | |||||
Stan: std::size_t not sure about that one, we seem to use size_t in most places | |||||
constexpr span(const std::array<OtherT, n>& arr) | |||||
: m_Pointer(arr.data()), m_Extent(arr.size()) {} | |||||
constexpr span(const span& other) = default; | constexpr span(const span& other) = default; | ||||
constexpr span& operator=(const span& other) = default; | constexpr span& operator=(const span& other) = default; | ||||
~span() = default; | ~span() = default; | ||||
constexpr size_type size() const { return m_Extent; } | constexpr size_type size() const { return m_Extent; } | ||||
constexpr bool empty() const { return size() == 0; } | constexpr bool empty() const { return size() == 0; } | ||||
constexpr reference operator[](size_type index) const { return *(m_Pointer + index); } | constexpr reference operator[](size_type index) const { return *(m_Pointer + index); } | ||||
constexpr pointer data() const { return m_Pointer; } | constexpr pointer data() const { return m_Pointer; } | ||||
constexpr iterator begin() const { return m_Pointer; } | constexpr iterator begin() const { return m_Pointer; } | ||||
constexpr iterator end() const { return m_Pointer + m_Extent; } | constexpr iterator end() const { return m_Pointer + m_Extent; } | ||||
constexpr span subspan(size_type offset) const { return {m_Pointer + offset, m_Extent - offset}; } | |||||
private: | private: | ||||
pointer m_Pointer; | pointer m_Pointer; | ||||
size_type m_Extent; | size_type m_Extent; | ||||
}; | }; | ||||
template<typename T, size_t n> | |||||
span(const std::array<T, n>&) -> span<const T>; | |||||
} // namespace PS | } // namespace PS | ||||
#endif // INCLUDED_PS_SPAN | #endif // INCLUDED_PS_SPAN |
Wildfire Games · Phabricator
std::size_t not sure about that one, we seem to use size_t in most places