/* * 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 #include #include #include "include/private/SkTo.h" template class SkSpan { public: constexpr SkSpan() : fPtr{nullptr}, fSize{0} {} constexpr SkSpan(T* ptr, size_t size) : fPtr{ptr}, fSize{size} {} template ::value>::type> constexpr SkSpan(const SkSpan& that) : fPtr(that.data()), fSize{that.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& front() const { return fPtr[0]; } constexpr T& back() const { return fPtr[fSize - 1]; } 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 first(size_t prefixLen) { return SkSpan{fPtr, prefixLen}; } private: T* fPtr; size_t fSize; }; template inline constexpr SkSpan SkMakeSpan(T* p, S s) { return SkSpan{p, SkTo(s)}; } template inline constexpr SkSpan SkMakeSpan(T(&a)[N]) { return SkSpan{a, N}; } // This takes a const Container& to create an immutable span. template inline auto SkMakeSpan(const Container& c) -> SkSpan::type> { return {c.data(), c.size()}; } #endif // SkSpan_DEFINED