Skip to content

Commit 4cd438d

Browse files
committed
New issue to address US 161-258: ranges::rotate do not handle sized-but-not-sized-sentinel ranges correctly
1 parent 4aaba2f commit 4cd438d

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

xml/issue4441.xml

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<?xml version='1.0' encoding='utf-8' standalone='no'?>
2+
<!DOCTYPE issue SYSTEM "lwg-issue.dtd">
3+
4+
<issue num="4441" status="New">
5+
<title><tt>ranges::rotate</tt> do not handle sized-but-not-sized-sentinel ranges correctly</title>
6+
<section>
7+
<sref ref="[alg.rotate]"/>
8+
<sref ref="[partial.sort]"/>
9+
<sref ref="[alg.nth.element]"/>
10+
<sref ref="[alg.merge]"/>
11+
</section>
12+
<submitter>Tomasz Kamiński</submitter>
13+
<date>03 Nov 2025</date>
14+
<priority>99</priority>
15+
16+
<discussion>
17+
<b>Addresses US 161-258</b>
18+
<p>These do not handle sized-but-not-sized-sentinel ranges correctly.</p>
19+
</discussion>
20+
21+
<resolution>
22+
<p>
23+
This wording is relative to <paper num="N5014"/>.
24+
</p>
25+
26+
<ol>
27+
28+
<li><p>Modify <sref ref="[alg.rotate]"/> as indicated:</p>
29+
30+
<pre>
31+
template&lt;execution-policy Ep, <i>sized-random-access-range</i> R&gt;
32+
requires permutable&lt;iterator_t&lt;R&gt;&gt;
33+
borrowed_subrange_t&lt;R&gt; ranges::rotate(Ep&amp;&amp; exec, R&amp;&amp; r, iterator_t&lt;R&gt; middle);
34+
35+
</pre>
36+
<blockquote>
37+
<p>-6- <i>Effects</i> Equivalent to:
38+
<tt>return ranges::rotate(std::forward&lt;Ep&gt;(exec), ranges::begin(r), middle,
39+
<del>ranges::end(r)</del><ins>ranges::begin(r) + ranges::distance(r)</ins>);</tt>
40+
</p>
41+
</blockquote>
42+
43+
[&hellip;]
44+
45+
<pre>
46+
template&lt;execution-policy Ep, <i>sized-random-access-range</i> R, <i>sized-random-access-range</i> OutR&gt;
47+
requires indirectly_copyable&lt;iterator_t&lt;R&gt;, iterator_t&lt;OutR&gt;&gt;
48+
ranges::rotate_copy_truncated_result&lt;borrowed_iterator_t&lt;R&gt;, borrowed_iterator_t&lt;OutR&gt;&gt;
49+
ranges::rotate_copy(Ep&amp;&amp; exec, R&amp;&amp; r, iterator_t&lt;R&gt; middle, OutR&amp;&amp; result_r);
50+
</pre>
51+
<blockquote>
52+
<p>-18- <i>Effects</i> Equivalent to:
53+
<tt>return ranges::rotate(std::forward&lt;Ep&gt;(exec), ranges::begin(r), middle,
54+
<del>ranges::end(r)</del><ins>ranges::begin(r)+ranges::distance(r)</ins>
55+
ranges::begin(result_r), <del>ranges::end(result_r)</del><ins>ranges::begin(result_r) + ranges::distance(result_r)</ins>);</tt>
56+
</p>
57+
</blockquote>
58+
59+
</li>
60+
61+
<li><p>Modify <sref ref="[partial.sort]"/> as indicated:</p>
62+
63+
<pre>
64+
template&lt;execution-policy Ep, sized-random-access-range R,
65+
class Comp = ranges::less, class Proj = identity&gt;
66+
requires sortable&lt;iterator_t&lt;R&gt;, Comp, Proj&gt;
67+
borrowed_iterator_t&lt;R&gt;
68+
ranges::partial_sort(Ep&amp;&amp; exec, R&amp;&amp; r, iterator_t&lt;R&gt; middle, Comp comp = {},
69+
Proj proj = {});
70+
</pre>
71+
<blockquote>
72+
<p>-7- <i>Effects</i> Equivalent to:
73+
<tt>return ranges::partial_sort(std::forward&lt;Ep&gt;(exec), ranges::begin(r), middle,
74+
<del>ranges::end(r)</del><ins>ranges::begin(r) + ranges::distance(r)</ins>, comp, proj);</tt>
75+
</p>
76+
</blockquote>
77+
78+
</li>
79+
80+
<li><p>Modify <sref ref="[alg.nth.element]"/> as indicated:</p>
81+
82+
<pre>
83+
template&lt;execution-policy Ep, <i>sized-random-access-range</i> R, class Comp = ranges::less,
84+
class Proj = identity&gt;
85+
requires sortable&lt;iterator_t&lt;R&gt;, Comp, Proj&gt;
86+
borrowed_iterator_t&lt;R&gt;
87+
ranges::nth_element(Ep&amp;&amp; exec, R&amp;&amp; r, iterator_t&lt;R&gt; nth, Comp comp = {}, Proj proj = {});
88+
</pre>
89+
<blockquote>
90+
<p>-7- <i>Effects</i> Equivalent to:
91+
<tt>return ranges::nth_element(std::forward&lt;Ep&gt;(exec), ranges::begin(r), nth,
92+
<del>ranges::end(r)</del><ins>ranges::begin(r) + ranges::distance(r)</ins>, comp, proj);</tt>
93+
</p>
94+
</blockquote>
95+
96+
</li>
97+
98+
<li><p>Modify <sref ref="[alg.merge]"/> as indicated:</p>
99+
100+
<pre>
101+
template&lt;execution-policy Ep, sized-random-access-range R, class Comp = ranges::less,
102+
class Proj = identity&gt;
103+
requires sortable&lt;iterator_t&lt;R&gt;, Comp, Proj&gt;
104+
borrowed_iterator_t&lt;R&gt;
105+
ranges::inplace_merge(Ep&amp;&amp; exec, R&amp;&amp; r, iterator_t&lt;R&gt; middle, Comp comp = {},
106+
Proj proj = {});
107+
</pre>
108+
<blockquote>
109+
<p>-14- <i>Effects</i> Equivalent to:
110+
<tt>return ranges::inplace_merge(std::forward&lt;Ep&gt;(exec), ranges::begin(r), middle,
111+
<del>ranges::end(r)</del><ins>ranges::begin(r) + ranges::distance(r)</ins>, comp, proj);</tt>
112+
</p>
113+
</blockquote>
114+
115+
</li>
116+
117+
118+
</ol>
119+
120+
</resolution>
121+
122+
</issue>

0 commit comments

Comments
 (0)