Skip to content

Commit 844da8d

Browse files
committed
Hewill provides P/R
1 parent ee57e44 commit 844da8d

File tree

1 file changed

+206
-1
lines changed

1 file changed

+206
-1
lines changed

xml/issue4226.xml

Lines changed: 206 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<issue num="4226" status="New">
55
<title><code>to_input_view::<i>iterator</i></code> cannot be compared to its `const` sentinel</title>
66
<section>
7-
<sref ref="[range.to.input.view]"/>
7+
<sref ref="[range.to.input]"/>
88
</section>
99
<submitter>Hewill Kang</submitter>
1010
<date>15 Mar 2025</date>
@@ -53,6 +53,211 @@ I believe we may need to introduce a custom sentinel class for <code>to_input_vi
5353
</discussion>
5454

5555
<resolution>
56+
<p>
57+
This wording is relative to the <a href="https://github.com/cplusplus/draft/actions/runs/13875532168/artifacts/2758179972">
58+
working draft just after application of the Hagenberg motions</a>.
59+
</p>
60+
61+
<ol>
62+
63+
<li><p>Modify <sref ref="[range.to.input.view]"/> as indicated:</p>
64+
65+
<blockquote>
66+
<blockquote>
67+
<pre>
68+
namespace std::ranges {
69+
template&lt;input_range V&gt;
70+
requires view&lt;V&gt;
71+
class to_input_view : public view_interface&lt;to_input_view&lt;V&gt;&gt; {
72+
V <i>base_</i> = V(); // <i>exposition only</i>
73+
74+
template&lt;bool Const&gt;
75+
class <i>iterator</i>; // <i>exposition only</i>
76+
<ins>template&lt;bool Const&gt;
77+
class <i>sentinel</i>; // <i>exposition only</i></ins>
78+
[&hellip;]
79+
};
80+
[&hellip;]
81+
}
82+
</pre>
83+
</blockquote>
84+
[&hellip;]
85+
<pre>
86+
constexpr auto end() requires (!<i>simple-view</i>&lt;V&gt;);
87+
</pre>
88+
<blockquote>
89+
<p>
90+
<ins>-?- <i>Effects</i>: Equivalent to:</ins>
91+
</p>
92+
<pre>
93+
<ins>return <i>sentinel</i>&lt;false&gt;(ranges::end(<i>base_</i>));</ins>
94+
</pre>
95+
</blockquote>
96+
<pre>
97+
constexpr auto end() const requires range&lt;const V&gt;;
98+
</pre>
99+
<blockquote>
100+
<p>
101+
-4- <i>Effects</i>: Equivalent to:
102+
</p>
103+
<pre>
104+
return <ins><i>sentinel</i>&lt;true&gt;(</ins>ranges::end(<i>base_</i>)<ins>)</ins>;
105+
</pre>
106+
</blockquote>
107+
</blockquote>
108+
</li>
109+
110+
<li><p>Modify <sref ref="[range.to.input.iterator]"/> as indicated:</p>
111+
112+
<blockquote>
113+
<blockquote>
114+
<pre>
115+
namespace std::ranges {
116+
template&lt;input_range V&gt;
117+
requires view&lt;V&gt;
118+
template&lt;bool Const&gt;
119+
class to_input_view&lt;V&gt;::<i>iterator</i> {
120+
[&hellip;]
121+
<del>friend constexpr bool operator==(const <i>iterator</i>&amp; x, const sentinel_t&lt;<i>Base</i>&gt;&amp; y);
122+
123+
friend constexpr difference_type operator-(const sentinel_t&lt;<i>Base</i>&gt;&amp; y, const <i>iterator</i>&amp; x)
124+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>Base</i>&gt;&gt;;
125+
friend constexpr difference_type operator-(const <i>iterator</i>&amp; x, const sentinel_t&lt;<i>Base</i>&gt;&amp; y)
126+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>Base</i>&gt;&gt;;</del>
127+
[&hellip;]
128+
};
129+
}
130+
</pre>
131+
</blockquote>
132+
[&hellip;]
133+
<pre><del>
134+
friend constexpr bool operator==(const <i>iterator</i>&amp; x, const sentinel_t&lt;<i>Base</i>&gt;&amp; y);</del>
135+
</pre>
136+
<blockquote>
137+
<p>
138+
<del>-7- <i>Returns</i>: <code>x.<i>current_</i> == y</code>.</del>
139+
</p>
140+
</blockquote>
141+
<pre><del>
142+
friend constexpr difference_type operator-(const sentinel_t&lt;<i>Base</i>&gt;&amp; y, const <i>iterator</i>&amp; x)
143+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>Base</i>&gt;&gt;;</del>
144+
</pre>
145+
<blockquote>
146+
<p>
147+
<del>-8- <i>Returns</i>: <code>y - x.<i>current_</i></code>.</del>
148+
</p>
149+
</blockquote>
150+
<pre><del>
151+
friend constexpr difference_type operator-(const <i>iterator</i>&amp; x, const sentinel_t&lt;<i>Base</i>&gt;&amp; y)
152+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>Base</i>&gt;&gt;;</del>
153+
</pre>
154+
<blockquote>
155+
<p>
156+
<del>-9- <i>Returns</i>: <code>x.<i>current_</i> - y</code>.</del>
157+
</p>
158+
</blockquote>
159+
</blockquote>
160+
</li>
161+
162+
163+
<li><p>Add [range.to.input.sentinel] after [range.to.input.iterator] as indicated:</p>
164+
165+
<blockquote>
166+
<blockquote>
167+
<pre><ins>
168+
namespace std::ranges {
169+
template&lt;input_range V&gt;
170+
requires view&lt;V&gt;
171+
template&lt;bool Const&gt;
172+
class to_input_view&lt;V&gt;::<i>sentinel</i> {
173+
using <i>Base</i> = <i>maybe-const</i>&lt;Const, V&gt;; // <i>exposition only</i>
174+
sentinel_t&lt;<i>Base</i>&gt; <i>end_</i> = sentinel_t&lt;<i>Base</i>&gt;(); // <i>exposition only</i>
175+
constexpr explicit <i>sentinel</i>(sentinel_t&lt;<i>Base</i>&gt; end); // <i>exposition only</i>
176+
177+
public:
178+
<i>sentinel</i>() = default;
179+
constexpr <i>sentinel</i>(<i>sentinel</i>&lt;!Const&gt; other)
180+
requires Const &amp;&amp; convertible_to&lt;sentinel_t&lt;V&gt;, sentinel_t&lt;<i>Base</i>&gt;&gt;;
181+
182+
constexpr sentinel_t&lt;Base&gt; base() const;
183+
184+
template&lt;bool OtherConst&gt;
185+
requires sentinel_for&lt;sentinel_t&lt;Base&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
186+
friend constexpr bool operator==(const <i>iterator</i>&lt;OtherConst&gt;&amp; x, const <i>sentinel</i>&amp; y);
187+
188+
template&lt;bool OtherConst&gt;
189+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
190+
friend constexpr range_difference_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;
191+
operator-(const <i>iterator</i>&lt;OtherConst&gt;&amp; x, const <i>sentinel</i>&amp; y);
192+
193+
template&lt;bool OtherConst&gt;
194+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
195+
friend constexpr range_difference_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;
196+
operator-(const <i>sentinel</i>&amp; x, const <i>iterator</i>&lt;OtherConst&gt;&amp; y);
197+
};
198+
}</ins>
199+
</pre>
200+
</blockquote>
201+
<pre><ins>
202+
constexpr explicit <i>sentinel</i>(sentinel_t&lt;<i>Base</i>&gt; end);</ins>
203+
</pre>
204+
<blockquote>
205+
<p>
206+
<ins>-?- <i>Effects</i>: Initializes <code><i>end_</i></code> with <code>std::move(end)</code>.</ins>
207+
</p>
208+
</blockquote>
209+
<pre><ins>
210+
constexpr <i>sentinel</i>(<i>sentinel</i>&lt;!Const&gt; other)
211+
requires Const &amp;&amp; convertible_to&lt;sentinel_t&lt;V&gt;, sentinel_t&lt;<i>Base</i>&gt;&gt;;</ins>
212+
</pre>
213+
<blockquote>
214+
<p>
215+
<ins>-?- <i>Effects</i>: Initializes <code><i>end_</i></code> with <code>std::move(other.<i>end_</i>)</code>.</ins>
216+
</p>
217+
</blockquote>
218+
<pre><ins>
219+
constexpr sentinel_t&lt;Base&gt; base() const;</ins>
220+
</pre>
221+
<blockquote>
222+
<p>
223+
<ins>-?- <i>Effects</i>: Equivalent to: <code>return <i>end_</i>;</code></ins>
224+
</p>
225+
</blockquote>
226+
<pre><ins>
227+
template&lt;bool OtherConst&gt;
228+
requires sentinel_for&lt;sentinel_t&lt;Base&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
229+
friend constexpr bool operator==(const <i>iterator</i>&lt;OtherConst&gt;&amp; x, const <i>sentinel</i>&amp; y);</ins>
230+
</pre>
231+
<blockquote>
232+
<p>
233+
<ins>-?- <i>Effects</i>: Equivalent to: <code>return x.<i>current_</i> == y.<i>end_</i>;</code></ins>
234+
</p>
235+
</blockquote>
236+
<pre><ins>
237+
template&lt;bool OtherConst&gt;
238+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
239+
friend constexpr range_difference_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;
240+
operator-(const <i>iterator</i>&lt;OtherConst&gt;&amp; x, const <i>sentinel</i>&amp; y);</ins>
241+
</pre>
242+
<blockquote>
243+
<p>
244+
<ins>-?- <i>Effects</i>: Equivalent to: <code>return x.<i>current_</i> - y.<i>end_</i>;</code></ins>
245+
</p>
246+
</blockquote>
247+
<pre><ins>
248+
template&lt;bool OtherConst&gt;
249+
requires sized_sentinel_for&lt;sentinel_t&lt;<i>Base</i>&gt;, iterator_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;&gt;
250+
friend constexpr range_difference_t&lt;<i>maybe-const</i>&lt;OtherConst, V&gt;&gt;
251+
operator-(const <i>sentinel</i>&amp; x, const <i>iterator</i>&lt;OtherConst&gt;&amp; y);</ins>
252+
</pre>
253+
<blockquote>
254+
<p>
255+
<ins>-?- <i>Effects</i>: Equivalent to: <code>return x.<i>end_</i> - y.<i>current_</i>;</code></ins>
256+
</p>
257+
</blockquote>
258+
</blockquote>
259+
</li>
260+
</ol>
56261
</resolution>
57262

58263
</issue>

0 commit comments

Comments
 (0)