upd: [imp] span (TBD)

This commit is contained in:
mutouyun 2022-10-16 20:23:04 +08:00
parent 081e20bfd6
commit 3a3168b6f4

View File

@ -25,16 +25,16 @@ namespace detail {
template <typename From, typename To>
using array_convertible = std::is_convertible<From(*)[], To(*)[]>;
template <typename From, typename To>
using is_array_convertible =
typename std::enable_if<array_convertible<From, To>::value>::type;
template <typename T, typename Ref>
using compatible_ref = array_convertible<typename std::remove_reference<Ref>::type, T>;
template <typename It>
using iter_reference_t = decltype(*std::declval<It&>());
template <typename From, typename To>
using is_array_convertible =
typename std::enable_if<array_convertible<From, To>::value>::type;
template <typename T, typename It>
using is_compatible_iter =
typename std::enable_if<compatible_ref<T, iter_reference_t<It>>::value>::type;
@ -43,6 +43,10 @@ template <typename From, typename To>
using is_inconvertible =
typename std::enable_if<!std::is_convertible<From, To>::value>::type;
template <typename S, typename I>
using is_sized_sentinel_for =
is_inconvertible<decltype(std::declval<S>() - std::declval<I>()), std::ptrdiff_t>;
/// @brief Obtain the address represented by p
/// without forming a reference to the object pointed to by p.
/// @see https://en.cppreference.com/w/cpp/memory/to_address
@ -97,7 +101,7 @@ public:
template <typename It, typename End,
typename = detail::is_compatible_iter<T, It>,
typename = detail::is_compatible_iter<T, End>,
typename = detail::is_sized_sentinel_for<End, It>,
typename = detail::is_inconvertible<End, size_type>>
constexpr span(It first, End last) noexcept(noexcept(last - first))
: ptr_ (detail::to_address(first))