#pragma once #include #include #include #include namespace vcpkg { template struct Span { public: static_assert(std::is_object::value, "Span is illegal"); using value_type = std::decay_t; 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 : m_ptr(nullptr), m_count(0) {} 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 : m_ptr(arr), m_count(N) { } template constexpr Span(std::remove_const_t (&arr)[N]) noexcept : m_ptr(arr), m_count(N) { } template().data()), class = std::enable_if_t, Span>::value>> constexpr Span(Range&& v) noexcept : Span(v.data(), v.size()) { static_assert(std::is_same::value_type, value_type>::value, "Cannot convert incompatible ranges"); } 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 pointer data() const { return m_ptr; } constexpr size_t size() const { return m_count; } private: pointer m_ptr; size_t m_count; }; }