Skip to content

Commit 70e0397

Browse files
authored
Merge 2025-06 LWG Motion 7
P3709R2 Reconsider parallel ranges::rotate_copy and ranges::reverse_copy
2 parents 3c3d131 + f267b2d commit 70e0397

File tree

1 file changed

+23
-28
lines changed

1 file changed

+23
-28
lines changed

source/algorithms.tex

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,7 +2599,9 @@
25992599

26002600
namespace ranges {
26012601
template<class I, class O>
2602-
using reverse_copy_result = in_out_result<I, O>;
2602+
using @\libglobal{reverse_copy_result}@ = in_out_result<I, O>;
2603+
template<class I, class O>
2604+
using @\libglobal{reverse_copy_truncated_result}@ = in_in_out_result<I, I, O>;
26032605

26042606
template<@\libconcept{bidirectional_iterator}@ I, @\libconcept{sentinel_for}@<I> S, @\libconcept{weakly_incrementable}@ O>
26052607
requires @\libconcept{indirectly_copyable}@<I, O>
@@ -2613,12 +2615,12 @@
26132615
template<@\exposconcept{execution-policy}@ Ep, @\libconcept{random_access_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S,
26142616
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS>
26152617
requires @\libconcept{indirectly_copyable}@<I, O>
2616-
reverse_copy_result<I, O>
2618+
reverse_copy_truncated_result<I, O>
26172619
reverse_copy(Ep&& exec, I first, S last, O result,
26182620
OutS result_last); // freestanding-deleted
26192621
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R, @\exposconcept{sized-random-access-range}@ OutR>
26202622
requires @\libconcept{indirectly_copyable}@<iterator_t<R>, iterator_t<OutR>>
2621-
reverse_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
2623+
reverse_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
26222624
reverse_copy(Ep&& exec, R&& r, OutR&& result_r); // freestanding-deleted
26232625
}
26242626

@@ -2662,7 +2664,9 @@
26622664

26632665
namespace ranges {
26642666
template<class I, class O>
2665-
using rotate_copy_result = in_out_result<I, O>;
2667+
using @\libglobal{rotate_copy_result}@ = in_out_result<I, O>;
2668+
template<class I, class O>
2669+
using @\libglobal{rotate_copy_truncated_result}@ = in_in_out_result<I, I, O>;
26662670

26672671
template<@\libconcept{forward_iterator}@ I, @\libconcept{sentinel_for}@<I> S, @\libconcept{weakly_incrementable}@ O>
26682672
requires @\libconcept{indirectly_copyable}@<I, O>
@@ -2676,12 +2680,12 @@
26762680
template<@\exposconcept{execution-policy}@ Ep, @\libconcept{random_access_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S,
26772681
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS>
26782682
requires @\libconcept{indirectly_copyable}@<I, O>
2679-
rotate_copy_result<I, O>
2683+
rotate_copy_truncated_result<I, O>
26802684
rotate_copy(Ep&& exec, I first, I middle, S last, O result, // freestanding-deleted
26812685
OutS result_last);
26822686
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R, @\exposconcept{sized-random-access-range}@ OutR>
26832687
requires @\libconcept{indirectly_copyable}@<iterator_t<R>, iterator_t<OutR>>
2684-
rotate_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
2688+
rotate_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
26852689
rotate_copy(Ep&& exec, R&& r, iterator_t<R> middle, // freestanding-deleted
26862690
OutR&& result_r);
26872691
}
@@ -8140,12 +8144,12 @@
81408144
template<@\exposconcept{execution-policy}@ Ep, @\libconcept{random_access_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S,
81418145
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS>
81428146
requires @\libconcept{indirectly_copyable}@<I, O>
8143-
ranges::reverse_copy_result<I, O>
8147+
ranges::reverse_copy_truncated_result<I, O>
81448148
ranges::reverse_copy(Ep&& exec, I first, S last, O result,
81458149
OutS result_last);
81468150
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R, @\exposconcept{sized-random-access-range}@ OutR>
81478151
requires @\libconcept{indirectly_copyable}@<iterator_t<R>, iterator_t<OutR>>
8148-
ranges::reverse_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
8152+
ranges::reverse_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
81498153
ranges::reverse_copy(Ep&& exec, R&& r, OutR&& result_r);
81508154
\end{itemdecl}
81518155

@@ -8169,15 +8173,7 @@
81698173

81708174
\pnum
81718175
\returns
8172-
\tcode{\{\exposid{NEW_FIRST}, result + $N$\}}.
8173-
\begin{note}
8174-
While the return type for the parallel and non-parallel algorithm overloads
8175-
in the namespace \tcode{ranges} is the same,
8176-
the semantics is different
8177-
because for the parallel range algorithm overloads
8178-
\tcode{result_last - result} can be insufficient
8179-
to copy all data from the input.
8180-
\end{note}
8176+
\tcode{\{last, \exposid{NEW_FIRST}, result + $N$\}}.
81818177

81828178
\pnum
81838179
\complexity
@@ -8320,7 +8316,7 @@
83208316
template<@\exposconcept{execution-policy}@ Ep, @\libconcept{random_access_iterator}@ I, @\libconcept{sized_sentinel_for}@<I> S,
83218317
@\libconcept{random_access_iterator}@ O, @\libconcept{sized_sentinel_for}@<O> OutS>
83228318
requires @\libconcept{indirectly_copyable}@<I, O>
8323-
ranges::rotate_copy_result<I, O>
8319+
ranges::rotate_copy_truncated_result<I, O>
83248320
ranges::rotate_copy(Ep&& exec, I first, I middle, S last, O result, OutS result_last);
83258321
\end{itemdecl}
83268322

@@ -8346,15 +8342,14 @@
83468342

83478343
\pnum
83488344
\returns
8349-
\tcode{\{first + ($N$ + (middle - first)) \% $M$, result + $N$\}}.
8350-
\begin{note}
8351-
While the return type for the parallel and non-parallel algorithm overloads
8352-
in the namespace \tcode{ranges} is the same,
8353-
the semantics is different
8354-
because for the parallel range algorithm overloads
8355-
\tcode{result_last - result} can be insufficient
8356-
to copy all data from the input.
8357-
\end{note}
8345+
\begin{itemize}
8346+
\item
8347+
\tcode{\{middle + $N$, first, result + $N$\}}
8348+
if $N$ is less than \tcode{last - middle}.
8349+
\item
8350+
Otherwise,
8351+
\tcode{\{last, first + ($N$ + (middle - first)) \% $M$, result + $N$\}}.
8352+
\end{itemize}
83588353

83598354
\pnum
83608355
\complexity
@@ -8380,7 +8375,7 @@
83808375
\begin{itemdecl}
83818376
template<@\exposconcept{execution-policy}@ Ep, @\exposconcept{sized-random-access-range}@ R, @\exposconcept{sized-random-access-range}@ OutR>
83828377
requires @\libconcept{indirectly_copyable}@<iterator_t<R>, iterator_t<OutR>>
8383-
ranges::rotate_copy_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
8378+
ranges::rotate_copy_truncated_result<borrowed_iterator_t<R>, borrowed_iterator_t<OutR>>
83848379
ranges::rotate_copy(Ep&& exec, R&& r, iterator_t<R> middle, OutR&& result_r);
83858380
\end{itemdecl}
83868381

0 commit comments

Comments
 (0)