Skip to content

Commit 5b1c364

Browse files
committed
P3029R1 Better mdspan's CTAD
1 parent 9526420 commit 5b1c364

File tree

1 file changed

+20
-13
lines changed

1 file changed

+20
-13
lines changed

source/containers.tex

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18228,6 +18228,20 @@
1822818228
// constants
1822918229
inline constexpr size_t @\libglobal{dynamic_extent}@ = numeric_limits<size_t>::max();
1823018230

18231+
template<class T>
18232+
concept @\defexposconcept{integral-constant-like}@ = // \expos
18233+
is_integral_v<decltype(T::value)> &&
18234+
!is_same_v<bool, remove_const_t<decltype(T::value)>> &&
18235+
@\libconcept{convertible_to}@<T, decltype(T::value)> &&
18236+
@\libconcept{equality_comparable_with}@<T, decltype(T::value)> &&
18237+
bool_constant<T() == T::value>::value &&
18238+
bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;
18239+
18240+
template<class T>
18241+
constexpr size_t @\defexposconcept{maybe-static-ext}@ = dynamic_extent; // \expos
18242+
template<@\exposconcept{integral-constant-like}@ T>
18243+
constexpr size_t @\exposconcept{maybe-static-ext}@<T> = {T::value};
18244+
1823118245
// \ref{views.span}, class template \tcode{span}
1823218246
template<class ElementType, size_t Extent = dynamic_extent>
1823318247
class span; // partially freestanding
@@ -18343,7 +18357,8 @@
1834318357
};
1834418358

1834518359
template<class It, class EndOrSize>
18346-
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>>;
18360+
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>,
18361+
@\exposconcept{maybe-static-ext}@<EndOrSize>>;
1834718362
template<class T, size_t N>
1834818363
span(T (&)[N]) -> span<T, N>;
1834918364
template<class T, size_t N>
@@ -18635,7 +18650,8 @@
1863518650
\indexlibrary{\idxcode{span}!deduction guide}%
1863618651
\begin{itemdecl}
1863718652
template<class It, class EndOrSize>
18638-
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>>;
18653+
span(It, EndOrSize) -> span<remove_reference_t<iter_reference_t<It>>,
18654+
@\exposconcept{maybe-static-ext}@<EndOrSize>>;
1863918655
\end{itemdecl}
1864018656

1864118657
\begin{itemdescr}
@@ -19082,15 +19098,6 @@
1908219098
const mdspan<ElementType, Extents, LayoutPolicy, AccessorPolicy>& src,
1908319099
SliceSpecifiers... slices) -> @\seebelow@;
1908419100

19085-
template<class T>
19086-
concept @\defexposconcept{integral-constant-like}@ = // \expos
19087-
is_integral_v<decltype(T::value)> &&
19088-
!is_same_v<bool, remove_const_t<decltype(T::value)>> &&
19089-
@\libconcept{convertible_to}@<T, decltype(T::value)> &&
19090-
@\libconcept{equality_comparable_with}@<T, decltype(T::value)> &&
19091-
bool_constant<T() == T::value>::value &&
19092-
bool_constant<static_cast<decltype(T::value)>(T()) == T::value>::value;
19093-
1909419101
template<class T, class IndexType>
1909519102
concept @\defexposconcept{index-pair-like}@ = // \expos
1909619103
@\exposconcept{pair-like}@<T> &&
@@ -19442,7 +19449,7 @@
1944219449

1944319450
\pnum
1944419451
\remarks
19445-
The deduced type is \tcode{dextents<size_t, sizeof...(Integrals)>}.
19452+
The deduced type is \tcode{extents<size_t, \exposconcept{maybe-static-ext}<Integrals>...>}.
1944619453
\end{itemdescr}
1944719454

1944819455
\rSec4[mdspan.extents.obs]{Observers of the multidimensional index space}
@@ -21116,7 +21123,7 @@
2111621123
template<class ElementType, class... Integrals>
2111721124
requires ((is_convertible_v<Integrals, size_t> && ...) && sizeof...(Integrals) > 0)
2111821125
explicit mdspan(ElementType*, Integrals...)
21119-
-> mdspan<ElementType, dextents<size_t, sizeof...(Integrals)>>;
21126+
-> mdspan<ElementType, dextents<size_t, @\exposconcept{maybe-static-ext}@<Integrals>...>>;
2112021127

2112121128
template<class ElementType, class OtherIndexType, size_t N>
2112221129
mdspan(ElementType*, span<OtherIndexType, N>)

0 commit comments

Comments
 (0)