/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkSpan_DEFINED #define SkSpan_DEFINED #include <cstddef> #include <vector> template <typename T> class SkSpan { public: template <size_t N> constexpr SkSpan(T(&t)[N]) : fPtr(t), fSize(N) {} constexpr SkSpan() : fPtr{nullptr}, fSize{0} {} constexpr SkSpan(T* ptr, size_t size) : fPtr{ptr}, fSize{size} {} template <typename U> constexpr explicit SkSpan(std::vector<U>& v) : fPtr{v.data()}, fSize{v.size()} {} constexpr SkSpan(const SkSpan& o) = default; constexpr SkSpan& operator=(const SkSpan& that) { fPtr = that.fPtr; fSize = that.fSize; return *this; } constexpr T& operator [] (size_t i) const { return fPtr[i]; } constexpr T* begin() const { return fPtr; } constexpr T* end() const { return fPtr + fSize; } constexpr const T* cbegin() const { return fPtr; } constexpr const T* cend() const { return fPtr + fSize; } constexpr T* data() const { return fPtr; } constexpr size_t size() const { return fSize; } constexpr bool empty() const { return fSize == 0; } constexpr size_t size_bytes() const { return fSize * sizeof(T); } constexpr SkSpan<const T> toConst() const { return SkSpan<const T>{fPtr, fSize}; } constexpr SkSpan<T> first(size_t prefixLen) { return SkSpan<T>{fPtr, prefixLen}; } private: T* fPtr; size_t fSize; }; #endif // SkSpan_DEFINED