Add fixed_extent to base::span. This is done in a more localized way than upstream, where we support IntegralConstantLike in StrictNumeric. Bug: none Change-Id: Ia2a5f086fec0d318f168774aad717805eed25a35 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/mini_chromium/+/6090877 Reviewed-by: Mark Mentovai <mark@chromium.org>
diff --git a/base/containers/span.h b/base/containers/span.h index c7ed4c3..a34d2ee 100644 --- a/base/containers/span.h +++ b/base/containers/span.h
@@ -33,6 +33,9 @@ namespace base { +template <size_t N> +using fixed_extent = std::integral_constant<size_t, N>; + template <typename T, size_t Extent = dynamic_extent, typename InternalPtrType = T*> @@ -40,6 +43,21 @@ namespace internal { +template <typename T> +concept IntegralConstantLike = + std::is_integral_v<decltype(T::value)> && + !std::is_same_v<bool, std::remove_const_t<decltype(T::value)>> && + std::convertible_to<T, decltype(T::value)> && + std::equality_comparable_with<T, decltype(T::value)> && + std::bool_constant<T() == T::value>::value && + std::bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value; + +template <typename T> +inline constexpr size_t MaybeStaticExt = dynamic_extent; +template <typename T> + requires IntegralConstantLike<T> +inline constexpr size_t MaybeStaticExt<T> = {T::value}; + template <typename From, typename To> concept LegalDataConversion = std::convertible_to<std::remove_reference_t<From> (*)[], @@ -260,6 +278,13 @@ requires(N == 0) = default; + template <typename It, size_t N> + requires(internal::CompatibleIter<T, It>) + UNSAFE_BUFFER_USAGE explicit constexpr span( + It first, + std::integral_constant<size_t, N> count) noexcept + : span(first, N) {} + // Constructs a span from a contiguous iterator and a size. // // # Checks @@ -1038,7 +1063,8 @@ // [span.deduct], deduction guides. template <typename It, typename EndOrSize> requires(std::contiguous_iterator<It>) -span(It, EndOrSize) -> span<std::remove_reference_t<std::iter_reference_t<It>>>; +span(It, EndOrSize) -> span<std::remove_reference_t<std::iter_reference_t<It>>, + internal::MaybeStaticExt<EndOrSize>>; template < typename R,