From bd27b0f18cfb5744c52ddffa468578efcb4c0353 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=B6ppe?= Date: Mon, 16 Dec 2024 21:31:13 +0000 Subject: [PATCH] P3355R1 Fix submdspan for C++26 Editorial notes: * The editing instructions in the paper do not quite match the actual edits that we performed, but this appears to be a deficiency of the instructions rather than due to unclear intentions. --- source/containers.tex | 65 +++++++++++++++++++------------------------ source/support.tex | 2 +- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/source/containers.tex b/source/containers.tex index 2cd7f53bcc..d408a9eeb3 100644 --- a/source/containers.tex +++ b/source/containers.tex @@ -24319,6 +24319,17 @@ let \tcode{offset} be a value of type \tcode{size_t} equal to \tcode{(*this)(\exposid{first_}(slices...)...)}. +\pnum +Given a layout mapping type \tcode{M}, a type \tcode{S} is a +\defnadjx{unit-stride}{slice for \tcode{M}}{slice} if +\begin{itemize} +\item \tcode{S} is a specialization of \tcode{strided_slice} +where \tcode{S::stride_type} models \exposconcept{integral-constant-like} +and \tcode{S::stride_type::value} equals \tcode{1}, +\item \tcode{S} models \tcode{\exposconcept{index-pair-like}}, or +\item \tcode{is_convertible_v} is \tcode{true}. +\end{itemize} + \rSec5[mdspan.sub.map.left]{\tcode{layout_left} specialization of \tcode{submdspan_mapping}} \indexlibrarymemberexpos{layout_left::mapping}{submdspan-mapping-impl}% @@ -24350,8 +24361,7 @@ \tcode{is_convertible_v<$S_k$, full_ext\-ent_t>} is \tcode{true}; and \item for $k$ equal to \tcode{SubExtents::rank() - 1}, - $S_k$ models \tcode{\exposconcept{index-pair-like}} or - \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; + $S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} \begin{note} If the above conditions are true, @@ -24366,21 +24376,17 @@ \end{codeblock} if for a value $u$ for which $u+1$ is the smallest value $p$ larger than zero -for which $S_p$ models -\tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_p$, full_extent_t>} is \tcode{true}, +for which $S_p$ is a unit-stride slice for \tcode{decltype(*this)}, the following conditions are met: \begin{itemize} \item -$S_0$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_0$, full_extent_t>} is \tcode{true}; and +$S_0$ is a unit-stride slice for \tcode{decltype(*this)}; and \item for each $k$ in the range \range{$u$ + 1}{$u$ + SubExtents::rank() - 1}, \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; and \item for $k$ equal to \tcode{$u$ + SubExtents::rank() - 1}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} and where \tcode{S_static} is: \begin{itemize} @@ -24431,8 +24437,7 @@ \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; and \item for $k$ equal to \exposid{_rank} - \tcode{SubExtents::rank()}, - $S_k$ models \tcode{\exposconcept{index-pair-like}} or - \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; + $S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} \begin{note} If the above conditions are true, @@ -24447,23 +24452,19 @@ \end{codeblock} if for a value $u$ for which $\exposid{rank_} - u - 2$ is the largest value $p$ smaller than \tcode{\exposid{rank_} - 1} -for which $S_p$ models -\tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_p$, full_extent_t>} is \tcode{true}, +for which $S_p$ is a unit-stride slice for \tcode{decltype(*this)}, the following conditions are met: \begin{itemize} \item for $k$ equal to \tcode{\exposid{rank_} - 1}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$, full_extent_t> }is \tcode{true}; and +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; and \item for each $k$ in the range \range{\exposid{rank_} - SubExtents::rank() - $u$ + 1}{\exposid{rank_} - $u$ - 1}, \tcode{is_con\-vertible_v<$S_k$, full_extent_t>} is \tcode{true}; and \item -for $k$ equal to \tcode{\exposid{rank_} - SubExtents::rank() - $u$}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; +for $k$ equal to \tcode{\exposid{rank_} - SubExtents::rank() - $u$},\newline +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} and where \tcode{S_static} is: \begin{itemize} @@ -24539,8 +24540,7 @@ \item \tcode{SubExtents::rank() == 1} is \tcode{true} and \item -$S_0$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_0$ , full_extent_t>} is \tcode{true}; +$S_0$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} \item otherwise, @@ -24550,20 +24550,17 @@ \end{codeblock} if for a value $u$ for which \tcode{$u$ + 1} is the smallest value $p$ larger than zero -for which $S_p$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_p$, full_extent_t>} is \tcode{true}, +for which $S_p$ is a unit-stride slice for \tcode{decltype(*this)}, the following conditions are met: \begin{itemize} \item -$S_0$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_0$, full_extent_t>} is \tcode{true}; and +$S_0$ is a unit-stride slice for \tcode{decltype(*this)}; and \item for each $k$ in the range \range{$u$ + 1}{$u$ + SubExtents::rank() - 1}, \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; and \item for $k$ equal to \tcode{$u$ + SubExtents::rank() - 1}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v} is \tcode{true}; +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} where \tcode{S_static} is: \begin{itemize} @@ -24615,8 +24612,7 @@ \tcode{SubExtents::rank() == 1} is \tcode{true} and \item for $k$ equal to \tcode{\exposid{rank_} - 1}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$ , full_extent_t>} is \tcode{true}; +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} \item otherwise, @@ -24627,22 +24623,19 @@ if for a value $u$ for which \tcode{\exposid{rank_} - $u$ - 2} is the largest value p smaller than \tcode{\exposid{rank_} - 1} -for which $S_p$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_p$, full_extent_t>} is \tcode{true}, +for which $S_p$ is a unit-stride slice for \tcode{decltype(*this)}, the following conditions are met: \begin{itemize} \item for $k$ equal to \tcode{\exposid{rank_} - 1}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; and +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; and \item for each $k$ in the range \range{\exposid{rank_} - SubExtents::rank() - $u$ + 1}{\exposid{rank_} - $u$ - 1)}, \tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; and \item -for $k$ equal to \tcode{\exposid{rank_} - SubExtents::rank() - $u$}, -$S_k$ models \tcode{\exposconcept{index-pair-like}} or -\tcode{is_convertible_v<$S_k$, full_extent_t>} is \tcode{true}; +for $k$ equal to \tcode{\exposid{rank_} - SubExtents::rank() - $u$},\newline +$S_k$ is a unit-stride slice for \tcode{decltype(*this)}; \end{itemize} and where \tcode{S_static} is: \begin{itemize} diff --git a/source/support.tex b/source/support.tex index a25911d9d2..ca0f9923da 100644 --- a/source/support.tex +++ b/source/support.tex @@ -797,7 +797,7 @@ #define @\defnlibxname{cpp_lib_string_resize_and_overwrite}@ 202110L // also in \libheader{string} #define @\defnlibxname{cpp_lib_string_udls}@ 201304L // also in \libheader{string} #define @\defnlibxname{cpp_lib_string_view}@ 202403L // also in \libheader{string}, \libheader{string_view} -#define @\defnlibxname{cpp_lib_submdspan}@ 202403L // freestanding, also in \libheader{mdspan} +#define @\defnlibxname{cpp_lib_submdspan}@ 202411L // freestanding, also in \libheader{mdspan} #define @\defnlibxname{cpp_lib_syncbuf}@ 201803L // also in \libheader{syncstream} #define @\defnlibxname{cpp_lib_text_encoding}@ 202306L // also in \libheader{text_encoding} #define @\defnlibxname{cpp_lib_three_way_comparison}@ 201907L // freestanding, also in \libheader{compare}