#pragma once #include #include #include #include namespace vcpkg { template struct Span { public: static_assert(!std::is_reference::value, "Span<&> is illegal"); using element_type = T; using pointer = std::add_pointer_t; using reference = std::add_lvalue_reference_t; using iterator = pointer; constexpr Span() noexcept : m_ptr(nullptr), m_count(0) {} constexpr Span(std::nullptr_t) noexcept : Span() {} constexpr Span(pointer ptr, size_t count) noexcept : m_ptr(ptr), m_count(count) {} constexpr Span(pointer ptr_begin, pointer ptr_end) noexcept : m_ptr(ptr_begin), m_count(ptr_end - ptr_begin) {} constexpr Span(std::initializer_list l) noexcept : m_ptr(l.begin()), m_count(l.size()) {} template constexpr Span(T (&arr)[N]) noexcept : Span(arr, N) { } template constexpr Span(const std::array, N>& arr) noexcept : Span(arr.data(), arr.size()) { } Span(std::vector& v) noexcept : Span(v.data(), v.size()) {} Span(const std::vector>& v) noexcept : Span(v.data(), v.size()) {} constexpr iterator begin() const { return m_ptr; } constexpr iterator end() const { return m_ptr + m_count; } constexpr reference operator[](size_t i) const { return m_ptr[i]; } constexpr size_t size() const { return m_count; } private: pointer m_ptr; size_t m_count; }; template Span make_span(std::vector& v) { return {v.data(), v.size()}; } template Span make_span(const std::vector& v) { return {v.data(), v.size()}; } template constexpr T* begin(Span sp) { return sp.begin(); } template constexpr T* end(Span sp) { return sp.end(); } }