// FCP guest_std (rexglue/UPSTREAM.md, change 140): freestanding replacement, see README.md.
// Same layout and template parameters as the MSVC STL std::span (pointer, then size for the dynamic extent).
#pragma once
#include <cstddef>
#include <type_traits>
namespace std {
inline constexpr size_t dynamic_extent = static_cast<size_t>(-1);
template <class T, size_t Extent = dynamic_extent>
class span {
 public:
  using element_type = T;
  using value_type = remove_cv_t<T>;
  using size_type = size_t;
  using pointer = T*;
  using iterator = T*;
  constexpr span() noexcept : _Mydata(nullptr), _Mysize(0) {}
  constexpr span(T* p, size_t n) noexcept : _Mydata(p), _Mysize(n) {}
  constexpr span(T* first, T* last) noexcept : _Mydata(first), _Mysize(static_cast<size_t>(last - first)) {}
  template <size_t N>
  constexpr span(T (&a)[N]) noexcept : _Mydata(a), _Mysize(N) {}
  constexpr T* data() const noexcept { return _Mydata; }
  constexpr size_t size() const noexcept { return _Mysize; }
  constexpr size_t size_bytes() const noexcept { return _Mysize * sizeof(T); }
  constexpr bool empty() const noexcept { return _Mysize == 0; }
  constexpr T& operator[](size_t i) const noexcept { return _Mydata[i]; }
  constexpr T* begin() const noexcept { return _Mydata; }
  constexpr T* end() const noexcept { return _Mydata + _Mysize; }

 private:
  T* _Mydata;
  size_t _Mysize;
};
}  // namespace std
