@@ -2226,13 +2226,13 @@ namespace ranges {
2226
2226
// clang-format off
2227
2227
template <input_iterator _It1, sentinel_for<_It1> _Se1, input_iterator _It2, sentinel_for<_It2> _Se2,
2228
2228
class _Pr = ranges::equal_to, class _Pj1 = identity, class _Pj2 = identity>
2229
- requires indirectly_comparable<_It1, _It2, _Pr, _Pj1, _Pj2>
2229
+ requires (indirectly_comparable<_It1, _It2, _Pr, _Pj1, _Pj2> // Per LWG-issue unnumbered as of 17.09.2021
2230
+ && !(same_as<_Se1, unreachable_sentinel_t> && same_as<_Se2, unreachable_sentinel_t>))
2230
2231
_NODISCARD constexpr bool operator()(_It1 _First1, _Se1 _Last1, _It2 _First2, _Se2 _Last2, _Pr _Pred = {},
2231
2232
_Pj1 _Proj1 = {}, _Pj2 _Proj2 = {}) const {
2232
2233
// clang-format on
2233
2234
_Adl_verify_range(_First1, _Last1);
2234
2235
_Adl_verify_range(_First2, _Last2);
2235
-
2236
2236
if constexpr (same_as<_Se2, unreachable_sentinel_t>) {
2237
2237
return false;
2238
2238
}
@@ -2261,7 +2261,9 @@ namespace ranges {
2261
2261
// clang-format off
2262
2262
template <input_range _Rng1, input_range _Rng2, class _Pr = ranges::equal_to, class _Pj1 = identity,
2263
2263
class _Pj2 = identity>
2264
- requires indirectly_comparable<iterator_t<_Rng1>, iterator_t<_Rng2>, _Pr, _Pj1, _Pj2>
2264
+ requires (indirectly_comparable<iterator_t<_Rng1>, iterator_t<_Rng2>, _Pr, _Pj1, _Pj2>
2265
+ && !(same_as<sentinel_t<_Rng1>, unreachable_sentinel_t>
2266
+ && same_as<sentinel_t<_Rng2>, unreachable_sentinel_t>)) // Per LWG-issue unnumbered as of 17.09.2021
2265
2267
_NODISCARD constexpr bool operator()(
2266
2268
_Rng1&& _Range1, _Rng2&& _Range2, _Pr _Pred = {}, _Pj1 _Proj1 = {}, _Pj2 _Proj2 = {}) const {
2267
2269
// clang-format on
@@ -2301,74 +2303,67 @@ namespace ranges {
2301
2303
requires (forward_iterator<_It1> || sized_sentinel_for<_Se1, _It1>)
2302
2304
&& (forward_iterator<_It2> || sized_sentinel_for<_Se2, _It2>)
2303
2305
&& indirectly_comparable<_It1, _It2, _Pr, _Pj1, _Pj2>
2306
+ && (!same_as<_Se1, unreachable_sentinel_t>) // Per LWG-issue unnumbered as of 17.09.2021
2304
2307
_NODISCARD constexpr bool operator()(_It1 _First1, _Se1 _Last1, _It2 _First2, _Se2 _Last2, _Pr _Pred = {},
2305
2308
_Pj1 _Proj1 = {}, _Pj2 _Proj2 = {}) const {
2306
2309
// clang-format on
2307
2310
_Adl_verify_range(_First1, _Last1);
2308
2311
_Adl_verify_range(_First2, _Last2);
2312
+ if constexpr (same_as<_Se2, unreachable_sentinel_t>) {
2313
+ return false;
2314
+ }
2309
2315
2310
2316
auto _UFirst1 = _Get_unwrapped(_STD move(_First1));
2311
2317
auto _ULast1 = _Get_unwrapped(_STD move(_Last1));
2312
2318
auto _UFirst2 = _Get_unwrapped(_STD move(_First2));
2313
2319
auto _ULast2 = _Get_unwrapped(_STD move(_Last2));
2314
- if constexpr (same_as<_Se1, unreachable_sentinel_t> && same_as<_Se2, unreachable_sentinel_t>) {
2315
- return _Equal_4(_STD move(_UFirst1), _STD move(_ULast1), _STD move(_UFirst2), _STD move(_ULast2),
2316
- _Pass_fn(_Pred), _Pass_fn(_Proj1), _Pass_fn(_Proj2));
2317
- } else if constexpr (same_as<_Se1, unreachable_sentinel_t> || same_as<_Se2, unreachable_sentinel_t>) {
2318
- return false;
2319
- } else {
2320
- iter_difference_t<_It1> _Count1;
2321
- if constexpr (sized_sentinel_for<_Se1, _It1>) { // TRANSITION, LWG-3392
2322
- _Count1 = _ULast1 - _UFirst1;
2323
- } else {
2324
- _Count1 = _RANGES distance(_UFirst1, _ULast1);
2325
- }
2326
2320
2327
- iter_difference_t<_It2> _Count2 ;
2328
- if constexpr (sized_sentinel_for<_Se2, _It2 >) { // TRANSITION, LWG-3392
2329
- _Count2 = _ULast2 - _UFirst2 ;
2330
- } else {
2331
- _Count2 = _RANGES distance(_UFirst2, _ULast2 );
2332
- }
2321
+ iter_difference_t<_It1> _Count1 ;
2322
+ if constexpr (sized_sentinel_for<_Se1, _It1 >) { // TRANSITION, LWG-3392
2323
+ _Count1 = _ULast1 - _UFirst1 ;
2324
+ } else {
2325
+ _Count1 = _RANGES distance(_UFirst1, _ULast1 );
2326
+ }
2333
2327
2334
- if (_Count2 > _Count1) {
2335
- return false;
2336
- }
2328
+ iter_difference_t<_It2> _Count2;
2329
+ if constexpr (sized_sentinel_for<_Se2, _It2>) { // TRANSITION, LWG-3392
2330
+ _Count2 = _ULast2 - _UFirst2;
2331
+ } else {
2332
+ _Count2 = _RANGES distance(_UFirst2, _ULast2);
2333
+ }
2337
2334
2338
- _RANGES advance(_UFirst1, static_cast<iter_difference_t<_It1>>(_Count1 - _Count2));
2339
- return _RANGES _Equal_count(_STD move(_UFirst1), _STD move(_UFirst2),
2340
- static_cast<iter_difference_t<_It1>>(_Count2), _Pass_fn(_Pred), _Pass_fn(_Proj1), _Pass_fn(_Proj2));
2335
+ if (_Count2 > _Count1) {
2336
+ return false;
2341
2337
}
2338
+
2339
+ _RANGES advance(_UFirst1, static_cast<iter_difference_t<_It1>>(_Count1 - _Count2));
2340
+ return _RANGES _Equal_count(_STD move(_UFirst1), _STD move(_UFirst2),
2341
+ static_cast<iter_difference_t<_It1>>(_Count2), _Pass_fn(_Pred), _Pass_fn(_Proj1), _Pass_fn(_Proj2));
2342
2342
}
2343
2343
2344
2344
// clang-format off
2345
2345
template <input_range _Rng1, input_range _Rng2, class _Pr = ranges::equal_to, class _Pj1 = identity,
2346
2346
class _Pj2 = identity>
2347
2347
requires (forward_range<_Rng1> || sized_range<_Rng1>) && (forward_range<_Rng2> || sized_range<_Rng2>)
2348
2348
&& indirectly_comparable<iterator_t<_Rng1>, iterator_t<_Rng2>, _Pr, _Pj1, _Pj2>
2349
+ && (!same_as<sentinel_t<_Rng1>, unreachable_sentinel_t>) // Per LWG-issue unnumbered as of 17.09.2021
2349
2350
_NODISCARD constexpr bool operator()(
2350
2351
_Rng1&& _Range1, _Rng2&& _Range2, _Pr _Pred = {}, _Pj1 _Proj1 = {}, _Pj2 _Proj2 = {}) const {
2351
2352
// clang-format on
2352
- if constexpr (same_as<sentinel_t<_Rng1>, unreachable_sentinel_t> //
2353
- && same_as<sentinel_t<_Rng2>, unreachable_sentinel_t>)
2354
- return _Equal_4(_Ubegin(_Range1), _Uend(_Range1), _Ubegin(_Range2), _Uend(_Range2), _Pass_fn(_Pred),
2355
- _Pass_fn(_Proj1), _Pass_fn(_Proj2));
2356
- else if constexpr (same_as<sentinel_t<_Rng1>, unreachable_sentinel_t> //
2357
- || same_as<sentinel_t<_Rng2>, unreachable_sentinel_t>) {
2353
+ if constexpr (same_as<sentinel_t<_Rng2>, unreachable_sentinel_t>) {
2358
2354
return false;
2359
- } else {
2360
- const range_difference_t<_Rng1> _Count1 = _RANGES distance(_Range1);
2361
- const range_difference_t<_Rng2> _Count2 = _RANGES distance(_Range2);
2362
- if (_Count2 > _Count1) {
2363
- return false;
2364
- }
2355
+ }
2365
2356
2366
- auto _UFirst1 = _Ubegin(_Range1);
2367
- _RANGES advance(_UFirst1, static_cast<range_difference_t<_Rng1>>(_Count1 - _Count2));
2368
- return _RANGES _Equal_count(_STD move(_UFirst1), _Ubegin(_Range2),
2369
- static_cast<range_difference_t<_Rng1>>(_Count2), _Pass_fn(_Pred), _Pass_fn(_Proj1),
2370
- _Pass_fn(_Proj2));
2357
+ const range_difference_t<_Rng1> _Count1 = _RANGES distance(_Range1);
2358
+ const range_difference_t<_Rng2> _Count2 = _RANGES distance(_Range2);
2359
+ if (_Count2 > _Count1) {
2360
+ return false;
2371
2361
}
2362
+
2363
+ auto _UFirst1 = _Ubegin(_Range1);
2364
+ _RANGES advance(_UFirst1, static_cast<range_difference_t<_Rng1>>(_Count1 - _Count2));
2365
+ return _RANGES _Equal_count(_STD move(_UFirst1), _Ubegin(_Range2),
2366
+ static_cast<range_difference_t<_Rng1>>(_Count2), _Pass_fn(_Pred), _Pass_fn(_Proj1), _Pass_fn(_Proj2));
2372
2367
}
2373
2368
};
2374
2369
0 commit comments