1 1.1 mrg // <ranges> -*- C++ -*- 2 1.1 mrg 3 1.1.1.3 mrg // Copyright (C) 2019-2022 Free Software Foundation, Inc. 4 1.1 mrg // 5 1.1 mrg // This file is part of the GNU ISO C++ Library. This library is free 6 1.1 mrg // software; you can redistribute it and/or modify it under the 7 1.1 mrg // terms of the GNU General Public License as published by the 8 1.1 mrg // Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg // any later version. 10 1.1 mrg 11 1.1 mrg // This library is distributed in the hope that it will be useful, 12 1.1 mrg // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg // GNU General Public License for more details. 15 1.1 mrg 16 1.1 mrg // Under Section 7 of GPL version 3, you are granted additional 17 1.1 mrg // permissions described in the GCC Runtime Library Exception, version 18 1.1 mrg // 3.1, as published by the Free Software Foundation. 19 1.1 mrg 20 1.1 mrg // You should have received a copy of the GNU General Public License and 21 1.1 mrg // a copy of the GCC Runtime Library Exception along with this program; 22 1.1 mrg // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 1.1 mrg // <http://www.gnu.org/licenses/>. 24 1.1 mrg 25 1.1 mrg /** @file include/ranges 26 1.1 mrg * This is a Standard C++ Library header. 27 1.1 mrg * @ingroup concepts 28 1.1 mrg */ 29 1.1 mrg 30 1.1 mrg #ifndef _GLIBCXX_RANGES 31 1.1 mrg #define _GLIBCXX_RANGES 1 32 1.1 mrg 33 1.1 mrg #if __cplusplus > 201703L 34 1.1 mrg 35 1.1 mrg #pragma GCC system_header 36 1.1 mrg 37 1.1 mrg #include <concepts> 38 1.1 mrg 39 1.1 mrg #if __cpp_lib_concepts 40 1.1 mrg 41 1.1 mrg #include <compare> 42 1.1 mrg #include <initializer_list> 43 1.1 mrg #include <iterator> 44 1.1 mrg #include <optional> 45 1.1.1.3 mrg #include <span> 46 1.1 mrg #include <tuple> 47 1.1.1.3 mrg #include <bits/ranges_util.h> 48 1.1.1.3 mrg #include <bits/refwrap.h> 49 1.1 mrg 50 1.1 mrg /** 51 1.1 mrg * @defgroup ranges Ranges 52 1.1 mrg * 53 1.1 mrg * Components for dealing with ranges of elements. 54 1.1 mrg */ 55 1.1 mrg 56 1.1 mrg namespace std _GLIBCXX_VISIBILITY(default) 57 1.1 mrg { 58 1.1 mrg _GLIBCXX_BEGIN_NAMESPACE_VERSION 59 1.1 mrg namespace ranges 60 1.1 mrg { 61 1.1.1.3 mrg // [range.access] customization point objects 62 1.1.1.3 mrg // [range.req] range and view concepts 63 1.1.1.3 mrg // [range.dangling] dangling iterator handling 64 1.1.1.3 mrg // Defined in <bits/ranges_base.h> 65 1.1.1.3 mrg 66 1.1.1.3 mrg // [view.interface] View interface 67 1.1.1.3 mrg // [range.subrange] Sub-ranges 68 1.1.1.3 mrg // Defined in <bits/ranges_util.h> 69 1.1 mrg 70 1.1.1.3 mrg // C++20 24.6 [range.factories] Range factories 71 1.1 mrg 72 1.1.1.3 mrg /// A view that contains no elements. 73 1.1 mrg template<typename _Tp> requires is_object_v<_Tp> 74 1.1 mrg class empty_view 75 1.1 mrg : public view_interface<empty_view<_Tp>> 76 1.1 mrg { 77 1.1 mrg public: 78 1.1 mrg static constexpr _Tp* begin() noexcept { return nullptr; } 79 1.1 mrg static constexpr _Tp* end() noexcept { return nullptr; } 80 1.1 mrg static constexpr _Tp* data() noexcept { return nullptr; } 81 1.1 mrg static constexpr size_t size() noexcept { return 0; } 82 1.1 mrg static constexpr bool empty() noexcept { return true; } 83 1.1 mrg }; 84 1.1 mrg 85 1.1 mrg template<typename _Tp> 86 1.1 mrg inline constexpr bool enable_borrowed_range<empty_view<_Tp>> = true; 87 1.1 mrg 88 1.1 mrg namespace __detail 89 1.1 mrg { 90 1.1.1.3 mrg template<typename _Tp> 91 1.1.1.3 mrg concept __boxable = copy_constructible<_Tp> && is_object_v<_Tp>; 92 1.1.1.3 mrg 93 1.1.1.3 mrg template<__boxable _Tp> 94 1.1 mrg struct __box : std::optional<_Tp> 95 1.1 mrg { 96 1.1 mrg using std::optional<_Tp>::optional; 97 1.1 mrg 98 1.1 mrg constexpr 99 1.1 mrg __box() 100 1.1 mrg noexcept(is_nothrow_default_constructible_v<_Tp>) 101 1.1 mrg requires default_initializable<_Tp> 102 1.1 mrg : std::optional<_Tp>{std::in_place} 103 1.1 mrg { } 104 1.1 mrg 105 1.1 mrg __box(const __box&) = default; 106 1.1 mrg __box(__box&&) = default; 107 1.1 mrg 108 1.1 mrg using std::optional<_Tp>::operator=; 109 1.1 mrg 110 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 111 1.1 mrg // 3477. Simplify constraints for semiregular-box 112 1.1.1.3 mrg // 3572. copyable-box should be fully constexpr 113 1.1.1.3 mrg constexpr __box& 114 1.1 mrg operator=(const __box& __that) 115 1.1 mrg noexcept(is_nothrow_copy_constructible_v<_Tp>) 116 1.1 mrg requires (!copyable<_Tp>) 117 1.1 mrg { 118 1.1 mrg if (this != std::__addressof(__that)) 119 1.1 mrg { 120 1.1 mrg if ((bool)__that) 121 1.1 mrg this->emplace(*__that); 122 1.1 mrg else 123 1.1 mrg this->reset(); 124 1.1 mrg } 125 1.1 mrg return *this; 126 1.1 mrg } 127 1.1 mrg 128 1.1.1.3 mrg constexpr __box& 129 1.1 mrg operator=(__box&& __that) 130 1.1 mrg noexcept(is_nothrow_move_constructible_v<_Tp>) 131 1.1 mrg requires (!movable<_Tp>) 132 1.1 mrg { 133 1.1 mrg if (this != std::__addressof(__that)) 134 1.1 mrg { 135 1.1 mrg if ((bool)__that) 136 1.1 mrg this->emplace(std::move(*__that)); 137 1.1 mrg else 138 1.1 mrg this->reset(); 139 1.1 mrg } 140 1.1 mrg return *this; 141 1.1 mrg } 142 1.1 mrg }; 143 1.1 mrg 144 1.1.1.3 mrg // For types which are already copyable, this specialization of the 145 1.1.1.3 mrg // copyable wrapper stores the object directly without going through 146 1.1.1.3 mrg // std::optional. It provides just the subset of the primary template's 147 1.1.1.3 mrg // API that we currently use. 148 1.1.1.3 mrg template<__boxable _Tp> 149 1.1.1.3 mrg requires copyable<_Tp> || (is_nothrow_move_constructible_v<_Tp> 150 1.1.1.3 mrg && is_nothrow_copy_constructible_v<_Tp>) 151 1.1.1.3 mrg struct __box<_Tp> 152 1.1.1.3 mrg { 153 1.1.1.3 mrg private: 154 1.1.1.3 mrg [[no_unique_address]] _Tp _M_value = _Tp(); 155 1.1.1.3 mrg 156 1.1.1.3 mrg public: 157 1.1.1.3 mrg __box() requires default_initializable<_Tp> = default; 158 1.1.1.3 mrg 159 1.1.1.3 mrg constexpr explicit 160 1.1.1.3 mrg __box(const _Tp& __t) 161 1.1.1.3 mrg noexcept(is_nothrow_copy_constructible_v<_Tp>) 162 1.1.1.3 mrg : _M_value(__t) 163 1.1.1.3 mrg { } 164 1.1.1.3 mrg 165 1.1.1.3 mrg constexpr explicit 166 1.1.1.3 mrg __box(_Tp&& __t) 167 1.1.1.3 mrg noexcept(is_nothrow_move_constructible_v<_Tp>) 168 1.1.1.3 mrg : _M_value(std::move(__t)) 169 1.1.1.3 mrg { } 170 1.1.1.3 mrg 171 1.1.1.3 mrg template<typename... _Args> 172 1.1.1.3 mrg requires constructible_from<_Tp, _Args...> 173 1.1.1.3 mrg constexpr explicit 174 1.1.1.3 mrg __box(in_place_t, _Args&&... __args) 175 1.1.1.3 mrg noexcept(is_nothrow_constructible_v<_Tp, _Args...>) 176 1.1.1.3 mrg : _M_value(std::forward<_Args>(__args)...) 177 1.1.1.3 mrg { } 178 1.1.1.3 mrg 179 1.1.1.3 mrg __box(const __box&) = default; 180 1.1.1.3 mrg __box(__box&&) = default; 181 1.1.1.3 mrg __box& operator=(const __box&) requires copyable<_Tp> = default; 182 1.1.1.3 mrg __box& operator=(__box&&) requires copyable<_Tp> = default; 183 1.1.1.3 mrg 184 1.1.1.3 mrg // When _Tp is nothrow_copy_constructible but not copy_assignable, 185 1.1.1.3 mrg // copy assignment is implemented via destroy-then-copy-construct. 186 1.1.1.3 mrg constexpr __box& 187 1.1.1.3 mrg operator=(const __box& __that) noexcept 188 1.1.1.3 mrg { 189 1.1.1.3 mrg static_assert(is_nothrow_copy_constructible_v<_Tp>); 190 1.1.1.3 mrg if (this != std::__addressof(__that)) 191 1.1.1.3 mrg { 192 1.1.1.3 mrg _M_value.~_Tp(); 193 1.1.1.3 mrg std::construct_at(std::__addressof(_M_value), *__that); 194 1.1.1.3 mrg } 195 1.1.1.3 mrg return *this; 196 1.1.1.3 mrg } 197 1.1.1.3 mrg 198 1.1.1.3 mrg // Likewise for move assignment. 199 1.1.1.3 mrg constexpr __box& 200 1.1.1.3 mrg operator=(__box&& __that) noexcept 201 1.1.1.3 mrg { 202 1.1.1.3 mrg static_assert(is_nothrow_move_constructible_v<_Tp>); 203 1.1.1.3 mrg if (this != std::__addressof(__that)) 204 1.1.1.3 mrg { 205 1.1.1.3 mrg _M_value.~_Tp(); 206 1.1.1.3 mrg std::construct_at(std::__addressof(_M_value), std::move(*__that)); 207 1.1.1.3 mrg } 208 1.1.1.3 mrg return *this; 209 1.1.1.3 mrg } 210 1.1.1.3 mrg 211 1.1.1.3 mrg constexpr bool 212 1.1.1.3 mrg has_value() const noexcept 213 1.1.1.3 mrg { return true; }; 214 1.1.1.3 mrg 215 1.1.1.3 mrg constexpr _Tp& 216 1.1.1.3 mrg operator*() noexcept 217 1.1.1.3 mrg { return _M_value; } 218 1.1.1.3 mrg 219 1.1.1.3 mrg constexpr const _Tp& 220 1.1.1.3 mrg operator*() const noexcept 221 1.1.1.3 mrg { return _M_value; } 222 1.1.1.3 mrg 223 1.1.1.3 mrg constexpr _Tp* 224 1.1.1.3 mrg operator->() noexcept 225 1.1.1.3 mrg { return std::__addressof(_M_value); } 226 1.1.1.3 mrg 227 1.1.1.3 mrg constexpr const _Tp* 228 1.1.1.3 mrg operator->() const noexcept 229 1.1.1.3 mrg { return std::__addressof(_M_value); } 230 1.1.1.3 mrg }; 231 1.1 mrg } // namespace __detail 232 1.1 mrg 233 1.1 mrg /// A view that contains exactly one element. 234 1.1 mrg template<copy_constructible _Tp> requires is_object_v<_Tp> 235 1.1 mrg class single_view : public view_interface<single_view<_Tp>> 236 1.1 mrg { 237 1.1 mrg public: 238 1.1.1.3 mrg single_view() requires default_initializable<_Tp> = default; 239 1.1 mrg 240 1.1 mrg constexpr explicit 241 1.1 mrg single_view(const _Tp& __t) 242 1.1.1.3 mrg noexcept(is_nothrow_copy_constructible_v<_Tp>) 243 1.1 mrg : _M_value(__t) 244 1.1 mrg { } 245 1.1 mrg 246 1.1 mrg constexpr explicit 247 1.1 mrg single_view(_Tp&& __t) 248 1.1.1.3 mrg noexcept(is_nothrow_move_constructible_v<_Tp>) 249 1.1 mrg : _M_value(std::move(__t)) 250 1.1 mrg { } 251 1.1 mrg 252 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 253 1.1 mrg // 3428. single_view's in place constructor should be explicit 254 1.1 mrg template<typename... _Args> 255 1.1 mrg requires constructible_from<_Tp, _Args...> 256 1.1 mrg constexpr explicit 257 1.1 mrg single_view(in_place_t, _Args&&... __args) 258 1.1.1.3 mrg noexcept(is_nothrow_constructible_v<_Tp, _Args...>) 259 1.1 mrg : _M_value{in_place, std::forward<_Args>(__args)...} 260 1.1 mrg { } 261 1.1 mrg 262 1.1 mrg constexpr _Tp* 263 1.1 mrg begin() noexcept 264 1.1 mrg { return data(); } 265 1.1 mrg 266 1.1 mrg constexpr const _Tp* 267 1.1 mrg begin() const noexcept 268 1.1 mrg { return data(); } 269 1.1 mrg 270 1.1 mrg constexpr _Tp* 271 1.1 mrg end() noexcept 272 1.1 mrg { return data() + 1; } 273 1.1 mrg 274 1.1 mrg constexpr const _Tp* 275 1.1 mrg end() const noexcept 276 1.1 mrg { return data() + 1; } 277 1.1 mrg 278 1.1 mrg static constexpr size_t 279 1.1 mrg size() noexcept 280 1.1 mrg { return 1; } 281 1.1 mrg 282 1.1 mrg constexpr _Tp* 283 1.1 mrg data() noexcept 284 1.1 mrg { return _M_value.operator->(); } 285 1.1 mrg 286 1.1 mrg constexpr const _Tp* 287 1.1 mrg data() const noexcept 288 1.1 mrg { return _M_value.operator->(); } 289 1.1 mrg 290 1.1 mrg private: 291 1.1.1.3 mrg [[no_unique_address]] __detail::__box<_Tp> _M_value; 292 1.1 mrg }; 293 1.1 mrg 294 1.1.1.3 mrg template<typename _Tp> 295 1.1.1.3 mrg single_view(_Tp) -> single_view<_Tp>; 296 1.1.1.3 mrg 297 1.1 mrg namespace __detail 298 1.1 mrg { 299 1.1 mrg template<typename _Wp> 300 1.1 mrg constexpr auto __to_signed_like(_Wp __w) noexcept 301 1.1 mrg { 302 1.1 mrg if constexpr (!integral<_Wp>) 303 1.1 mrg return iter_difference_t<_Wp>(); 304 1.1 mrg else if constexpr (sizeof(iter_difference_t<_Wp>) > sizeof(_Wp)) 305 1.1 mrg return iter_difference_t<_Wp>(__w); 306 1.1 mrg else if constexpr (sizeof(ptrdiff_t) > sizeof(_Wp)) 307 1.1 mrg return ptrdiff_t(__w); 308 1.1 mrg else if constexpr (sizeof(long long) > sizeof(_Wp)) 309 1.1 mrg return (long long)(__w); 310 1.1 mrg #ifdef __SIZEOF_INT128__ 311 1.1 mrg else if constexpr (__SIZEOF_INT128__ > sizeof(_Wp)) 312 1.1 mrg return __int128(__w); 313 1.1 mrg #endif 314 1.1 mrg else 315 1.1 mrg return __max_diff_type(__w); 316 1.1 mrg } 317 1.1 mrg 318 1.1 mrg template<typename _Wp> 319 1.1 mrg using __iota_diff_t = decltype(__to_signed_like(std::declval<_Wp>())); 320 1.1 mrg 321 1.1 mrg template<typename _It> 322 1.1 mrg concept __decrementable = incrementable<_It> 323 1.1 mrg && requires(_It __i) 324 1.1 mrg { 325 1.1 mrg { --__i } -> same_as<_It&>; 326 1.1 mrg { __i-- } -> same_as<_It>; 327 1.1 mrg }; 328 1.1 mrg 329 1.1 mrg template<typename _It> 330 1.1 mrg concept __advanceable = __decrementable<_It> && totally_ordered<_It> 331 1.1 mrg && requires( _It __i, const _It __j, const __iota_diff_t<_It> __n) 332 1.1 mrg { 333 1.1 mrg { __i += __n } -> same_as<_It&>; 334 1.1 mrg { __i -= __n } -> same_as<_It&>; 335 1.1 mrg _It(__j + __n); 336 1.1 mrg _It(__n + __j); 337 1.1 mrg _It(__j - __n); 338 1.1 mrg { __j - __j } -> convertible_to<__iota_diff_t<_It>>; 339 1.1 mrg }; 340 1.1 mrg 341 1.1 mrg template<typename _Winc> 342 1.1 mrg struct __iota_view_iter_cat 343 1.1 mrg { }; 344 1.1 mrg 345 1.1 mrg template<incrementable _Winc> 346 1.1 mrg struct __iota_view_iter_cat<_Winc> 347 1.1 mrg { using iterator_category = input_iterator_tag; }; 348 1.1 mrg } // namespace __detail 349 1.1 mrg 350 1.1 mrg template<weakly_incrementable _Winc, 351 1.1 mrg semiregular _Bound = unreachable_sentinel_t> 352 1.1 mrg requires std::__detail::__weakly_eq_cmp_with<_Winc, _Bound> 353 1.1 mrg && copyable<_Winc> 354 1.1 mrg class iota_view : public view_interface<iota_view<_Winc, _Bound>> 355 1.1 mrg { 356 1.1 mrg private: 357 1.1 mrg struct _Sentinel; 358 1.1 mrg 359 1.1 mrg struct _Iterator : __detail::__iota_view_iter_cat<_Winc> 360 1.1 mrg { 361 1.1 mrg private: 362 1.1 mrg static auto 363 1.1 mrg _S_iter_concept() 364 1.1 mrg { 365 1.1 mrg using namespace __detail; 366 1.1 mrg if constexpr (__advanceable<_Winc>) 367 1.1 mrg return random_access_iterator_tag{}; 368 1.1 mrg else if constexpr (__decrementable<_Winc>) 369 1.1 mrg return bidirectional_iterator_tag{}; 370 1.1 mrg else if constexpr (incrementable<_Winc>) 371 1.1 mrg return forward_iterator_tag{}; 372 1.1 mrg else 373 1.1 mrg return input_iterator_tag{}; 374 1.1 mrg } 375 1.1 mrg 376 1.1 mrg public: 377 1.1 mrg using iterator_concept = decltype(_S_iter_concept()); 378 1.1 mrg // iterator_category defined in __iota_view_iter_cat 379 1.1 mrg using value_type = _Winc; 380 1.1 mrg using difference_type = __detail::__iota_diff_t<_Winc>; 381 1.1 mrg 382 1.1 mrg _Iterator() requires default_initializable<_Winc> = default; 383 1.1 mrg 384 1.1 mrg constexpr explicit 385 1.1 mrg _Iterator(_Winc __value) 386 1.1 mrg : _M_value(__value) { } 387 1.1 mrg 388 1.1 mrg constexpr _Winc 389 1.1 mrg operator*() const noexcept(is_nothrow_copy_constructible_v<_Winc>) 390 1.1 mrg { return _M_value; } 391 1.1 mrg 392 1.1 mrg constexpr _Iterator& 393 1.1 mrg operator++() 394 1.1 mrg { 395 1.1 mrg ++_M_value; 396 1.1 mrg return *this; 397 1.1 mrg } 398 1.1 mrg 399 1.1 mrg constexpr void 400 1.1 mrg operator++(int) 401 1.1 mrg { ++*this; } 402 1.1 mrg 403 1.1 mrg constexpr _Iterator 404 1.1 mrg operator++(int) requires incrementable<_Winc> 405 1.1 mrg { 406 1.1 mrg auto __tmp = *this; 407 1.1 mrg ++*this; 408 1.1 mrg return __tmp; 409 1.1 mrg } 410 1.1 mrg 411 1.1 mrg constexpr _Iterator& 412 1.1 mrg operator--() requires __detail::__decrementable<_Winc> 413 1.1 mrg { 414 1.1 mrg --_M_value; 415 1.1 mrg return *this; 416 1.1 mrg } 417 1.1 mrg 418 1.1 mrg constexpr _Iterator 419 1.1 mrg operator--(int) requires __detail::__decrementable<_Winc> 420 1.1 mrg { 421 1.1 mrg auto __tmp = *this; 422 1.1 mrg --*this; 423 1.1 mrg return __tmp; 424 1.1 mrg } 425 1.1 mrg 426 1.1 mrg constexpr _Iterator& 427 1.1 mrg operator+=(difference_type __n) requires __detail::__advanceable<_Winc> 428 1.1 mrg { 429 1.1 mrg using __detail::__is_integer_like; 430 1.1 mrg using __detail::__is_signed_integer_like; 431 1.1 mrg if constexpr (__is_integer_like<_Winc> 432 1.1 mrg && !__is_signed_integer_like<_Winc>) 433 1.1 mrg { 434 1.1 mrg if (__n >= difference_type(0)) 435 1.1 mrg _M_value += static_cast<_Winc>(__n); 436 1.1 mrg else 437 1.1 mrg _M_value -= static_cast<_Winc>(-__n); 438 1.1 mrg } 439 1.1 mrg else 440 1.1 mrg _M_value += __n; 441 1.1 mrg return *this; 442 1.1 mrg } 443 1.1 mrg 444 1.1 mrg constexpr _Iterator& 445 1.1 mrg operator-=(difference_type __n) requires __detail::__advanceable<_Winc> 446 1.1 mrg { 447 1.1 mrg using __detail::__is_integer_like; 448 1.1 mrg using __detail::__is_signed_integer_like; 449 1.1 mrg if constexpr (__is_integer_like<_Winc> 450 1.1 mrg && !__is_signed_integer_like<_Winc>) 451 1.1 mrg { 452 1.1 mrg if (__n >= difference_type(0)) 453 1.1 mrg _M_value -= static_cast<_Winc>(__n); 454 1.1 mrg else 455 1.1 mrg _M_value += static_cast<_Winc>(-__n); 456 1.1 mrg } 457 1.1 mrg else 458 1.1 mrg _M_value -= __n; 459 1.1 mrg return *this; 460 1.1 mrg } 461 1.1 mrg 462 1.1 mrg constexpr _Winc 463 1.1 mrg operator[](difference_type __n) const 464 1.1 mrg requires __detail::__advanceable<_Winc> 465 1.1 mrg { return _Winc(_M_value + __n); } 466 1.1 mrg 467 1.1 mrg friend constexpr bool 468 1.1 mrg operator==(const _Iterator& __x, const _Iterator& __y) 469 1.1 mrg requires equality_comparable<_Winc> 470 1.1 mrg { return __x._M_value == __y._M_value; } 471 1.1 mrg 472 1.1 mrg friend constexpr bool 473 1.1 mrg operator<(const _Iterator& __x, const _Iterator& __y) 474 1.1 mrg requires totally_ordered<_Winc> 475 1.1 mrg { return __x._M_value < __y._M_value; } 476 1.1 mrg 477 1.1 mrg friend constexpr bool 478 1.1 mrg operator>(const _Iterator& __x, const _Iterator& __y) 479 1.1 mrg requires totally_ordered<_Winc> 480 1.1 mrg { return __y < __x; } 481 1.1 mrg 482 1.1 mrg friend constexpr bool 483 1.1 mrg operator<=(const _Iterator& __x, const _Iterator& __y) 484 1.1 mrg requires totally_ordered<_Winc> 485 1.1 mrg { return !(__y < __x); } 486 1.1 mrg 487 1.1 mrg friend constexpr bool 488 1.1 mrg operator>=(const _Iterator& __x, const _Iterator& __y) 489 1.1 mrg requires totally_ordered<_Winc> 490 1.1 mrg { return !(__x < __y); } 491 1.1 mrg 492 1.1 mrg #ifdef __cpp_lib_three_way_comparison 493 1.1 mrg friend constexpr auto 494 1.1 mrg operator<=>(const _Iterator& __x, const _Iterator& __y) 495 1.1 mrg requires totally_ordered<_Winc> && three_way_comparable<_Winc> 496 1.1 mrg { return __x._M_value <=> __y._M_value; } 497 1.1 mrg #endif 498 1.1 mrg 499 1.1 mrg friend constexpr _Iterator 500 1.1 mrg operator+(_Iterator __i, difference_type __n) 501 1.1 mrg requires __detail::__advanceable<_Winc> 502 1.1.1.3 mrg { 503 1.1.1.3 mrg __i += __n; 504 1.1.1.3 mrg return __i; 505 1.1.1.3 mrg } 506 1.1 mrg 507 1.1 mrg friend constexpr _Iterator 508 1.1 mrg operator+(difference_type __n, _Iterator __i) 509 1.1 mrg requires __detail::__advanceable<_Winc> 510 1.1 mrg { return __i += __n; } 511 1.1 mrg 512 1.1 mrg friend constexpr _Iterator 513 1.1 mrg operator-(_Iterator __i, difference_type __n) 514 1.1 mrg requires __detail::__advanceable<_Winc> 515 1.1.1.3 mrg { 516 1.1.1.3 mrg __i -= __n; 517 1.1.1.3 mrg return __i; 518 1.1.1.3 mrg } 519 1.1 mrg 520 1.1 mrg friend constexpr difference_type 521 1.1 mrg operator-(const _Iterator& __x, const _Iterator& __y) 522 1.1 mrg requires __detail::__advanceable<_Winc> 523 1.1 mrg { 524 1.1 mrg using __detail::__is_integer_like; 525 1.1 mrg using __detail::__is_signed_integer_like; 526 1.1 mrg using _Dt = difference_type; 527 1.1 mrg if constexpr (__is_integer_like<_Winc>) 528 1.1 mrg { 529 1.1 mrg if constexpr (__is_signed_integer_like<_Winc>) 530 1.1 mrg return _Dt(_Dt(__x._M_value) - _Dt(__y._M_value)); 531 1.1 mrg else 532 1.1 mrg return (__y._M_value > __x._M_value) 533 1.1 mrg ? _Dt(-_Dt(__y._M_value - __x._M_value)) 534 1.1 mrg : _Dt(__x._M_value - __y._M_value); 535 1.1 mrg } 536 1.1 mrg else 537 1.1 mrg return __x._M_value - __y._M_value; 538 1.1 mrg } 539 1.1 mrg 540 1.1 mrg private: 541 1.1 mrg _Winc _M_value = _Winc(); 542 1.1 mrg 543 1.1.1.3 mrg friend iota_view; 544 1.1 mrg friend _Sentinel; 545 1.1 mrg }; 546 1.1 mrg 547 1.1 mrg struct _Sentinel 548 1.1 mrg { 549 1.1 mrg private: 550 1.1 mrg constexpr bool 551 1.1 mrg _M_equal(const _Iterator& __x) const 552 1.1 mrg { return __x._M_value == _M_bound; } 553 1.1 mrg 554 1.1 mrg constexpr auto 555 1.1 mrg _M_distance_from(const _Iterator& __x) const 556 1.1 mrg { return _M_bound - __x._M_value; } 557 1.1 mrg 558 1.1 mrg _Bound _M_bound = _Bound(); 559 1.1 mrg 560 1.1 mrg public: 561 1.1 mrg _Sentinel() = default; 562 1.1 mrg 563 1.1 mrg constexpr explicit 564 1.1 mrg _Sentinel(_Bound __bound) 565 1.1 mrg : _M_bound(__bound) { } 566 1.1 mrg 567 1.1 mrg friend constexpr bool 568 1.1 mrg operator==(const _Iterator& __x, const _Sentinel& __y) 569 1.1 mrg { return __y._M_equal(__x); } 570 1.1 mrg 571 1.1 mrg friend constexpr iter_difference_t<_Winc> 572 1.1 mrg operator-(const _Iterator& __x, const _Sentinel& __y) 573 1.1 mrg requires sized_sentinel_for<_Bound, _Winc> 574 1.1 mrg { return -__y._M_distance_from(__x); } 575 1.1 mrg 576 1.1 mrg friend constexpr iter_difference_t<_Winc> 577 1.1 mrg operator-(const _Sentinel& __x, const _Iterator& __y) 578 1.1 mrg requires sized_sentinel_for<_Bound, _Winc> 579 1.1 mrg { return __x._M_distance_from(__y); } 580 1.1.1.3 mrg 581 1.1.1.3 mrg friend iota_view; 582 1.1 mrg }; 583 1.1 mrg 584 1.1 mrg _Winc _M_value = _Winc(); 585 1.1.1.3 mrg [[no_unique_address]] _Bound _M_bound = _Bound(); 586 1.1 mrg 587 1.1 mrg public: 588 1.1 mrg iota_view() requires default_initializable<_Winc> = default; 589 1.1 mrg 590 1.1 mrg constexpr explicit 591 1.1 mrg iota_view(_Winc __value) 592 1.1 mrg : _M_value(__value) 593 1.1 mrg { } 594 1.1 mrg 595 1.1 mrg constexpr 596 1.1 mrg iota_view(type_identity_t<_Winc> __value, 597 1.1 mrg type_identity_t<_Bound> __bound) 598 1.1 mrg : _M_value(__value), _M_bound(__bound) 599 1.1 mrg { 600 1.1 mrg if constexpr (totally_ordered_with<_Winc, _Bound>) 601 1.1.1.3 mrg __glibcxx_assert( bool(__value <= __bound) ); 602 1.1 mrg } 603 1.1 mrg 604 1.1.1.3 mrg constexpr 605 1.1.1.3 mrg iota_view(_Iterator __first, _Iterator __last) 606 1.1.1.3 mrg requires same_as<_Winc, _Bound> 607 1.1.1.3 mrg : iota_view(__first._M_value, __last._M_value) 608 1.1.1.3 mrg { } 609 1.1.1.3 mrg 610 1.1.1.3 mrg constexpr 611 1.1.1.3 mrg iota_view(_Iterator __first, unreachable_sentinel_t __last) 612 1.1.1.3 mrg requires same_as<_Bound, unreachable_sentinel_t> 613 1.1.1.3 mrg : iota_view(__first._M_value, __last) 614 1.1.1.3 mrg { } 615 1.1.1.3 mrg 616 1.1.1.3 mrg constexpr 617 1.1.1.3 mrg iota_view(_Iterator __first, _Sentinel __last) 618 1.1.1.3 mrg requires (!same_as<_Winc, _Bound>) && (!same_as<_Bound, unreachable_sentinel_t>) 619 1.1.1.3 mrg : iota_view(__first._M_value, __last._M_bound) 620 1.1.1.3 mrg { } 621 1.1.1.3 mrg 622 1.1 mrg constexpr _Iterator 623 1.1 mrg begin() const { return _Iterator{_M_value}; } 624 1.1 mrg 625 1.1 mrg constexpr auto 626 1.1 mrg end() const 627 1.1 mrg { 628 1.1 mrg if constexpr (same_as<_Bound, unreachable_sentinel_t>) 629 1.1 mrg return unreachable_sentinel; 630 1.1 mrg else 631 1.1 mrg return _Sentinel{_M_bound}; 632 1.1 mrg } 633 1.1 mrg 634 1.1 mrg constexpr _Iterator 635 1.1 mrg end() const requires same_as<_Winc, _Bound> 636 1.1 mrg { return _Iterator{_M_bound}; } 637 1.1 mrg 638 1.1 mrg constexpr auto 639 1.1 mrg size() const 640 1.1 mrg requires (same_as<_Winc, _Bound> && __detail::__advanceable<_Winc>) 641 1.1 mrg || (integral<_Winc> && integral<_Bound>) 642 1.1 mrg || sized_sentinel_for<_Bound, _Winc> 643 1.1 mrg { 644 1.1 mrg using __detail::__is_integer_like; 645 1.1 mrg using __detail::__to_unsigned_like; 646 1.1 mrg if constexpr (integral<_Winc> && integral<_Bound>) 647 1.1 mrg { 648 1.1 mrg using _Up = make_unsigned_t<decltype(_M_bound - _M_value)>; 649 1.1 mrg return _Up(_M_bound) - _Up(_M_value); 650 1.1 mrg } 651 1.1 mrg else if constexpr (__is_integer_like<_Winc>) 652 1.1 mrg return __to_unsigned_like(_M_bound) - __to_unsigned_like(_M_value); 653 1.1 mrg else 654 1.1 mrg return __to_unsigned_like(_M_bound - _M_value); 655 1.1 mrg } 656 1.1 mrg }; 657 1.1 mrg 658 1.1 mrg template<typename _Winc, typename _Bound> 659 1.1 mrg requires (!__detail::__is_integer_like<_Winc> 660 1.1 mrg || !__detail::__is_integer_like<_Bound> 661 1.1 mrg || (__detail::__is_signed_integer_like<_Winc> 662 1.1 mrg == __detail::__is_signed_integer_like<_Bound>)) 663 1.1 mrg iota_view(_Winc, _Bound) -> iota_view<_Winc, _Bound>; 664 1.1 mrg 665 1.1.1.3 mrg template<typename _Winc, typename _Bound> 666 1.1 mrg inline constexpr bool 667 1.1 mrg enable_borrowed_range<iota_view<_Winc, _Bound>> = true; 668 1.1 mrg 669 1.1 mrg namespace views 670 1.1 mrg { 671 1.1 mrg template<typename _Tp> 672 1.1 mrg inline constexpr empty_view<_Tp> empty{}; 673 1.1 mrg 674 1.1.1.3 mrg namespace __detail 675 1.1 mrg { 676 1.1 mrg template<typename _Tp> 677 1.1.1.3 mrg concept __can_single_view 678 1.1.1.3 mrg = requires { single_view<decay_t<_Tp>>(std::declval<_Tp>()); }; 679 1.1.1.3 mrg } // namespace __detail 680 1.1.1.3 mrg 681 1.1.1.3 mrg struct _Single 682 1.1.1.3 mrg { 683 1.1.1.3 mrg template<__detail::__can_single_view _Tp> 684 1.1 mrg constexpr auto 685 1.1.1.3 mrg operator() [[nodiscard]] (_Tp&& __e) const 686 1.1.1.3 mrg noexcept(noexcept(single_view<decay_t<_Tp>>(std::forward<_Tp>(__e)))) 687 1.1.1.3 mrg { return single_view<decay_t<_Tp>>(std::forward<_Tp>(__e)); } 688 1.1 mrg }; 689 1.1 mrg 690 1.1 mrg inline constexpr _Single single{}; 691 1.1 mrg 692 1.1.1.3 mrg namespace __detail 693 1.1.1.3 mrg { 694 1.1.1.3 mrg template<typename... _Args> 695 1.1.1.3 mrg concept __can_iota_view = requires { iota_view(std::declval<_Args>()...); }; 696 1.1.1.3 mrg } // namespace __detail 697 1.1.1.3 mrg 698 1.1 mrg struct _Iota 699 1.1 mrg { 700 1.1.1.3 mrg template<__detail::__can_iota_view _Tp> 701 1.1 mrg constexpr auto 702 1.1.1.3 mrg operator() [[nodiscard]] (_Tp&& __e) const 703 1.1.1.3 mrg { return iota_view(std::forward<_Tp>(__e)); } 704 1.1 mrg 705 1.1 mrg template<typename _Tp, typename _Up> 706 1.1.1.3 mrg requires __detail::__can_iota_view<_Tp, _Up> 707 1.1 mrg constexpr auto 708 1.1.1.3 mrg operator() [[nodiscard]] (_Tp&& __e, _Up&& __f) const 709 1.1.1.3 mrg { return iota_view(std::forward<_Tp>(__e), std::forward<_Up>(__f)); } 710 1.1 mrg }; 711 1.1 mrg 712 1.1 mrg inline constexpr _Iota iota{}; 713 1.1 mrg } // namespace views 714 1.1 mrg 715 1.1 mrg namespace __detail 716 1.1 mrg { 717 1.1 mrg template<typename _Val, typename _CharT, typename _Traits> 718 1.1 mrg concept __stream_extractable 719 1.1 mrg = requires(basic_istream<_CharT, _Traits>& is, _Val& t) { is >> t; }; 720 1.1 mrg } // namespace __detail 721 1.1 mrg 722 1.1 mrg template<movable _Val, typename _CharT, 723 1.1 mrg typename _Traits = char_traits<_CharT>> 724 1.1 mrg requires default_initializable<_Val> 725 1.1 mrg && __detail::__stream_extractable<_Val, _CharT, _Traits> 726 1.1 mrg class basic_istream_view 727 1.1 mrg : public view_interface<basic_istream_view<_Val, _CharT, _Traits>> 728 1.1 mrg { 729 1.1 mrg public: 730 1.1 mrg constexpr explicit 731 1.1 mrg basic_istream_view(basic_istream<_CharT, _Traits>& __stream) 732 1.1 mrg : _M_stream(std::__addressof(__stream)) 733 1.1 mrg { } 734 1.1 mrg 735 1.1 mrg constexpr auto 736 1.1 mrg begin() 737 1.1 mrg { 738 1.1.1.3 mrg *_M_stream >> _M_object; 739 1.1 mrg return _Iterator{this}; 740 1.1 mrg } 741 1.1 mrg 742 1.1 mrg constexpr default_sentinel_t 743 1.1 mrg end() const noexcept 744 1.1 mrg { return default_sentinel; } 745 1.1 mrg 746 1.1 mrg private: 747 1.1.1.3 mrg basic_istream<_CharT, _Traits>* _M_stream; 748 1.1 mrg _Val _M_object = _Val(); 749 1.1 mrg 750 1.1 mrg struct _Iterator 751 1.1 mrg { 752 1.1 mrg public: 753 1.1 mrg using iterator_concept = input_iterator_tag; 754 1.1 mrg using difference_type = ptrdiff_t; 755 1.1 mrg using value_type = _Val; 756 1.1 mrg 757 1.1 mrg constexpr explicit 758 1.1 mrg _Iterator(basic_istream_view* __parent) noexcept 759 1.1 mrg : _M_parent(__parent) 760 1.1 mrg { } 761 1.1 mrg 762 1.1 mrg _Iterator(const _Iterator&) = delete; 763 1.1 mrg _Iterator(_Iterator&&) = default; 764 1.1 mrg _Iterator& operator=(const _Iterator&) = delete; 765 1.1 mrg _Iterator& operator=(_Iterator&&) = default; 766 1.1 mrg 767 1.1 mrg _Iterator& 768 1.1 mrg operator++() 769 1.1 mrg { 770 1.1 mrg *_M_parent->_M_stream >> _M_parent->_M_object; 771 1.1 mrg return *this; 772 1.1 mrg } 773 1.1 mrg 774 1.1 mrg void 775 1.1 mrg operator++(int) 776 1.1 mrg { ++*this; } 777 1.1 mrg 778 1.1 mrg _Val& 779 1.1 mrg operator*() const 780 1.1.1.3 mrg { return _M_parent->_M_object; } 781 1.1 mrg 782 1.1 mrg friend bool 783 1.1 mrg operator==(const _Iterator& __x, default_sentinel_t) 784 1.1 mrg { return __x._M_at_end(); } 785 1.1 mrg 786 1.1 mrg private: 787 1.1.1.3 mrg basic_istream_view* _M_parent; 788 1.1 mrg 789 1.1 mrg bool 790 1.1 mrg _M_at_end() const 791 1.1.1.3 mrg { return !*_M_parent->_M_stream; } 792 1.1 mrg }; 793 1.1 mrg 794 1.1 mrg friend _Iterator; 795 1.1 mrg }; 796 1.1 mrg 797 1.1.1.3 mrg template<typename _Val> 798 1.1.1.3 mrg using istream_view = basic_istream_view<_Val, char>; 799 1.1.1.3 mrg 800 1.1.1.3 mrg template<typename _Val> 801 1.1.1.3 mrg using wistream_view = basic_istream_view<_Val, wchar_t>; 802 1.1.1.3 mrg 803 1.1.1.3 mrg namespace views 804 1.1.1.3 mrg { 805 1.1.1.3 mrg namespace __detail 806 1.1.1.3 mrg { 807 1.1.1.3 mrg template<typename _Tp, typename _Up> 808 1.1.1.3 mrg concept __can_istream_view = requires (_Up __e) { 809 1.1.1.3 mrg basic_istream_view<_Tp, typename _Up::char_type, typename _Up::traits_type>(__e); 810 1.1.1.3 mrg }; 811 1.1.1.3 mrg } // namespace __detail 812 1.1.1.3 mrg 813 1.1.1.3 mrg template<typename _Tp> 814 1.1.1.3 mrg struct _Istream 815 1.1.1.3 mrg { 816 1.1.1.3 mrg template<typename _CharT, typename _Traits> 817 1.1.1.3 mrg constexpr auto 818 1.1.1.3 mrg operator() [[nodiscard]] (basic_istream<_CharT, _Traits>& __e) const 819 1.1.1.3 mrg requires __detail::__can_istream_view<_Tp, remove_reference_t<decltype(__e)>> 820 1.1.1.3 mrg { return basic_istream_view<_Tp, _CharT, _Traits>(__e); } 821 1.1.1.3 mrg }; 822 1.1.1.3 mrg 823 1.1.1.3 mrg template<typename _Tp> 824 1.1.1.3 mrg inline constexpr _Istream<_Tp> istream; 825 1.1.1.3 mrg } 826 1.1.1.3 mrg 827 1.1.1.3 mrg // C++20 24.7 [range.adaptors] Range adaptors 828 1.1 mrg 829 1.1 mrg namespace __detail 830 1.1 mrg { 831 1.1 mrg struct _Empty { }; 832 1.1 mrg 833 1.1 mrg // Alias for a type that is conditionally present 834 1.1 mrg // (and is an empty type otherwise). 835 1.1 mrg // Data members using this alias should use [[no_unique_address]] so that 836 1.1 mrg // they take no space when not needed. 837 1.1 mrg template<bool _Present, typename _Tp> 838 1.1.1.3 mrg using __maybe_present_t = __conditional_t<_Present, _Tp, _Empty>; 839 1.1 mrg 840 1.1 mrg // Alias for a type that is conditionally const. 841 1.1 mrg template<bool _Const, typename _Tp> 842 1.1.1.3 mrg using __maybe_const_t = __conditional_t<_Const, const _Tp, _Tp>; 843 1.1 mrg 844 1.1 mrg } // namespace __detail 845 1.1 mrg 846 1.1.1.3 mrg namespace views::__adaptor 847 1.1 mrg { 848 1.1.1.3 mrg // True if the range adaptor _Adaptor can be applied with _Args. 849 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 850 1.1.1.3 mrg concept __adaptor_invocable 851 1.1.1.3 mrg = requires { std::declval<_Adaptor>()(declval<_Args>()...); }; 852 1.1.1.3 mrg 853 1.1.1.3 mrg // True if the range adaptor non-closure _Adaptor can be partially applied 854 1.1.1.3 mrg // with _Args. 855 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 856 1.1.1.3 mrg concept __adaptor_partial_app_viable = (_Adaptor::_S_arity > 1) 857 1.1.1.3 mrg && (sizeof...(_Args) == _Adaptor::_S_arity - 1) 858 1.1.1.3 mrg && (constructible_from<decay_t<_Args>, _Args> && ...); 859 1.1.1.3 mrg 860 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 861 1.1.1.3 mrg struct _Partial; 862 1.1.1.3 mrg 863 1.1.1.3 mrg template<typename _Lhs, typename _Rhs> 864 1.1.1.3 mrg struct _Pipe; 865 1.1.1.3 mrg 866 1.1.1.3 mrg // The base class of every range adaptor closure. 867 1.1.1.3 mrg // 868 1.1.1.3 mrg // The derived class should define the optional static data member 869 1.1.1.3 mrg // _S_has_simple_call_op to true if the behavior of this adaptor is 870 1.1.1.3 mrg // independent of the constness/value category of the adaptor object. 871 1.1.1.3 mrg struct _RangeAdaptorClosure 872 1.1 mrg { 873 1.1.1.3 mrg // range | adaptor is equivalent to adaptor(range). 874 1.1.1.3 mrg template<typename _Self, typename _Range> 875 1.1.1.3 mrg requires derived_from<remove_cvref_t<_Self>, _RangeAdaptorClosure> 876 1.1.1.3 mrg && __adaptor_invocable<_Self, _Range> 877 1.1.1.3 mrg friend constexpr auto 878 1.1.1.3 mrg operator|(_Range&& __r, _Self&& __self) 879 1.1.1.3 mrg { return std::forward<_Self>(__self)(std::forward<_Range>(__r)); } 880 1.1.1.3 mrg 881 1.1.1.3 mrg // Compose the adaptors __lhs and __rhs into a pipeline, returning 882 1.1.1.3 mrg // another range adaptor closure object. 883 1.1.1.3 mrg template<typename _Lhs, typename _Rhs> 884 1.1.1.3 mrg requires derived_from<_Lhs, _RangeAdaptorClosure> 885 1.1.1.3 mrg && derived_from<_Rhs, _RangeAdaptorClosure> 886 1.1.1.3 mrg friend constexpr auto 887 1.1.1.3 mrg operator|(_Lhs __lhs, _Rhs __rhs) 888 1.1.1.3 mrg { return _Pipe<_Lhs, _Rhs>{std::move(__lhs), std::move(__rhs)}; } 889 1.1.1.3 mrg }; 890 1.1 mrg 891 1.1.1.3 mrg // The base class of every range adaptor non-closure. 892 1.1.1.3 mrg // 893 1.1.1.3 mrg // The static data member _Derived::_S_arity must contain the total number of 894 1.1.1.3 mrg // arguments that the adaptor takes, and the class _Derived must introduce 895 1.1.1.3 mrg // _RangeAdaptor::operator() into the class scope via a using-declaration. 896 1.1.1.3 mrg // 897 1.1.1.3 mrg // The optional static data member _Derived::_S_has_simple_extra_args should 898 1.1.1.3 mrg // be defined to true if the behavior of this adaptor is independent of the 899 1.1.1.3 mrg // constness/value category of the extra arguments. This data member could 900 1.1.1.3 mrg // also be defined as a variable template parameterized by the types of the 901 1.1.1.3 mrg // extra arguments. 902 1.1.1.3 mrg template<typename _Derived> 903 1.1.1.3 mrg struct _RangeAdaptor 904 1.1.1.3 mrg { 905 1.1.1.3 mrg // Partially apply the arguments __args to the range adaptor _Derived, 906 1.1.1.3 mrg // returning a range adaptor closure object. 907 1.1.1.3 mrg template<typename... _Args> 908 1.1.1.3 mrg requires __adaptor_partial_app_viable<_Derived, _Args...> 909 1.1.1.3 mrg constexpr auto 910 1.1.1.3 mrg operator()(_Args&&... __args) const 911 1.1.1.3 mrg { 912 1.1.1.3 mrg return _Partial<_Derived, decay_t<_Args>...>{std::forward<_Args>(__args)...}; 913 1.1.1.3 mrg } 914 1.1.1.3 mrg }; 915 1.1 mrg 916 1.1.1.3 mrg // True if the range adaptor closure _Adaptor has a simple operator(), i.e. 917 1.1.1.3 mrg // one that's not overloaded according to constness or value category of the 918 1.1.1.3 mrg // _Adaptor object. 919 1.1.1.3 mrg template<typename _Adaptor> 920 1.1.1.3 mrg concept __closure_has_simple_call_op = _Adaptor::_S_has_simple_call_op; 921 1.1.1.3 mrg 922 1.1.1.3 mrg // True if the behavior of the range adaptor non-closure _Adaptor is 923 1.1.1.3 mrg // independent of the value category of its extra arguments _Args. 924 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 925 1.1.1.3 mrg concept __adaptor_has_simple_extra_args = _Adaptor::_S_has_simple_extra_args 926 1.1.1.3 mrg || _Adaptor::template _S_has_simple_extra_args<_Args...>; 927 1.1.1.3 mrg 928 1.1.1.3 mrg // A range adaptor closure that represents partial application of 929 1.1.1.3 mrg // the range adaptor _Adaptor with arguments _Args. 930 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 931 1.1.1.3 mrg struct _Partial : _RangeAdaptorClosure 932 1.1.1.3 mrg { 933 1.1.1.3 mrg tuple<_Args...> _M_args; 934 1.1 mrg 935 1.1.1.3 mrg constexpr 936 1.1.1.3 mrg _Partial(_Args... __args) 937 1.1.1.3 mrg : _M_args(std::move(__args)...) 938 1.1.1.3 mrg { } 939 1.1 mrg 940 1.1.1.3 mrg // Invoke _Adaptor with arguments __r, _M_args... according to the 941 1.1.1.3 mrg // value category of this _Partial object. 942 1.1.1.3 mrg template<typename _Range> 943 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, const _Args&...> 944 1.1.1.3 mrg constexpr auto 945 1.1.1.3 mrg operator()(_Range&& __r) const & 946 1.1.1.3 mrg { 947 1.1.1.3 mrg auto __forwarder = [&__r] (const auto&... __args) { 948 1.1.1.3 mrg return _Adaptor{}(std::forward<_Range>(__r), __args...); 949 1.1.1.3 mrg }; 950 1.1.1.3 mrg return std::apply(__forwarder, _M_args); 951 1.1.1.3 mrg } 952 1.1 mrg 953 1.1.1.3 mrg template<typename _Range> 954 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, _Args...> 955 1.1.1.3 mrg constexpr auto 956 1.1.1.3 mrg operator()(_Range&& __r) && 957 1.1.1.3 mrg { 958 1.1.1.3 mrg auto __forwarder = [&__r] (auto&... __args) { 959 1.1.1.3 mrg return _Adaptor{}(std::forward<_Range>(__r), std::move(__args)...); 960 1.1.1.3 mrg }; 961 1.1.1.3 mrg return std::apply(__forwarder, _M_args); 962 1.1.1.3 mrg } 963 1.1 mrg 964 1.1.1.3 mrg template<typename _Range> 965 1.1.1.3 mrg constexpr auto 966 1.1.1.3 mrg operator()(_Range&& __r) const && = delete; 967 1.1.1.3 mrg }; 968 1.1 mrg 969 1.1.1.3 mrg // A lightweight specialization of the above primary template for 970 1.1.1.3 mrg // the common case where _Adaptor accepts a single extra argument. 971 1.1.1.3 mrg template<typename _Adaptor, typename _Arg> 972 1.1.1.3 mrg struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure 973 1.1.1.3 mrg { 974 1.1.1.3 mrg _Arg _M_arg; 975 1.1 mrg 976 1.1.1.3 mrg constexpr 977 1.1.1.3 mrg _Partial(_Arg __arg) 978 1.1.1.3 mrg : _M_arg(std::move(__arg)) 979 1.1.1.3 mrg { } 980 1.1 mrg 981 1.1.1.3 mrg template<typename _Range> 982 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, const _Arg&> 983 1.1.1.3 mrg constexpr auto 984 1.1.1.3 mrg operator()(_Range&& __r) const & 985 1.1.1.3 mrg { return _Adaptor{}(std::forward<_Range>(__r), _M_arg); } 986 1.1 mrg 987 1.1.1.3 mrg template<typename _Range> 988 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, _Arg> 989 1.1.1.3 mrg constexpr auto 990 1.1.1.3 mrg operator()(_Range&& __r) && 991 1.1.1.3 mrg { return _Adaptor{}(std::forward<_Range>(__r), std::move(_M_arg)); } 992 1.1 mrg 993 1.1.1.3 mrg template<typename _Range> 994 1.1.1.3 mrg constexpr auto 995 1.1.1.3 mrg operator()(_Range&& __r) const && = delete; 996 1.1.1.3 mrg }; 997 1.1.1.3 mrg 998 1.1.1.3 mrg // Partial specialization of the primary template for the case where the extra 999 1.1.1.3 mrg // arguments of the adaptor can always be safely and efficiently forwarded by 1000 1.1.1.3 mrg // const reference. This lets us get away with a single operator() overload, 1001 1.1.1.3 mrg // which makes overload resolution failure diagnostics more concise. 1002 1.1.1.3 mrg template<typename _Adaptor, typename... _Args> 1003 1.1.1.3 mrg requires __adaptor_has_simple_extra_args<_Adaptor, _Args...> 1004 1.1.1.3 mrg && (is_trivially_copyable_v<_Args> && ...) 1005 1.1.1.3 mrg struct _Partial<_Adaptor, _Args...> : _RangeAdaptorClosure 1006 1.1.1.3 mrg { 1007 1.1.1.3 mrg tuple<_Args...> _M_args; 1008 1.1.1.3 mrg 1009 1.1.1.3 mrg constexpr 1010 1.1.1.3 mrg _Partial(_Args... __args) 1011 1.1.1.3 mrg : _M_args(std::move(__args)...) 1012 1.1.1.3 mrg { } 1013 1.1.1.3 mrg 1014 1.1.1.3 mrg // Invoke _Adaptor with arguments __r, const _M_args&... regardless 1015 1.1.1.3 mrg // of the value category of this _Partial object. 1016 1.1.1.3 mrg template<typename _Range> 1017 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, const _Args&...> 1018 1.1.1.3 mrg constexpr auto 1019 1.1.1.3 mrg operator()(_Range&& __r) const 1020 1.1.1.3 mrg { 1021 1.1.1.3 mrg auto __forwarder = [&__r] (const auto&... __args) { 1022 1.1.1.3 mrg return _Adaptor{}(std::forward<_Range>(__r), __args...); 1023 1.1.1.3 mrg }; 1024 1.1.1.3 mrg return std::apply(__forwarder, _M_args); 1025 1.1.1.3 mrg } 1026 1.1.1.3 mrg 1027 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 1028 1.1.1.3 mrg }; 1029 1.1.1.3 mrg 1030 1.1.1.3 mrg // A lightweight specialization of the above template for the common case 1031 1.1.1.3 mrg // where _Adaptor accepts a single extra argument. 1032 1.1.1.3 mrg template<typename _Adaptor, typename _Arg> 1033 1.1.1.3 mrg requires __adaptor_has_simple_extra_args<_Adaptor, _Arg> 1034 1.1.1.3 mrg && is_trivially_copyable_v<_Arg> 1035 1.1.1.3 mrg struct _Partial<_Adaptor, _Arg> : _RangeAdaptorClosure 1036 1.1.1.3 mrg { 1037 1.1.1.3 mrg _Arg _M_arg; 1038 1.1.1.3 mrg 1039 1.1.1.3 mrg constexpr 1040 1.1.1.3 mrg _Partial(_Arg __arg) 1041 1.1.1.3 mrg : _M_arg(std::move(__arg)) 1042 1.1.1.3 mrg { } 1043 1.1.1.3 mrg 1044 1.1.1.3 mrg template<typename _Range> 1045 1.1.1.3 mrg requires __adaptor_invocable<_Adaptor, _Range, const _Arg&> 1046 1.1.1.3 mrg constexpr auto 1047 1.1.1.3 mrg operator()(_Range&& __r) const 1048 1.1.1.3 mrg { return _Adaptor{}(std::forward<_Range>(__r), _M_arg); } 1049 1.1.1.3 mrg 1050 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 1051 1.1.1.3 mrg }; 1052 1.1.1.3 mrg 1053 1.1.1.3 mrg template<typename _Lhs, typename _Rhs, typename _Range> 1054 1.1.1.3 mrg concept __pipe_invocable 1055 1.1.1.3 mrg = requires { std::declval<_Rhs>()(std::declval<_Lhs>()(std::declval<_Range>())); }; 1056 1.1.1.3 mrg 1057 1.1.1.3 mrg // A range adaptor closure that represents composition of the range 1058 1.1.1.3 mrg // adaptor closures _Lhs and _Rhs. 1059 1.1.1.3 mrg template<typename _Lhs, typename _Rhs> 1060 1.1.1.3 mrg struct _Pipe : _RangeAdaptorClosure 1061 1.1.1.3 mrg { 1062 1.1.1.3 mrg [[no_unique_address]] _Lhs _M_lhs; 1063 1.1.1.3 mrg [[no_unique_address]] _Rhs _M_rhs; 1064 1.1.1.3 mrg 1065 1.1.1.3 mrg constexpr 1066 1.1.1.3 mrg _Pipe(_Lhs __lhs, _Rhs __rhs) 1067 1.1.1.3 mrg : _M_lhs(std::move(__lhs)), _M_rhs(std::move(__rhs)) 1068 1.1.1.3 mrg { } 1069 1.1.1.3 mrg 1070 1.1.1.3 mrg // Invoke _M_rhs(_M_lhs(__r)) according to the value category of this 1071 1.1.1.3 mrg // range adaptor closure object. 1072 1.1.1.3 mrg template<typename _Range> 1073 1.1.1.3 mrg requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range> 1074 1.1.1.3 mrg constexpr auto 1075 1.1.1.3 mrg operator()(_Range&& __r) const & 1076 1.1.1.3 mrg { return _M_rhs(_M_lhs(std::forward<_Range>(__r))); } 1077 1.1.1.3 mrg 1078 1.1.1.3 mrg template<typename _Range> 1079 1.1.1.3 mrg requires __pipe_invocable<_Lhs, _Rhs, _Range> 1080 1.1.1.3 mrg constexpr auto 1081 1.1.1.3 mrg operator()(_Range&& __r) && 1082 1.1.1.3 mrg { return std::move(_M_rhs)(std::move(_M_lhs)(std::forward<_Range>(__r))); } 1083 1.1.1.3 mrg 1084 1.1.1.3 mrg template<typename _Range> 1085 1.1.1.3 mrg constexpr auto 1086 1.1.1.3 mrg operator()(_Range&& __r) const && = delete; 1087 1.1.1.3 mrg }; 1088 1.1.1.3 mrg 1089 1.1.1.3 mrg // A partial specialization of the above primary template for the case where 1090 1.1.1.3 mrg // both adaptor operands have a simple operator(). This in turn lets us 1091 1.1.1.3 mrg // implement composition using a single simple operator(), which makes 1092 1.1.1.3 mrg // overload resolution failure diagnostics more concise. 1093 1.1.1.3 mrg template<typename _Lhs, typename _Rhs> 1094 1.1.1.3 mrg requires __closure_has_simple_call_op<_Lhs> 1095 1.1.1.3 mrg && __closure_has_simple_call_op<_Rhs> 1096 1.1.1.3 mrg struct _Pipe<_Lhs, _Rhs> : _RangeAdaptorClosure 1097 1.1.1.3 mrg { 1098 1.1.1.3 mrg [[no_unique_address]] _Lhs _M_lhs; 1099 1.1.1.3 mrg [[no_unique_address]] _Rhs _M_rhs; 1100 1.1.1.3 mrg 1101 1.1.1.3 mrg constexpr 1102 1.1.1.3 mrg _Pipe(_Lhs __lhs, _Rhs __rhs) 1103 1.1.1.3 mrg : _M_lhs(std::move(__lhs)), _M_rhs(std::move(__rhs)) 1104 1.1.1.3 mrg { } 1105 1.1.1.3 mrg 1106 1.1.1.3 mrg template<typename _Range> 1107 1.1.1.3 mrg requires __pipe_invocable<const _Lhs&, const _Rhs&, _Range> 1108 1.1.1.3 mrg constexpr auto 1109 1.1.1.3 mrg operator()(_Range&& __r) const 1110 1.1.1.3 mrg { return _M_rhs(_M_lhs(std::forward<_Range>(__r))); } 1111 1.1.1.3 mrg 1112 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 1113 1.1.1.3 mrg }; 1114 1.1.1.3 mrg } // namespace views::__adaptor 1115 1.1 mrg 1116 1.1 mrg template<range _Range> requires is_object_v<_Range> 1117 1.1 mrg class ref_view : public view_interface<ref_view<_Range>> 1118 1.1 mrg { 1119 1.1 mrg private: 1120 1.1.1.3 mrg _Range* _M_r; 1121 1.1 mrg 1122 1.1 mrg static void _S_fun(_Range&); // not defined 1123 1.1 mrg static void _S_fun(_Range&&) = delete; 1124 1.1 mrg 1125 1.1 mrg public: 1126 1.1.1.3 mrg template<__detail::__different_from<ref_view> _Tp> 1127 1.1 mrg requires convertible_to<_Tp, _Range&> 1128 1.1 mrg && requires { _S_fun(declval<_Tp>()); } 1129 1.1 mrg constexpr 1130 1.1 mrg ref_view(_Tp&& __t) 1131 1.1.1.3 mrg noexcept(noexcept(static_cast<_Range&>(std::declval<_Tp>()))) 1132 1.1 mrg : _M_r(std::__addressof(static_cast<_Range&>(std::forward<_Tp>(__t)))) 1133 1.1 mrg { } 1134 1.1 mrg 1135 1.1 mrg constexpr _Range& 1136 1.1 mrg base() const 1137 1.1 mrg { return *_M_r; } 1138 1.1 mrg 1139 1.1 mrg constexpr iterator_t<_Range> 1140 1.1 mrg begin() const 1141 1.1 mrg { return ranges::begin(*_M_r); } 1142 1.1 mrg 1143 1.1 mrg constexpr sentinel_t<_Range> 1144 1.1 mrg end() const 1145 1.1 mrg { return ranges::end(*_M_r); } 1146 1.1 mrg 1147 1.1 mrg constexpr bool 1148 1.1 mrg empty() const requires requires { ranges::empty(*_M_r); } 1149 1.1 mrg { return ranges::empty(*_M_r); } 1150 1.1 mrg 1151 1.1 mrg constexpr auto 1152 1.1 mrg size() const requires sized_range<_Range> 1153 1.1 mrg { return ranges::size(*_M_r); } 1154 1.1 mrg 1155 1.1 mrg constexpr auto 1156 1.1 mrg data() const requires contiguous_range<_Range> 1157 1.1 mrg { return ranges::data(*_M_r); } 1158 1.1 mrg }; 1159 1.1 mrg 1160 1.1 mrg template<typename _Range> 1161 1.1 mrg ref_view(_Range&) -> ref_view<_Range>; 1162 1.1 mrg 1163 1.1 mrg template<typename _Tp> 1164 1.1 mrg inline constexpr bool enable_borrowed_range<ref_view<_Tp>> = true; 1165 1.1 mrg 1166 1.1.1.3 mrg template<range _Range> 1167 1.1.1.3 mrg requires movable<_Range> 1168 1.1.1.3 mrg && (!__detail::__is_initializer_list<remove_cv_t<_Range>>) 1169 1.1.1.3 mrg class owning_view : public view_interface<owning_view<_Range>> 1170 1.1.1.3 mrg { 1171 1.1.1.3 mrg private: 1172 1.1.1.3 mrg _Range _M_r = _Range(); 1173 1.1.1.3 mrg 1174 1.1.1.3 mrg public: 1175 1.1.1.3 mrg owning_view() requires default_initializable<_Range> = default; 1176 1.1.1.3 mrg 1177 1.1.1.3 mrg constexpr 1178 1.1.1.3 mrg owning_view(_Range&& __t) 1179 1.1.1.3 mrg noexcept(is_nothrow_move_constructible_v<_Range>) 1180 1.1.1.3 mrg : _M_r(std::move(__t)) 1181 1.1.1.3 mrg { } 1182 1.1.1.3 mrg 1183 1.1.1.3 mrg owning_view(owning_view&&) = default; 1184 1.1.1.3 mrg owning_view& operator=(owning_view&&) = default; 1185 1.1.1.3 mrg 1186 1.1.1.3 mrg constexpr _Range& 1187 1.1.1.3 mrg base() & noexcept 1188 1.1.1.3 mrg { return _M_r; } 1189 1.1.1.3 mrg 1190 1.1.1.3 mrg constexpr const _Range& 1191 1.1.1.3 mrg base() const& noexcept 1192 1.1.1.3 mrg { return _M_r; } 1193 1.1.1.3 mrg 1194 1.1.1.3 mrg constexpr _Range&& 1195 1.1.1.3 mrg base() && noexcept 1196 1.1.1.3 mrg { return std::move(_M_r); } 1197 1.1.1.3 mrg 1198 1.1.1.3 mrg constexpr const _Range&& 1199 1.1.1.3 mrg base() const&& noexcept 1200 1.1.1.3 mrg { return std::move(_M_r); } 1201 1.1.1.3 mrg 1202 1.1.1.3 mrg constexpr iterator_t<_Range> 1203 1.1.1.3 mrg begin() 1204 1.1.1.3 mrg { return ranges::begin(_M_r); } 1205 1.1.1.3 mrg 1206 1.1.1.3 mrg constexpr sentinel_t<_Range> 1207 1.1.1.3 mrg end() 1208 1.1.1.3 mrg { return ranges::end(_M_r); } 1209 1.1.1.3 mrg 1210 1.1.1.3 mrg constexpr auto 1211 1.1.1.3 mrg begin() const requires range<const _Range> 1212 1.1.1.3 mrg { return ranges::begin(_M_r); } 1213 1.1.1.3 mrg 1214 1.1.1.3 mrg constexpr auto 1215 1.1.1.3 mrg end() const requires range<const _Range> 1216 1.1.1.3 mrg { return ranges::end(_M_r); } 1217 1.1.1.3 mrg 1218 1.1.1.3 mrg constexpr bool 1219 1.1.1.3 mrg empty() requires requires { ranges::empty(_M_r); } 1220 1.1.1.3 mrg { return ranges::empty(_M_r); } 1221 1.1.1.3 mrg 1222 1.1.1.3 mrg constexpr bool 1223 1.1.1.3 mrg empty() const requires requires { ranges::empty(_M_r); } 1224 1.1.1.3 mrg { return ranges::empty(_M_r); } 1225 1.1.1.3 mrg 1226 1.1.1.3 mrg constexpr auto 1227 1.1.1.3 mrg size() requires sized_range<_Range> 1228 1.1.1.3 mrg { return ranges::size(_M_r); } 1229 1.1.1.3 mrg 1230 1.1.1.3 mrg constexpr auto 1231 1.1.1.3 mrg size() const requires sized_range<const _Range> 1232 1.1.1.3 mrg { return ranges::size(_M_r); } 1233 1.1.1.3 mrg 1234 1.1.1.3 mrg constexpr auto 1235 1.1.1.3 mrg data() requires contiguous_range<_Range> 1236 1.1.1.3 mrg { return ranges::data(_M_r); } 1237 1.1.1.3 mrg 1238 1.1.1.3 mrg constexpr auto 1239 1.1.1.3 mrg data() const requires contiguous_range<const _Range> 1240 1.1.1.3 mrg { return ranges::data(_M_r); } 1241 1.1.1.3 mrg }; 1242 1.1.1.3 mrg 1243 1.1.1.3 mrg template<typename _Tp> 1244 1.1.1.3 mrg inline constexpr bool enable_borrowed_range<owning_view<_Tp>> 1245 1.1.1.3 mrg = enable_borrowed_range<_Tp>; 1246 1.1.1.3 mrg 1247 1.1 mrg namespace views 1248 1.1 mrg { 1249 1.1.1.3 mrg namespace __detail 1250 1.1.1.3 mrg { 1251 1.1.1.3 mrg template<typename _Range> 1252 1.1.1.3 mrg concept __can_ref_view = requires { ref_view{std::declval<_Range>()}; }; 1253 1.1.1.3 mrg 1254 1.1.1.3 mrg template<typename _Range> 1255 1.1.1.3 mrg concept __can_owning_view = requires { owning_view{std::declval<_Range>()}; }; 1256 1.1.1.3 mrg } // namespace __detail 1257 1.1.1.3 mrg 1258 1.1.1.3 mrg struct _All : __adaptor::_RangeAdaptorClosure 1259 1.1.1.3 mrg { 1260 1.1.1.3 mrg template<typename _Range> 1261 1.1.1.3 mrg static constexpr bool 1262 1.1.1.3 mrg _S_noexcept() 1263 1.1.1.3 mrg { 1264 1.1.1.3 mrg if constexpr (view<decay_t<_Range>>) 1265 1.1.1.3 mrg return is_nothrow_constructible_v<decay_t<_Range>, _Range>; 1266 1.1.1.3 mrg else if constexpr (__detail::__can_ref_view<_Range>) 1267 1.1.1.3 mrg return true; 1268 1.1.1.3 mrg else 1269 1.1.1.3 mrg return noexcept(owning_view{std::declval<_Range>()}); 1270 1.1.1.3 mrg } 1271 1.1.1.3 mrg 1272 1.1.1.3 mrg template<viewable_range _Range> 1273 1.1.1.3 mrg requires view<decay_t<_Range>> 1274 1.1.1.3 mrg || __detail::__can_ref_view<_Range> 1275 1.1.1.3 mrg || __detail::__can_owning_view<_Range> 1276 1.1.1.3 mrg constexpr auto 1277 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r) const 1278 1.1.1.3 mrg noexcept(_S_noexcept<_Range>()) 1279 1.1.1.3 mrg { 1280 1.1.1.3 mrg if constexpr (view<decay_t<_Range>>) 1281 1.1.1.3 mrg return std::forward<_Range>(__r); 1282 1.1.1.3 mrg else if constexpr (__detail::__can_ref_view<_Range>) 1283 1.1.1.3 mrg return ref_view{std::forward<_Range>(__r)}; 1284 1.1.1.3 mrg else 1285 1.1.1.3 mrg return owning_view{std::forward<_Range>(__r)}; 1286 1.1.1.3 mrg } 1287 1.1.1.3 mrg 1288 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 1289 1.1.1.3 mrg }; 1290 1.1.1.3 mrg 1291 1.1.1.3 mrg inline constexpr _All all; 1292 1.1 mrg 1293 1.1 mrg template<viewable_range _Range> 1294 1.1 mrg using all_t = decltype(all(std::declval<_Range>())); 1295 1.1 mrg } // namespace views 1296 1.1 mrg 1297 1.1 mrg namespace __detail 1298 1.1 mrg { 1299 1.1.1.3 mrg template<typename _Tp> 1300 1.1.1.3 mrg struct __non_propagating_cache 1301 1.1 mrg { 1302 1.1.1.3 mrg // When _Tp is not an object type (e.g. is a reference type), we make 1303 1.1.1.3 mrg // __non_propagating_cache<_Tp> empty rather than ill-formed so that 1304 1.1.1.3 mrg // users can easily conditionally declare data members with this type 1305 1.1.1.3 mrg // (such as join_view::_M_inner). 1306 1.1.1.3 mrg }; 1307 1.1 mrg 1308 1.1.1.3 mrg template<typename _Tp> 1309 1.1.1.3 mrg requires is_object_v<_Tp> 1310 1.1.1.3 mrg struct __non_propagating_cache<_Tp> 1311 1.1.1.3 mrg : protected _Optional_base<_Tp> 1312 1.1 mrg { 1313 1.1.1.3 mrg __non_propagating_cache() = default; 1314 1.1 mrg 1315 1.1.1.3 mrg constexpr 1316 1.1.1.3 mrg __non_propagating_cache(const __non_propagating_cache&) noexcept 1317 1.1.1.3 mrg { } 1318 1.1 mrg 1319 1.1.1.3 mrg constexpr 1320 1.1.1.3 mrg __non_propagating_cache(__non_propagating_cache&& __other) noexcept 1321 1.1.1.3 mrg { __other._M_reset(); } 1322 1.1.1.3 mrg 1323 1.1.1.3 mrg constexpr __non_propagating_cache& 1324 1.1.1.3 mrg operator=(const __non_propagating_cache& __other) noexcept 1325 1.1.1.3 mrg { 1326 1.1.1.3 mrg if (std::__addressof(__other) != this) 1327 1.1.1.3 mrg this->_M_reset(); 1328 1.1.1.3 mrg return *this; 1329 1.1.1.3 mrg } 1330 1.1.1.3 mrg 1331 1.1.1.3 mrg constexpr __non_propagating_cache& 1332 1.1.1.3 mrg operator=(__non_propagating_cache&& __other) noexcept 1333 1.1.1.3 mrg { 1334 1.1.1.3 mrg this->_M_reset(); 1335 1.1.1.3 mrg __other._M_reset(); 1336 1.1.1.3 mrg return *this; 1337 1.1.1.3 mrg } 1338 1.1.1.3 mrg 1339 1.1.1.3 mrg constexpr __non_propagating_cache& 1340 1.1.1.3 mrg operator=(_Tp __val) 1341 1.1.1.3 mrg { 1342 1.1.1.3 mrg this->_M_reset(); 1343 1.1.1.3 mrg this->_M_payload._M_construct(std::move(__val)); 1344 1.1.1.3 mrg return *this; 1345 1.1.1.3 mrg } 1346 1.1.1.3 mrg 1347 1.1.1.3 mrg constexpr explicit 1348 1.1.1.3 mrg operator bool() const noexcept 1349 1.1.1.3 mrg { return this->_M_is_engaged(); } 1350 1.1.1.3 mrg 1351 1.1.1.3 mrg constexpr _Tp& 1352 1.1.1.3 mrg operator*() noexcept 1353 1.1.1.3 mrg { return this->_M_get(); } 1354 1.1.1.3 mrg 1355 1.1.1.3 mrg constexpr const _Tp& 1356 1.1.1.3 mrg operator*() const noexcept 1357 1.1.1.3 mrg { return this->_M_get(); } 1358 1.1.1.3 mrg 1359 1.1.1.3 mrg template<typename _Iter> 1360 1.1.1.3 mrg constexpr _Tp& 1361 1.1.1.3 mrg _M_emplace_deref(const _Iter& __i) 1362 1.1.1.3 mrg { 1363 1.1.1.3 mrg this->_M_reset(); 1364 1.1.1.3 mrg auto __f = [] (auto& __x) { return *__x; }; 1365 1.1.1.3 mrg this->_M_payload._M_apply(_Optional_func{__f}, __i); 1366 1.1.1.3 mrg return this->_M_get(); 1367 1.1 mrg } 1368 1.1.1.3 mrg }; 1369 1.1 mrg 1370 1.1 mrg template<range _Range> 1371 1.1 mrg struct _CachedPosition 1372 1.1 mrg { 1373 1.1 mrg constexpr bool 1374 1.1 mrg _M_has_value() const 1375 1.1 mrg { return false; } 1376 1.1 mrg 1377 1.1 mrg constexpr iterator_t<_Range> 1378 1.1 mrg _M_get(const _Range&) const 1379 1.1 mrg { 1380 1.1 mrg __glibcxx_assert(false); 1381 1.1 mrg __builtin_unreachable(); 1382 1.1 mrg } 1383 1.1 mrg 1384 1.1 mrg constexpr void 1385 1.1 mrg _M_set(const _Range&, const iterator_t<_Range>&) const 1386 1.1 mrg { } 1387 1.1 mrg }; 1388 1.1 mrg 1389 1.1 mrg template<forward_range _Range> 1390 1.1 mrg struct _CachedPosition<_Range> 1391 1.1.1.3 mrg : protected __non_propagating_cache<iterator_t<_Range>> 1392 1.1 mrg { 1393 1.1 mrg constexpr bool 1394 1.1 mrg _M_has_value() const 1395 1.1.1.3 mrg { return this->_M_is_engaged(); } 1396 1.1 mrg 1397 1.1 mrg constexpr iterator_t<_Range> 1398 1.1 mrg _M_get(const _Range&) const 1399 1.1 mrg { 1400 1.1 mrg __glibcxx_assert(_M_has_value()); 1401 1.1.1.3 mrg return **this; 1402 1.1 mrg } 1403 1.1 mrg 1404 1.1 mrg constexpr void 1405 1.1 mrg _M_set(const _Range&, const iterator_t<_Range>& __it) 1406 1.1 mrg { 1407 1.1 mrg __glibcxx_assert(!_M_has_value()); 1408 1.1.1.3 mrg std::construct_at(std::__addressof(this->_M_payload._M_payload), 1409 1.1.1.3 mrg in_place, __it); 1410 1.1.1.3 mrg this->_M_payload._M_engaged = true; 1411 1.1 mrg } 1412 1.1 mrg }; 1413 1.1 mrg 1414 1.1 mrg template<random_access_range _Range> 1415 1.1 mrg requires (sizeof(range_difference_t<_Range>) 1416 1.1 mrg <= sizeof(iterator_t<_Range>)) 1417 1.1 mrg struct _CachedPosition<_Range> 1418 1.1 mrg { 1419 1.1 mrg private: 1420 1.1 mrg range_difference_t<_Range> _M_offset = -1; 1421 1.1 mrg 1422 1.1 mrg public: 1423 1.1.1.3 mrg _CachedPosition() = default; 1424 1.1.1.3 mrg 1425 1.1.1.3 mrg constexpr 1426 1.1.1.3 mrg _CachedPosition(const _CachedPosition&) = default; 1427 1.1.1.3 mrg 1428 1.1.1.3 mrg constexpr 1429 1.1.1.3 mrg _CachedPosition(_CachedPosition&& __other) noexcept 1430 1.1.1.3 mrg { *this = std::move(__other); } 1431 1.1.1.3 mrg 1432 1.1.1.3 mrg constexpr _CachedPosition& 1433 1.1.1.3 mrg operator=(const _CachedPosition&) = default; 1434 1.1.1.3 mrg 1435 1.1.1.3 mrg constexpr _CachedPosition& 1436 1.1.1.3 mrg operator=(_CachedPosition&& __other) noexcept 1437 1.1.1.3 mrg { 1438 1.1.1.3 mrg // Propagate the cached offset, but invalidate the source. 1439 1.1.1.3 mrg _M_offset = __other._M_offset; 1440 1.1.1.3 mrg __other._M_offset = -1; 1441 1.1.1.3 mrg return *this; 1442 1.1.1.3 mrg } 1443 1.1.1.3 mrg 1444 1.1 mrg constexpr bool 1445 1.1 mrg _M_has_value() const 1446 1.1 mrg { return _M_offset >= 0; } 1447 1.1 mrg 1448 1.1 mrg constexpr iterator_t<_Range> 1449 1.1 mrg _M_get(_Range& __r) const 1450 1.1 mrg { 1451 1.1 mrg __glibcxx_assert(_M_has_value()); 1452 1.1 mrg return ranges::begin(__r) + _M_offset; 1453 1.1 mrg } 1454 1.1 mrg 1455 1.1 mrg constexpr void 1456 1.1 mrg _M_set(_Range& __r, const iterator_t<_Range>& __it) 1457 1.1 mrg { 1458 1.1 mrg __glibcxx_assert(!_M_has_value()); 1459 1.1 mrg _M_offset = __it - ranges::begin(__r); 1460 1.1 mrg } 1461 1.1 mrg }; 1462 1.1 mrg } // namespace __detail 1463 1.1 mrg 1464 1.1 mrg namespace __detail 1465 1.1 mrg { 1466 1.1 mrg template<typename _Base> 1467 1.1 mrg struct __filter_view_iter_cat 1468 1.1 mrg { }; 1469 1.1 mrg 1470 1.1 mrg template<forward_range _Base> 1471 1.1 mrg struct __filter_view_iter_cat<_Base> 1472 1.1 mrg { 1473 1.1 mrg private: 1474 1.1 mrg static auto 1475 1.1 mrg _S_iter_cat() 1476 1.1 mrg { 1477 1.1 mrg using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category; 1478 1.1 mrg if constexpr (derived_from<_Cat, bidirectional_iterator_tag>) 1479 1.1 mrg return bidirectional_iterator_tag{}; 1480 1.1 mrg else if constexpr (derived_from<_Cat, forward_iterator_tag>) 1481 1.1 mrg return forward_iterator_tag{}; 1482 1.1 mrg else 1483 1.1 mrg return _Cat{}; 1484 1.1 mrg } 1485 1.1 mrg public: 1486 1.1 mrg using iterator_category = decltype(_S_iter_cat()); 1487 1.1 mrg }; 1488 1.1 mrg } // namespace __detail 1489 1.1 mrg 1490 1.1 mrg template<input_range _Vp, 1491 1.1 mrg indirect_unary_predicate<iterator_t<_Vp>> _Pred> 1492 1.1 mrg requires view<_Vp> && is_object_v<_Pred> 1493 1.1 mrg class filter_view : public view_interface<filter_view<_Vp, _Pred>> 1494 1.1 mrg { 1495 1.1 mrg private: 1496 1.1 mrg struct _Sentinel; 1497 1.1 mrg 1498 1.1 mrg struct _Iterator : __detail::__filter_view_iter_cat<_Vp> 1499 1.1 mrg { 1500 1.1 mrg private: 1501 1.1 mrg static constexpr auto 1502 1.1 mrg _S_iter_concept() 1503 1.1 mrg { 1504 1.1 mrg if constexpr (bidirectional_range<_Vp>) 1505 1.1 mrg return bidirectional_iterator_tag{}; 1506 1.1 mrg else if constexpr (forward_range<_Vp>) 1507 1.1 mrg return forward_iterator_tag{}; 1508 1.1 mrg else 1509 1.1 mrg return input_iterator_tag{}; 1510 1.1 mrg } 1511 1.1 mrg 1512 1.1 mrg friend filter_view; 1513 1.1 mrg 1514 1.1 mrg using _Vp_iter = iterator_t<_Vp>; 1515 1.1 mrg 1516 1.1 mrg _Vp_iter _M_current = _Vp_iter(); 1517 1.1 mrg filter_view* _M_parent = nullptr; 1518 1.1 mrg 1519 1.1 mrg public: 1520 1.1 mrg using iterator_concept = decltype(_S_iter_concept()); 1521 1.1 mrg // iterator_category defined in __filter_view_iter_cat 1522 1.1 mrg using value_type = range_value_t<_Vp>; 1523 1.1 mrg using difference_type = range_difference_t<_Vp>; 1524 1.1 mrg 1525 1.1 mrg _Iterator() requires default_initializable<_Vp_iter> = default; 1526 1.1 mrg 1527 1.1 mrg constexpr 1528 1.1 mrg _Iterator(filter_view* __parent, _Vp_iter __current) 1529 1.1 mrg : _M_current(std::move(__current)), 1530 1.1 mrg _M_parent(__parent) 1531 1.1 mrg { } 1532 1.1 mrg 1533 1.1 mrg constexpr const _Vp_iter& 1534 1.1 mrg base() const & noexcept 1535 1.1 mrg { return _M_current; } 1536 1.1 mrg 1537 1.1 mrg constexpr _Vp_iter 1538 1.1 mrg base() && 1539 1.1 mrg { return std::move(_M_current); } 1540 1.1 mrg 1541 1.1 mrg constexpr range_reference_t<_Vp> 1542 1.1 mrg operator*() const 1543 1.1 mrg { return *_M_current; } 1544 1.1 mrg 1545 1.1 mrg constexpr _Vp_iter 1546 1.1 mrg operator->() const 1547 1.1 mrg requires __detail::__has_arrow<_Vp_iter> 1548 1.1 mrg && copyable<_Vp_iter> 1549 1.1 mrg { return _M_current; } 1550 1.1 mrg 1551 1.1 mrg constexpr _Iterator& 1552 1.1 mrg operator++() 1553 1.1 mrg { 1554 1.1.1.3 mrg _M_current = ranges::find_if(std::move(++_M_current), 1555 1.1.1.3 mrg ranges::end(_M_parent->_M_base), 1556 1.1.1.3 mrg std::ref(*_M_parent->_M_pred)); 1557 1.1 mrg return *this; 1558 1.1 mrg } 1559 1.1 mrg 1560 1.1 mrg constexpr void 1561 1.1 mrg operator++(int) 1562 1.1 mrg { ++*this; } 1563 1.1 mrg 1564 1.1 mrg constexpr _Iterator 1565 1.1 mrg operator++(int) requires forward_range<_Vp> 1566 1.1 mrg { 1567 1.1 mrg auto __tmp = *this; 1568 1.1 mrg ++*this; 1569 1.1 mrg return __tmp; 1570 1.1 mrg } 1571 1.1 mrg 1572 1.1 mrg constexpr _Iterator& 1573 1.1 mrg operator--() requires bidirectional_range<_Vp> 1574 1.1 mrg { 1575 1.1 mrg do 1576 1.1 mrg --_M_current; 1577 1.1 mrg while (!std::__invoke(*_M_parent->_M_pred, *_M_current)); 1578 1.1 mrg return *this; 1579 1.1 mrg } 1580 1.1 mrg 1581 1.1 mrg constexpr _Iterator 1582 1.1 mrg operator--(int) requires bidirectional_range<_Vp> 1583 1.1 mrg { 1584 1.1 mrg auto __tmp = *this; 1585 1.1 mrg --*this; 1586 1.1 mrg return __tmp; 1587 1.1 mrg } 1588 1.1 mrg 1589 1.1 mrg friend constexpr bool 1590 1.1 mrg operator==(const _Iterator& __x, const _Iterator& __y) 1591 1.1 mrg requires equality_comparable<_Vp_iter> 1592 1.1 mrg { return __x._M_current == __y._M_current; } 1593 1.1 mrg 1594 1.1 mrg friend constexpr range_rvalue_reference_t<_Vp> 1595 1.1 mrg iter_move(const _Iterator& __i) 1596 1.1 mrg noexcept(noexcept(ranges::iter_move(__i._M_current))) 1597 1.1 mrg { return ranges::iter_move(__i._M_current); } 1598 1.1 mrg 1599 1.1 mrg friend constexpr void 1600 1.1 mrg iter_swap(const _Iterator& __x, const _Iterator& __y) 1601 1.1 mrg noexcept(noexcept(ranges::iter_swap(__x._M_current, __y._M_current))) 1602 1.1 mrg requires indirectly_swappable<_Vp_iter> 1603 1.1 mrg { ranges::iter_swap(__x._M_current, __y._M_current); } 1604 1.1 mrg }; 1605 1.1 mrg 1606 1.1 mrg struct _Sentinel 1607 1.1 mrg { 1608 1.1 mrg private: 1609 1.1 mrg sentinel_t<_Vp> _M_end = sentinel_t<_Vp>(); 1610 1.1 mrg 1611 1.1 mrg constexpr bool 1612 1.1 mrg __equal(const _Iterator& __i) const 1613 1.1 mrg { return __i._M_current == _M_end; } 1614 1.1 mrg 1615 1.1 mrg public: 1616 1.1 mrg _Sentinel() = default; 1617 1.1 mrg 1618 1.1 mrg constexpr explicit 1619 1.1 mrg _Sentinel(filter_view* __parent) 1620 1.1 mrg : _M_end(ranges::end(__parent->_M_base)) 1621 1.1 mrg { } 1622 1.1 mrg 1623 1.1 mrg constexpr sentinel_t<_Vp> 1624 1.1 mrg base() const 1625 1.1 mrg { return _M_end; } 1626 1.1 mrg 1627 1.1 mrg friend constexpr bool 1628 1.1 mrg operator==(const _Iterator& __x, const _Sentinel& __y) 1629 1.1 mrg { return __y.__equal(__x); } 1630 1.1 mrg }; 1631 1.1 mrg 1632 1.1 mrg _Vp _M_base = _Vp(); 1633 1.1.1.3 mrg [[no_unique_address]] __detail::__box<_Pred> _M_pred; 1634 1.1 mrg [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin; 1635 1.1 mrg 1636 1.1 mrg public: 1637 1.1.1.3 mrg filter_view() requires (default_initializable<_Vp> 1638 1.1.1.3 mrg && default_initializable<_Pred>) 1639 1.1.1.3 mrg = default; 1640 1.1 mrg 1641 1.1 mrg constexpr 1642 1.1 mrg filter_view(_Vp __base, _Pred __pred) 1643 1.1 mrg : _M_base(std::move(__base)), _M_pred(std::move(__pred)) 1644 1.1 mrg { } 1645 1.1 mrg 1646 1.1 mrg constexpr _Vp 1647 1.1 mrg base() const& requires copy_constructible<_Vp> 1648 1.1 mrg { return _M_base; } 1649 1.1 mrg 1650 1.1 mrg constexpr _Vp 1651 1.1 mrg base() && 1652 1.1 mrg { return std::move(_M_base); } 1653 1.1 mrg 1654 1.1 mrg constexpr const _Pred& 1655 1.1 mrg pred() const 1656 1.1 mrg { return *_M_pred; } 1657 1.1 mrg 1658 1.1 mrg constexpr _Iterator 1659 1.1 mrg begin() 1660 1.1 mrg { 1661 1.1 mrg if (_M_cached_begin._M_has_value()) 1662 1.1 mrg return {this, _M_cached_begin._M_get(_M_base)}; 1663 1.1 mrg 1664 1.1 mrg __glibcxx_assert(_M_pred.has_value()); 1665 1.1.1.3 mrg auto __it = ranges::find_if(ranges::begin(_M_base), 1666 1.1.1.3 mrg ranges::end(_M_base), 1667 1.1.1.3 mrg std::ref(*_M_pred)); 1668 1.1 mrg _M_cached_begin._M_set(_M_base, __it); 1669 1.1 mrg return {this, std::move(__it)}; 1670 1.1 mrg } 1671 1.1 mrg 1672 1.1 mrg constexpr auto 1673 1.1 mrg end() 1674 1.1 mrg { 1675 1.1 mrg if constexpr (common_range<_Vp>) 1676 1.1 mrg return _Iterator{this, ranges::end(_M_base)}; 1677 1.1 mrg else 1678 1.1 mrg return _Sentinel{this}; 1679 1.1 mrg } 1680 1.1 mrg }; 1681 1.1 mrg 1682 1.1 mrg template<typename _Range, typename _Pred> 1683 1.1 mrg filter_view(_Range&&, _Pred) -> filter_view<views::all_t<_Range>, _Pred>; 1684 1.1 mrg 1685 1.1 mrg namespace views 1686 1.1 mrg { 1687 1.1.1.3 mrg namespace __detail 1688 1.1.1.3 mrg { 1689 1.1.1.3 mrg template<typename _Range, typename _Pred> 1690 1.1.1.3 mrg concept __can_filter_view 1691 1.1.1.3 mrg = requires { filter_view(std::declval<_Range>(), std::declval<_Pred>()); }; 1692 1.1.1.3 mrg } // namespace __detail 1693 1.1.1.3 mrg 1694 1.1.1.3 mrg struct _Filter : __adaptor::_RangeAdaptor<_Filter> 1695 1.1.1.3 mrg { 1696 1.1.1.3 mrg template<viewable_range _Range, typename _Pred> 1697 1.1.1.3 mrg requires __detail::__can_filter_view<_Range, _Pred> 1698 1.1.1.3 mrg constexpr auto 1699 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const 1700 1.1.1.3 mrg { 1701 1.1.1.3 mrg return filter_view(std::forward<_Range>(__r), std::forward<_Pred>(__p)); 1702 1.1.1.3 mrg } 1703 1.1.1.3 mrg 1704 1.1.1.3 mrg using _RangeAdaptor<_Filter>::operator(); 1705 1.1.1.3 mrg static constexpr int _S_arity = 2; 1706 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args = true; 1707 1.1.1.3 mrg }; 1708 1.1.1.3 mrg 1709 1.1.1.3 mrg inline constexpr _Filter filter; 1710 1.1 mrg } // namespace views 1711 1.1 mrg 1712 1.1 mrg template<input_range _Vp, copy_constructible _Fp> 1713 1.1 mrg requires view<_Vp> && is_object_v<_Fp> 1714 1.1 mrg && regular_invocable<_Fp&, range_reference_t<_Vp>> 1715 1.1 mrg && std::__detail::__can_reference<invoke_result_t<_Fp&, 1716 1.1 mrg range_reference_t<_Vp>>> 1717 1.1 mrg class transform_view : public view_interface<transform_view<_Vp, _Fp>> 1718 1.1 mrg { 1719 1.1 mrg private: 1720 1.1 mrg template<bool _Const> 1721 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 1722 1.1 mrg 1723 1.1 mrg template<bool _Const> 1724 1.1 mrg struct __iter_cat 1725 1.1 mrg { }; 1726 1.1 mrg 1727 1.1 mrg template<bool _Const> 1728 1.1 mrg requires forward_range<_Base<_Const>> 1729 1.1 mrg struct __iter_cat<_Const> 1730 1.1 mrg { 1731 1.1 mrg private: 1732 1.1 mrg static auto 1733 1.1 mrg _S_iter_cat() 1734 1.1 mrg { 1735 1.1 mrg using _Base = transform_view::_Base<_Const>; 1736 1.1 mrg using _Res = invoke_result_t<_Fp&, range_reference_t<_Base>>; 1737 1.1 mrg if constexpr (is_lvalue_reference_v<_Res>) 1738 1.1 mrg { 1739 1.1 mrg using _Cat 1740 1.1 mrg = typename iterator_traits<iterator_t<_Base>>::iterator_category; 1741 1.1 mrg if constexpr (derived_from<_Cat, contiguous_iterator_tag>) 1742 1.1 mrg return random_access_iterator_tag{}; 1743 1.1 mrg else 1744 1.1 mrg return _Cat{}; 1745 1.1 mrg } 1746 1.1 mrg else 1747 1.1 mrg return input_iterator_tag{}; 1748 1.1 mrg } 1749 1.1 mrg public: 1750 1.1 mrg using iterator_category = decltype(_S_iter_cat()); 1751 1.1 mrg }; 1752 1.1 mrg 1753 1.1 mrg template<bool _Const> 1754 1.1 mrg struct _Sentinel; 1755 1.1 mrg 1756 1.1 mrg template<bool _Const> 1757 1.1 mrg struct _Iterator : __iter_cat<_Const> 1758 1.1 mrg { 1759 1.1 mrg private: 1760 1.1 mrg using _Parent = __detail::__maybe_const_t<_Const, transform_view>; 1761 1.1 mrg using _Base = transform_view::_Base<_Const>; 1762 1.1 mrg 1763 1.1 mrg static auto 1764 1.1 mrg _S_iter_concept() 1765 1.1 mrg { 1766 1.1 mrg if constexpr (random_access_range<_Base>) 1767 1.1 mrg return random_access_iterator_tag{}; 1768 1.1 mrg else if constexpr (bidirectional_range<_Base>) 1769 1.1 mrg return bidirectional_iterator_tag{}; 1770 1.1 mrg else if constexpr (forward_range<_Base>) 1771 1.1 mrg return forward_iterator_tag{}; 1772 1.1 mrg else 1773 1.1 mrg return input_iterator_tag{}; 1774 1.1 mrg } 1775 1.1 mrg 1776 1.1 mrg using _Base_iter = iterator_t<_Base>; 1777 1.1 mrg 1778 1.1 mrg _Base_iter _M_current = _Base_iter(); 1779 1.1 mrg _Parent* _M_parent = nullptr; 1780 1.1 mrg 1781 1.1 mrg public: 1782 1.1 mrg using iterator_concept = decltype(_S_iter_concept()); 1783 1.1 mrg // iterator_category defined in __transform_view_iter_cat 1784 1.1 mrg using value_type 1785 1.1 mrg = remove_cvref_t<invoke_result_t<_Fp&, range_reference_t<_Base>>>; 1786 1.1 mrg using difference_type = range_difference_t<_Base>; 1787 1.1 mrg 1788 1.1 mrg _Iterator() requires default_initializable<_Base_iter> = default; 1789 1.1 mrg 1790 1.1 mrg constexpr 1791 1.1 mrg _Iterator(_Parent* __parent, _Base_iter __current) 1792 1.1 mrg : _M_current(std::move(__current)), 1793 1.1 mrg _M_parent(__parent) 1794 1.1 mrg { } 1795 1.1 mrg 1796 1.1 mrg constexpr 1797 1.1 mrg _Iterator(_Iterator<!_Const> __i) 1798 1.1 mrg requires _Const 1799 1.1 mrg && convertible_to<iterator_t<_Vp>, _Base_iter> 1800 1.1 mrg : _M_current(std::move(__i._M_current)), _M_parent(__i._M_parent) 1801 1.1 mrg { } 1802 1.1 mrg 1803 1.1 mrg constexpr const _Base_iter& 1804 1.1 mrg base() const & noexcept 1805 1.1 mrg { return _M_current; } 1806 1.1 mrg 1807 1.1 mrg constexpr _Base_iter 1808 1.1 mrg base() && 1809 1.1 mrg { return std::move(_M_current); } 1810 1.1 mrg 1811 1.1 mrg constexpr decltype(auto) 1812 1.1 mrg operator*() const 1813 1.1 mrg noexcept(noexcept(std::__invoke(*_M_parent->_M_fun, *_M_current))) 1814 1.1 mrg { return std::__invoke(*_M_parent->_M_fun, *_M_current); } 1815 1.1 mrg 1816 1.1 mrg constexpr _Iterator& 1817 1.1 mrg operator++() 1818 1.1 mrg { 1819 1.1 mrg ++_M_current; 1820 1.1 mrg return *this; 1821 1.1 mrg } 1822 1.1 mrg 1823 1.1 mrg constexpr void 1824 1.1 mrg operator++(int) 1825 1.1 mrg { ++_M_current; } 1826 1.1 mrg 1827 1.1 mrg constexpr _Iterator 1828 1.1 mrg operator++(int) requires forward_range<_Base> 1829 1.1 mrg { 1830 1.1 mrg auto __tmp = *this; 1831 1.1 mrg ++*this; 1832 1.1 mrg return __tmp; 1833 1.1 mrg } 1834 1.1 mrg 1835 1.1 mrg constexpr _Iterator& 1836 1.1 mrg operator--() requires bidirectional_range<_Base> 1837 1.1 mrg { 1838 1.1 mrg --_M_current; 1839 1.1 mrg return *this; 1840 1.1 mrg } 1841 1.1 mrg 1842 1.1 mrg constexpr _Iterator 1843 1.1 mrg operator--(int) requires bidirectional_range<_Base> 1844 1.1 mrg { 1845 1.1 mrg auto __tmp = *this; 1846 1.1 mrg --*this; 1847 1.1 mrg return __tmp; 1848 1.1 mrg } 1849 1.1 mrg 1850 1.1 mrg constexpr _Iterator& 1851 1.1 mrg operator+=(difference_type __n) requires random_access_range<_Base> 1852 1.1 mrg { 1853 1.1 mrg _M_current += __n; 1854 1.1 mrg return *this; 1855 1.1 mrg } 1856 1.1 mrg 1857 1.1 mrg constexpr _Iterator& 1858 1.1 mrg operator-=(difference_type __n) requires random_access_range<_Base> 1859 1.1 mrg { 1860 1.1 mrg _M_current -= __n; 1861 1.1 mrg return *this; 1862 1.1 mrg } 1863 1.1 mrg 1864 1.1 mrg constexpr decltype(auto) 1865 1.1 mrg operator[](difference_type __n) const 1866 1.1 mrg requires random_access_range<_Base> 1867 1.1 mrg { return std::__invoke(*_M_parent->_M_fun, _M_current[__n]); } 1868 1.1 mrg 1869 1.1 mrg friend constexpr bool 1870 1.1 mrg operator==(const _Iterator& __x, const _Iterator& __y) 1871 1.1 mrg requires equality_comparable<_Base_iter> 1872 1.1 mrg { return __x._M_current == __y._M_current; } 1873 1.1 mrg 1874 1.1 mrg friend constexpr bool 1875 1.1 mrg operator<(const _Iterator& __x, const _Iterator& __y) 1876 1.1 mrg requires random_access_range<_Base> 1877 1.1 mrg { return __x._M_current < __y._M_current; } 1878 1.1 mrg 1879 1.1 mrg friend constexpr bool 1880 1.1 mrg operator>(const _Iterator& __x, const _Iterator& __y) 1881 1.1 mrg requires random_access_range<_Base> 1882 1.1 mrg { return __y < __x; } 1883 1.1 mrg 1884 1.1 mrg friend constexpr bool 1885 1.1 mrg operator<=(const _Iterator& __x, const _Iterator& __y) 1886 1.1 mrg requires random_access_range<_Base> 1887 1.1 mrg { return !(__y < __x); } 1888 1.1 mrg 1889 1.1 mrg friend constexpr bool 1890 1.1 mrg operator>=(const _Iterator& __x, const _Iterator& __y) 1891 1.1 mrg requires random_access_range<_Base> 1892 1.1 mrg { return !(__x < __y); } 1893 1.1 mrg 1894 1.1 mrg #ifdef __cpp_lib_three_way_comparison 1895 1.1 mrg friend constexpr auto 1896 1.1 mrg operator<=>(const _Iterator& __x, const _Iterator& __y) 1897 1.1 mrg requires random_access_range<_Base> 1898 1.1 mrg && three_way_comparable<_Base_iter> 1899 1.1 mrg { return __x._M_current <=> __y._M_current; } 1900 1.1 mrg #endif 1901 1.1 mrg 1902 1.1 mrg friend constexpr _Iterator 1903 1.1 mrg operator+(_Iterator __i, difference_type __n) 1904 1.1 mrg requires random_access_range<_Base> 1905 1.1 mrg { return {__i._M_parent, __i._M_current + __n}; } 1906 1.1 mrg 1907 1.1 mrg friend constexpr _Iterator 1908 1.1 mrg operator+(difference_type __n, _Iterator __i) 1909 1.1 mrg requires random_access_range<_Base> 1910 1.1 mrg { return {__i._M_parent, __i._M_current + __n}; } 1911 1.1 mrg 1912 1.1 mrg friend constexpr _Iterator 1913 1.1 mrg operator-(_Iterator __i, difference_type __n) 1914 1.1 mrg requires random_access_range<_Base> 1915 1.1 mrg { return {__i._M_parent, __i._M_current - __n}; } 1916 1.1 mrg 1917 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 1918 1.1 mrg // 3483. transform_view::iterator's difference is overconstrained 1919 1.1 mrg friend constexpr difference_type 1920 1.1 mrg operator-(const _Iterator& __x, const _Iterator& __y) 1921 1.1 mrg requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>> 1922 1.1 mrg { return __x._M_current - __y._M_current; } 1923 1.1 mrg 1924 1.1 mrg friend constexpr decltype(auto) 1925 1.1 mrg iter_move(const _Iterator& __i) noexcept(noexcept(*__i)) 1926 1.1 mrg { 1927 1.1 mrg if constexpr (is_lvalue_reference_v<decltype(*__i)>) 1928 1.1 mrg return std::move(*__i); 1929 1.1 mrg else 1930 1.1 mrg return *__i; 1931 1.1 mrg } 1932 1.1 mrg 1933 1.1 mrg friend _Iterator<!_Const>; 1934 1.1 mrg template<bool> friend struct _Sentinel; 1935 1.1 mrg }; 1936 1.1 mrg 1937 1.1 mrg template<bool _Const> 1938 1.1 mrg struct _Sentinel 1939 1.1 mrg { 1940 1.1 mrg private: 1941 1.1 mrg using _Parent = __detail::__maybe_const_t<_Const, transform_view>; 1942 1.1 mrg using _Base = transform_view::_Base<_Const>; 1943 1.1 mrg 1944 1.1 mrg template<bool _Const2> 1945 1.1 mrg constexpr auto 1946 1.1 mrg __distance_from(const _Iterator<_Const2>& __i) const 1947 1.1 mrg { return _M_end - __i._M_current; } 1948 1.1 mrg 1949 1.1 mrg template<bool _Const2> 1950 1.1 mrg constexpr bool 1951 1.1 mrg __equal(const _Iterator<_Const2>& __i) const 1952 1.1 mrg { return __i._M_current == _M_end; } 1953 1.1 mrg 1954 1.1 mrg sentinel_t<_Base> _M_end = sentinel_t<_Base>(); 1955 1.1 mrg 1956 1.1 mrg public: 1957 1.1 mrg _Sentinel() = default; 1958 1.1 mrg 1959 1.1 mrg constexpr explicit 1960 1.1 mrg _Sentinel(sentinel_t<_Base> __end) 1961 1.1 mrg : _M_end(__end) 1962 1.1 mrg { } 1963 1.1 mrg 1964 1.1 mrg constexpr 1965 1.1 mrg _Sentinel(_Sentinel<!_Const> __i) 1966 1.1 mrg requires _Const 1967 1.1 mrg && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>> 1968 1.1 mrg : _M_end(std::move(__i._M_end)) 1969 1.1 mrg { } 1970 1.1 mrg 1971 1.1 mrg constexpr sentinel_t<_Base> 1972 1.1 mrg base() const 1973 1.1 mrg { return _M_end; } 1974 1.1 mrg 1975 1.1 mrg template<bool _Const2> 1976 1.1 mrg requires sentinel_for<sentinel_t<_Base>, 1977 1.1 mrg iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>> 1978 1.1 mrg friend constexpr bool 1979 1.1 mrg operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y) 1980 1.1 mrg { return __y.__equal(__x); } 1981 1.1 mrg 1982 1.1 mrg template<bool _Const2, 1983 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>> 1984 1.1 mrg requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 1985 1.1 mrg friend constexpr range_difference_t<_Base2> 1986 1.1 mrg operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y) 1987 1.1 mrg { return -__y.__distance_from(__x); } 1988 1.1 mrg 1989 1.1 mrg template<bool _Const2, 1990 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>> 1991 1.1 mrg requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 1992 1.1 mrg friend constexpr range_difference_t<_Base2> 1993 1.1 mrg operator-(const _Sentinel& __y, const _Iterator<_Const2>& __x) 1994 1.1 mrg { return __y.__distance_from(__x); } 1995 1.1 mrg 1996 1.1 mrg friend _Sentinel<!_Const>; 1997 1.1 mrg }; 1998 1.1 mrg 1999 1.1 mrg _Vp _M_base = _Vp(); 2000 1.1.1.3 mrg [[no_unique_address]] __detail::__box<_Fp> _M_fun; 2001 1.1 mrg 2002 1.1 mrg public: 2003 1.1.1.3 mrg transform_view() requires (default_initializable<_Vp> 2004 1.1.1.3 mrg && default_initializable<_Fp>) 2005 1.1.1.3 mrg = default; 2006 1.1 mrg 2007 1.1 mrg constexpr 2008 1.1 mrg transform_view(_Vp __base, _Fp __fun) 2009 1.1 mrg : _M_base(std::move(__base)), _M_fun(std::move(__fun)) 2010 1.1 mrg { } 2011 1.1 mrg 2012 1.1 mrg constexpr _Vp 2013 1.1 mrg base() const& requires copy_constructible<_Vp> 2014 1.1 mrg { return _M_base ; } 2015 1.1 mrg 2016 1.1 mrg constexpr _Vp 2017 1.1 mrg base() && 2018 1.1 mrg { return std::move(_M_base); } 2019 1.1 mrg 2020 1.1 mrg constexpr _Iterator<false> 2021 1.1 mrg begin() 2022 1.1 mrg { return _Iterator<false>{this, ranges::begin(_M_base)}; } 2023 1.1 mrg 2024 1.1 mrg constexpr _Iterator<true> 2025 1.1 mrg begin() const 2026 1.1 mrg requires range<const _Vp> 2027 1.1 mrg && regular_invocable<const _Fp&, range_reference_t<const _Vp>> 2028 1.1 mrg { return _Iterator<true>{this, ranges::begin(_M_base)}; } 2029 1.1 mrg 2030 1.1 mrg constexpr _Sentinel<false> 2031 1.1 mrg end() 2032 1.1 mrg { return _Sentinel<false>{ranges::end(_M_base)}; } 2033 1.1 mrg 2034 1.1 mrg constexpr _Iterator<false> 2035 1.1 mrg end() requires common_range<_Vp> 2036 1.1 mrg { return _Iterator<false>{this, ranges::end(_M_base)}; } 2037 1.1 mrg 2038 1.1 mrg constexpr _Sentinel<true> 2039 1.1 mrg end() const 2040 1.1 mrg requires range<const _Vp> 2041 1.1 mrg && regular_invocable<const _Fp&, range_reference_t<const _Vp>> 2042 1.1 mrg { return _Sentinel<true>{ranges::end(_M_base)}; } 2043 1.1 mrg 2044 1.1 mrg constexpr _Iterator<true> 2045 1.1 mrg end() const 2046 1.1 mrg requires common_range<const _Vp> 2047 1.1 mrg && regular_invocable<const _Fp&, range_reference_t<const _Vp>> 2048 1.1 mrg { return _Iterator<true>{this, ranges::end(_M_base)}; } 2049 1.1 mrg 2050 1.1 mrg constexpr auto 2051 1.1 mrg size() requires sized_range<_Vp> 2052 1.1 mrg { return ranges::size(_M_base); } 2053 1.1 mrg 2054 1.1.1.3 mrg constexpr auto 2055 1.1.1.3 mrg size() const requires sized_range<const _Vp> 2056 1.1.1.3 mrg { return ranges::size(_M_base); } 2057 1.1.1.3 mrg }; 2058 1.1.1.3 mrg 2059 1.1.1.3 mrg template<typename _Range, typename _Fp> 2060 1.1.1.3 mrg transform_view(_Range&&, _Fp) -> transform_view<views::all_t<_Range>, _Fp>; 2061 1.1.1.3 mrg 2062 1.1.1.3 mrg namespace views 2063 1.1.1.3 mrg { 2064 1.1.1.3 mrg namespace __detail 2065 1.1.1.3 mrg { 2066 1.1.1.3 mrg template<typename _Range, typename _Fp> 2067 1.1.1.3 mrg concept __can_transform_view 2068 1.1.1.3 mrg = requires { transform_view(std::declval<_Range>(), std::declval<_Fp>()); }; 2069 1.1.1.3 mrg } // namespace __detail 2070 1.1.1.3 mrg 2071 1.1.1.3 mrg struct _Transform : __adaptor::_RangeAdaptor<_Transform> 2072 1.1.1.3 mrg { 2073 1.1.1.3 mrg template<viewable_range _Range, typename _Fp> 2074 1.1.1.3 mrg requires __detail::__can_transform_view<_Range, _Fp> 2075 1.1.1.3 mrg constexpr auto 2076 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Fp&& __f) const 2077 1.1.1.3 mrg { 2078 1.1.1.3 mrg return transform_view(std::forward<_Range>(__r), std::forward<_Fp>(__f)); 2079 1.1.1.3 mrg } 2080 1.1.1.3 mrg 2081 1.1.1.3 mrg using _RangeAdaptor<_Transform>::operator(); 2082 1.1.1.3 mrg static constexpr int _S_arity = 2; 2083 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args = true; 2084 1.1 mrg }; 2085 1.1 mrg 2086 1.1.1.3 mrg inline constexpr _Transform transform; 2087 1.1 mrg } // namespace views 2088 1.1 mrg 2089 1.1 mrg template<view _Vp> 2090 1.1 mrg class take_view : public view_interface<take_view<_Vp>> 2091 1.1 mrg { 2092 1.1 mrg private: 2093 1.1 mrg template<bool _Const> 2094 1.1 mrg using _CI = counted_iterator< 2095 1.1 mrg iterator_t<__detail::__maybe_const_t<_Const, _Vp>>>; 2096 1.1 mrg 2097 1.1 mrg template<bool _Const> 2098 1.1 mrg struct _Sentinel 2099 1.1 mrg { 2100 1.1 mrg private: 2101 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 2102 1.1 mrg sentinel_t<_Base> _M_end = sentinel_t<_Base>(); 2103 1.1 mrg 2104 1.1 mrg public: 2105 1.1 mrg _Sentinel() = default; 2106 1.1 mrg 2107 1.1 mrg constexpr explicit 2108 1.1 mrg _Sentinel(sentinel_t<_Base> __end) 2109 1.1 mrg : _M_end(__end) 2110 1.1 mrg { } 2111 1.1 mrg 2112 1.1 mrg constexpr 2113 1.1 mrg _Sentinel(_Sentinel<!_Const> __s) 2114 1.1 mrg requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>> 2115 1.1 mrg : _M_end(std::move(__s._M_end)) 2116 1.1 mrg { } 2117 1.1 mrg 2118 1.1 mrg constexpr sentinel_t<_Base> 2119 1.1 mrg base() const 2120 1.1 mrg { return _M_end; } 2121 1.1 mrg 2122 1.1 mrg friend constexpr bool 2123 1.1 mrg operator==(const _CI<_Const>& __y, const _Sentinel& __x) 2124 1.1 mrg { return __y.count() == 0 || __y.base() == __x._M_end; } 2125 1.1 mrg 2126 1.1 mrg template<bool _OtherConst = !_Const, 2127 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>> 2128 1.1 mrg requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 2129 1.1 mrg friend constexpr bool 2130 1.1 mrg operator==(const _CI<_OtherConst>& __y, const _Sentinel& __x) 2131 1.1 mrg { return __y.count() == 0 || __y.base() == __x._M_end; } 2132 1.1 mrg 2133 1.1 mrg friend _Sentinel<!_Const>; 2134 1.1 mrg }; 2135 1.1 mrg 2136 1.1 mrg _Vp _M_base = _Vp(); 2137 1.1 mrg range_difference_t<_Vp> _M_count = 0; 2138 1.1 mrg 2139 1.1 mrg public: 2140 1.1 mrg take_view() requires default_initializable<_Vp> = default; 2141 1.1 mrg 2142 1.1 mrg constexpr 2143 1.1 mrg take_view(_Vp base, range_difference_t<_Vp> __count) 2144 1.1 mrg : _M_base(std::move(base)), _M_count(std::move(__count)) 2145 1.1 mrg { } 2146 1.1 mrg 2147 1.1 mrg constexpr _Vp 2148 1.1 mrg base() const& requires copy_constructible<_Vp> 2149 1.1 mrg { return _M_base; } 2150 1.1 mrg 2151 1.1 mrg constexpr _Vp 2152 1.1 mrg base() && 2153 1.1 mrg { return std::move(_M_base); } 2154 1.1 mrg 2155 1.1 mrg constexpr auto 2156 1.1 mrg begin() requires (!__detail::__simple_view<_Vp>) 2157 1.1 mrg { 2158 1.1 mrg if constexpr (sized_range<_Vp>) 2159 1.1 mrg { 2160 1.1 mrg if constexpr (random_access_range<_Vp>) 2161 1.1 mrg return ranges::begin(_M_base); 2162 1.1 mrg else 2163 1.1 mrg { 2164 1.1 mrg auto __sz = size(); 2165 1.1.1.3 mrg return counted_iterator(ranges::begin(_M_base), __sz); 2166 1.1 mrg } 2167 1.1 mrg } 2168 1.1 mrg else 2169 1.1.1.3 mrg return counted_iterator(ranges::begin(_M_base), _M_count); 2170 1.1 mrg } 2171 1.1 mrg 2172 1.1 mrg constexpr auto 2173 1.1 mrg begin() const requires range<const _Vp> 2174 1.1 mrg { 2175 1.1 mrg if constexpr (sized_range<const _Vp>) 2176 1.1 mrg { 2177 1.1 mrg if constexpr (random_access_range<const _Vp>) 2178 1.1 mrg return ranges::begin(_M_base); 2179 1.1 mrg else 2180 1.1 mrg { 2181 1.1 mrg auto __sz = size(); 2182 1.1.1.3 mrg return counted_iterator(ranges::begin(_M_base), __sz); 2183 1.1 mrg } 2184 1.1 mrg } 2185 1.1 mrg else 2186 1.1.1.3 mrg return counted_iterator(ranges::begin(_M_base), _M_count); 2187 1.1 mrg } 2188 1.1 mrg 2189 1.1 mrg constexpr auto 2190 1.1 mrg end() requires (!__detail::__simple_view<_Vp>) 2191 1.1 mrg { 2192 1.1 mrg if constexpr (sized_range<_Vp>) 2193 1.1 mrg { 2194 1.1 mrg if constexpr (random_access_range<_Vp>) 2195 1.1 mrg return ranges::begin(_M_base) + size(); 2196 1.1 mrg else 2197 1.1 mrg return default_sentinel; 2198 1.1 mrg } 2199 1.1 mrg else 2200 1.1 mrg return _Sentinel<false>{ranges::end(_M_base)}; 2201 1.1 mrg } 2202 1.1 mrg 2203 1.1 mrg constexpr auto 2204 1.1 mrg end() const requires range<const _Vp> 2205 1.1 mrg { 2206 1.1 mrg if constexpr (sized_range<const _Vp>) 2207 1.1 mrg { 2208 1.1 mrg if constexpr (random_access_range<const _Vp>) 2209 1.1 mrg return ranges::begin(_M_base) + size(); 2210 1.1 mrg else 2211 1.1 mrg return default_sentinel; 2212 1.1 mrg } 2213 1.1 mrg else 2214 1.1 mrg return _Sentinel<true>{ranges::end(_M_base)}; 2215 1.1 mrg } 2216 1.1 mrg 2217 1.1 mrg constexpr auto 2218 1.1 mrg size() requires sized_range<_Vp> 2219 1.1 mrg { 2220 1.1 mrg auto __n = ranges::size(_M_base); 2221 1.1 mrg return std::min(__n, static_cast<decltype(__n)>(_M_count)); 2222 1.1 mrg } 2223 1.1 mrg 2224 1.1 mrg constexpr auto 2225 1.1 mrg size() const requires sized_range<const _Vp> 2226 1.1 mrg { 2227 1.1 mrg auto __n = ranges::size(_M_base); 2228 1.1 mrg return std::min(__n, static_cast<decltype(__n)>(_M_count)); 2229 1.1 mrg } 2230 1.1 mrg }; 2231 1.1 mrg 2232 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 2233 1.1 mrg // 3447. Deduction guides for take_view and drop_view have different 2234 1.1 mrg // constraints 2235 1.1 mrg template<typename _Range> 2236 1.1 mrg take_view(_Range&&, range_difference_t<_Range>) 2237 1.1 mrg -> take_view<views::all_t<_Range>>; 2238 1.1 mrg 2239 1.1 mrg template<typename _Tp> 2240 1.1 mrg inline constexpr bool enable_borrowed_range<take_view<_Tp>> 2241 1.1 mrg = enable_borrowed_range<_Tp>; 2242 1.1 mrg 2243 1.1 mrg namespace views 2244 1.1 mrg { 2245 1.1.1.3 mrg namespace __detail 2246 1.1.1.3 mrg { 2247 1.1.1.3 mrg template<typename _Range> 2248 1.1.1.3 mrg inline constexpr bool __is_empty_view = false; 2249 1.1.1.3 mrg 2250 1.1.1.3 mrg template<typename _Tp> 2251 1.1.1.3 mrg inline constexpr bool __is_empty_view<empty_view<_Tp>> = true; 2252 1.1.1.3 mrg 2253 1.1.1.3 mrg template<typename _Range> 2254 1.1.1.3 mrg inline constexpr bool __is_basic_string_view = false; 2255 1.1.1.3 mrg 2256 1.1.1.3 mrg template<typename _CharT, typename _Traits> 2257 1.1.1.3 mrg inline constexpr bool __is_basic_string_view<basic_string_view<_CharT, _Traits>> 2258 1.1.1.3 mrg = true; 2259 1.1.1.3 mrg 2260 1.1.1.3 mrg template<typename _Range> 2261 1.1.1.3 mrg inline constexpr bool __is_subrange = false; 2262 1.1.1.3 mrg 2263 1.1.1.3 mrg template<typename _Iter, typename _Sent, subrange_kind _Kind> 2264 1.1.1.3 mrg inline constexpr bool __is_subrange<subrange<_Iter, _Sent, _Kind>> = true; 2265 1.1.1.3 mrg 2266 1.1.1.3 mrg template<typename _Range> 2267 1.1.1.3 mrg inline constexpr bool __is_iota_view = false; 2268 1.1.1.3 mrg 2269 1.1.1.3 mrg template<typename _Winc, typename _Bound> 2270 1.1.1.3 mrg inline constexpr bool __is_iota_view<iota_view<_Winc, _Bound>> = true; 2271 1.1.1.3 mrg 2272 1.1.1.3 mrg template<typename _Range, typename _Dp> 2273 1.1.1.3 mrg concept __can_take_view 2274 1.1.1.3 mrg = requires { take_view(std::declval<_Range>(), std::declval<_Dp>()); }; 2275 1.1.1.3 mrg } // namespace __detail 2276 1.1.1.3 mrg 2277 1.1.1.3 mrg struct _Take : __adaptor::_RangeAdaptor<_Take> 2278 1.1.1.3 mrg { 2279 1.1.1.3 mrg template<viewable_range _Range, typename _Dp = range_difference_t<_Range>> 2280 1.1.1.3 mrg requires __detail::__can_take_view<_Range, _Dp> 2281 1.1.1.3 mrg constexpr auto 2282 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n) const 2283 1.1.1.3 mrg { 2284 1.1.1.3 mrg using _Tp = remove_cvref_t<_Range>; 2285 1.1.1.3 mrg if constexpr (__detail::__is_empty_view<_Tp>) 2286 1.1.1.3 mrg return _Tp(); 2287 1.1.1.3 mrg else if constexpr (random_access_range<_Tp> 2288 1.1.1.3 mrg && sized_range<_Tp> 2289 1.1.1.3 mrg && (std::__detail::__is_span<_Tp> 2290 1.1.1.3 mrg || __detail::__is_basic_string_view<_Tp> 2291 1.1.1.3 mrg || __detail::__is_subrange<_Tp> 2292 1.1.1.3 mrg || __detail::__is_iota_view<_Tp>)) 2293 1.1.1.3 mrg { 2294 1.1.1.3 mrg __n = std::min<_Dp>(ranges::distance(__r), __n); 2295 1.1.1.3 mrg auto __begin = ranges::begin(__r); 2296 1.1.1.3 mrg auto __end = __begin + __n; 2297 1.1.1.3 mrg if constexpr (std::__detail::__is_span<_Tp>) 2298 1.1.1.3 mrg return span<typename _Tp::element_type>(__begin, __end); 2299 1.1.1.3 mrg else if constexpr (__detail::__is_basic_string_view<_Tp>) 2300 1.1.1.3 mrg return _Tp(__begin, __end); 2301 1.1.1.3 mrg else if constexpr (__detail::__is_subrange<_Tp>) 2302 1.1.1.3 mrg return subrange<iterator_t<_Tp>>(__begin, __end); 2303 1.1.1.3 mrg else 2304 1.1.1.3 mrg return iota_view(*__begin, *__end); 2305 1.1.1.3 mrg } 2306 1.1.1.3 mrg else 2307 1.1.1.3 mrg return take_view(std::forward<_Range>(__r), __n); 2308 1.1.1.3 mrg } 2309 1.1.1.3 mrg 2310 1.1.1.3 mrg using _RangeAdaptor<_Take>::operator(); 2311 1.1.1.3 mrg static constexpr int _S_arity = 2; 2312 1.1.1.3 mrg // The count argument of views::take is not always simple -- it can be 2313 1.1.1.3 mrg // e.g. a move-only class that's implicitly convertible to the difference 2314 1.1.1.3 mrg // type. But an integer-like count argument is surely simple. 2315 1.1.1.3 mrg template<typename _Tp> 2316 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args 2317 1.1.1.3 mrg = ranges::__detail::__is_integer_like<_Tp>; 2318 1.1.1.3 mrg }; 2319 1.1.1.3 mrg 2320 1.1.1.3 mrg inline constexpr _Take take; 2321 1.1 mrg } // namespace views 2322 1.1 mrg 2323 1.1 mrg template<view _Vp, typename _Pred> 2324 1.1 mrg requires input_range<_Vp> && is_object_v<_Pred> 2325 1.1 mrg && indirect_unary_predicate<const _Pred, iterator_t<_Vp>> 2326 1.1 mrg class take_while_view : public view_interface<take_while_view<_Vp, _Pred>> 2327 1.1 mrg { 2328 1.1 mrg template<bool _Const> 2329 1.1 mrg struct _Sentinel 2330 1.1 mrg { 2331 1.1 mrg private: 2332 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 2333 1.1 mrg 2334 1.1 mrg sentinel_t<_Base> _M_end = sentinel_t<_Base>(); 2335 1.1 mrg const _Pred* _M_pred = nullptr; 2336 1.1 mrg 2337 1.1 mrg public: 2338 1.1 mrg _Sentinel() = default; 2339 1.1 mrg 2340 1.1 mrg constexpr explicit 2341 1.1 mrg _Sentinel(sentinel_t<_Base> __end, const _Pred* __pred) 2342 1.1 mrg : _M_end(__end), _M_pred(__pred) 2343 1.1 mrg { } 2344 1.1 mrg 2345 1.1 mrg constexpr 2346 1.1 mrg _Sentinel(_Sentinel<!_Const> __s) 2347 1.1 mrg requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>> 2348 1.1 mrg : _M_end(__s._M_end), _M_pred(__s._M_pred) 2349 1.1 mrg { } 2350 1.1 mrg 2351 1.1 mrg constexpr sentinel_t<_Base> 2352 1.1 mrg base() const { return _M_end; } 2353 1.1 mrg 2354 1.1 mrg friend constexpr bool 2355 1.1 mrg operator==(const iterator_t<_Base>& __x, const _Sentinel& __y) 2356 1.1 mrg { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); } 2357 1.1 mrg 2358 1.1 mrg template<bool _OtherConst = !_Const, 2359 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_OtherConst, _Vp>> 2360 1.1 mrg requires sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 2361 1.1 mrg friend constexpr bool 2362 1.1 mrg operator==(const iterator_t<_Base2>& __x, const _Sentinel& __y) 2363 1.1 mrg { return __y._M_end == __x || !std::__invoke(*__y._M_pred, *__x); } 2364 1.1 mrg 2365 1.1 mrg friend _Sentinel<!_Const>; 2366 1.1 mrg }; 2367 1.1 mrg 2368 1.1 mrg _Vp _M_base = _Vp(); 2369 1.1.1.3 mrg [[no_unique_address]] __detail::__box<_Pred> _M_pred; 2370 1.1 mrg 2371 1.1 mrg public: 2372 1.1.1.3 mrg take_while_view() requires (default_initializable<_Vp> 2373 1.1.1.3 mrg && default_initializable<_Pred>) 2374 1.1.1.3 mrg = default; 2375 1.1 mrg 2376 1.1 mrg constexpr 2377 1.1 mrg take_while_view(_Vp base, _Pred __pred) 2378 1.1 mrg : _M_base(std::move(base)), _M_pred(std::move(__pred)) 2379 1.1.1.3 mrg { } 2380 1.1 mrg 2381 1.1 mrg constexpr _Vp 2382 1.1 mrg base() const& requires copy_constructible<_Vp> 2383 1.1 mrg { return _M_base; } 2384 1.1 mrg 2385 1.1 mrg constexpr _Vp 2386 1.1 mrg base() && 2387 1.1 mrg { return std::move(_M_base); } 2388 1.1 mrg 2389 1.1 mrg constexpr const _Pred& 2390 1.1 mrg pred() const 2391 1.1 mrg { return *_M_pred; } 2392 1.1 mrg 2393 1.1 mrg constexpr auto 2394 1.1 mrg begin() requires (!__detail::__simple_view<_Vp>) 2395 1.1 mrg { return ranges::begin(_M_base); } 2396 1.1 mrg 2397 1.1 mrg constexpr auto 2398 1.1 mrg begin() const requires range<const _Vp> 2399 1.1 mrg && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>> 2400 1.1 mrg { return ranges::begin(_M_base); } 2401 1.1 mrg 2402 1.1 mrg constexpr auto 2403 1.1 mrg end() requires (!__detail::__simple_view<_Vp>) 2404 1.1 mrg { return _Sentinel<false>(ranges::end(_M_base), 2405 1.1 mrg std::__addressof(*_M_pred)); } 2406 1.1 mrg 2407 1.1 mrg constexpr auto 2408 1.1 mrg end() const requires range<const _Vp> 2409 1.1 mrg && indirect_unary_predicate<const _Pred, iterator_t<const _Vp>> 2410 1.1 mrg { return _Sentinel<true>(ranges::end(_M_base), 2411 1.1 mrg std::__addressof(*_M_pred)); } 2412 1.1 mrg }; 2413 1.1 mrg 2414 1.1 mrg template<typename _Range, typename _Pred> 2415 1.1 mrg take_while_view(_Range&&, _Pred) 2416 1.1 mrg -> take_while_view<views::all_t<_Range>, _Pred>; 2417 1.1 mrg 2418 1.1 mrg namespace views 2419 1.1 mrg { 2420 1.1.1.3 mrg namespace __detail 2421 1.1.1.3 mrg { 2422 1.1.1.3 mrg template<typename _Range, typename _Pred> 2423 1.1.1.3 mrg concept __can_take_while_view 2424 1.1.1.3 mrg = requires { take_while_view(std::declval<_Range>(), std::declval<_Pred>()); }; 2425 1.1.1.3 mrg } // namespace __detail 2426 1.1.1.3 mrg 2427 1.1.1.3 mrg struct _TakeWhile : __adaptor::_RangeAdaptor<_TakeWhile> 2428 1.1.1.3 mrg { 2429 1.1.1.3 mrg template<viewable_range _Range, typename _Pred> 2430 1.1.1.3 mrg requires __detail::__can_take_while_view<_Range, _Pred> 2431 1.1.1.3 mrg constexpr auto 2432 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const 2433 1.1.1.3 mrg { 2434 1.1.1.3 mrg return take_while_view(std::forward<_Range>(__r), std::forward<_Pred>(__p)); 2435 1.1.1.3 mrg } 2436 1.1.1.3 mrg 2437 1.1.1.3 mrg using _RangeAdaptor<_TakeWhile>::operator(); 2438 1.1.1.3 mrg static constexpr int _S_arity = 2; 2439 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args = true; 2440 1.1.1.3 mrg }; 2441 1.1.1.3 mrg 2442 1.1.1.3 mrg inline constexpr _TakeWhile take_while; 2443 1.1 mrg } // namespace views 2444 1.1 mrg 2445 1.1 mrg template<view _Vp> 2446 1.1 mrg class drop_view : public view_interface<drop_view<_Vp>> 2447 1.1 mrg { 2448 1.1 mrg private: 2449 1.1 mrg _Vp _M_base = _Vp(); 2450 1.1 mrg range_difference_t<_Vp> _M_count = 0; 2451 1.1 mrg 2452 1.1 mrg // ranges::next(begin(base), count, end(base)) is O(1) if _Vp satisfies 2453 1.1 mrg // both random_access_range and sized_range. Otherwise, cache its result. 2454 1.1 mrg static constexpr bool _S_needs_cached_begin 2455 1.1 mrg = !(random_access_range<const _Vp> && sized_range<const _Vp>); 2456 1.1 mrg [[no_unique_address]] 2457 1.1 mrg __detail::__maybe_present_t<_S_needs_cached_begin, 2458 1.1 mrg __detail::_CachedPosition<_Vp>> 2459 1.1 mrg _M_cached_begin; 2460 1.1 mrg 2461 1.1 mrg public: 2462 1.1 mrg drop_view() requires default_initializable<_Vp> = default; 2463 1.1 mrg 2464 1.1 mrg constexpr 2465 1.1 mrg drop_view(_Vp __base, range_difference_t<_Vp> __count) 2466 1.1 mrg : _M_base(std::move(__base)), _M_count(__count) 2467 1.1 mrg { __glibcxx_assert(__count >= 0); } 2468 1.1 mrg 2469 1.1 mrg constexpr _Vp 2470 1.1 mrg base() const& requires copy_constructible<_Vp> 2471 1.1 mrg { return _M_base; } 2472 1.1 mrg 2473 1.1 mrg constexpr _Vp 2474 1.1 mrg base() && 2475 1.1 mrg { return std::move(_M_base); } 2476 1.1 mrg 2477 1.1 mrg // This overload is disabled for simple views with constant-time begin(). 2478 1.1 mrg constexpr auto 2479 1.1 mrg begin() 2480 1.1 mrg requires (!(__detail::__simple_view<_Vp> 2481 1.1 mrg && random_access_range<const _Vp> 2482 1.1 mrg && sized_range<const _Vp>)) 2483 1.1 mrg { 2484 1.1 mrg if constexpr (_S_needs_cached_begin) 2485 1.1 mrg if (_M_cached_begin._M_has_value()) 2486 1.1 mrg return _M_cached_begin._M_get(_M_base); 2487 1.1 mrg 2488 1.1 mrg auto __it = ranges::next(ranges::begin(_M_base), 2489 1.1 mrg _M_count, ranges::end(_M_base)); 2490 1.1 mrg if constexpr (_S_needs_cached_begin) 2491 1.1 mrg _M_cached_begin._M_set(_M_base, __it); 2492 1.1 mrg return __it; 2493 1.1 mrg } 2494 1.1 mrg 2495 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 2496 1.1 mrg // 3482. drop_view's const begin should additionally require sized_range 2497 1.1 mrg constexpr auto 2498 1.1 mrg begin() const 2499 1.1 mrg requires random_access_range<const _Vp> && sized_range<const _Vp> 2500 1.1 mrg { 2501 1.1 mrg return ranges::next(ranges::begin(_M_base), _M_count, 2502 1.1 mrg ranges::end(_M_base)); 2503 1.1 mrg } 2504 1.1 mrg 2505 1.1 mrg constexpr auto 2506 1.1 mrg end() requires (!__detail::__simple_view<_Vp>) 2507 1.1 mrg { return ranges::end(_M_base); } 2508 1.1 mrg 2509 1.1 mrg constexpr auto 2510 1.1 mrg end() const requires range<const _Vp> 2511 1.1 mrg { return ranges::end(_M_base); } 2512 1.1 mrg 2513 1.1 mrg constexpr auto 2514 1.1 mrg size() requires sized_range<_Vp> 2515 1.1 mrg { 2516 1.1 mrg const auto __s = ranges::size(_M_base); 2517 1.1 mrg const auto __c = static_cast<decltype(__s)>(_M_count); 2518 1.1 mrg return __s < __c ? 0 : __s - __c; 2519 1.1 mrg } 2520 1.1 mrg 2521 1.1 mrg constexpr auto 2522 1.1 mrg size() const requires sized_range<const _Vp> 2523 1.1 mrg { 2524 1.1 mrg const auto __s = ranges::size(_M_base); 2525 1.1 mrg const auto __c = static_cast<decltype(__s)>(_M_count); 2526 1.1 mrg return __s < __c ? 0 : __s - __c; 2527 1.1 mrg } 2528 1.1 mrg }; 2529 1.1 mrg 2530 1.1 mrg template<typename _Range> 2531 1.1 mrg drop_view(_Range&&, range_difference_t<_Range>) 2532 1.1 mrg -> drop_view<views::all_t<_Range>>; 2533 1.1 mrg 2534 1.1 mrg template<typename _Tp> 2535 1.1 mrg inline constexpr bool enable_borrowed_range<drop_view<_Tp>> 2536 1.1 mrg = enable_borrowed_range<_Tp>; 2537 1.1 mrg 2538 1.1 mrg namespace views 2539 1.1 mrg { 2540 1.1.1.3 mrg namespace __detail 2541 1.1.1.3 mrg { 2542 1.1.1.3 mrg template<typename _Range, typename _Dp> 2543 1.1.1.3 mrg concept __can_drop_view 2544 1.1.1.3 mrg = requires { drop_view(std::declval<_Range>(), std::declval<_Dp>()); }; 2545 1.1.1.3 mrg } // namespace __detail 2546 1.1.1.3 mrg 2547 1.1.1.3 mrg struct _Drop : __adaptor::_RangeAdaptor<_Drop> 2548 1.1.1.3 mrg { 2549 1.1.1.3 mrg template<viewable_range _Range, typename _Dp = range_difference_t<_Range>> 2550 1.1.1.3 mrg requires __detail::__can_drop_view<_Range, _Dp> 2551 1.1.1.3 mrg constexpr auto 2552 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, type_identity_t<_Dp> __n) const 2553 1.1.1.3 mrg { 2554 1.1.1.3 mrg using _Tp = remove_cvref_t<_Range>; 2555 1.1.1.3 mrg if constexpr (__detail::__is_empty_view<_Tp>) 2556 1.1.1.3 mrg return _Tp(); 2557 1.1.1.3 mrg else if constexpr (random_access_range<_Tp> 2558 1.1.1.3 mrg && sized_range<_Tp> 2559 1.1.1.3 mrg && (std::__detail::__is_span<_Tp> 2560 1.1.1.3 mrg || __detail::__is_basic_string_view<_Tp> 2561 1.1.1.3 mrg || __detail::__is_iota_view<_Tp> 2562 1.1.1.3 mrg || __detail::__is_subrange<_Tp>)) 2563 1.1.1.3 mrg { 2564 1.1.1.3 mrg __n = std::min<_Dp>(ranges::distance(__r), __n); 2565 1.1.1.3 mrg auto __begin = ranges::begin(__r) + __n; 2566 1.1.1.3 mrg auto __end = ranges::end(__r); 2567 1.1.1.3 mrg if constexpr (std::__detail::__is_span<_Tp>) 2568 1.1.1.3 mrg return span<typename _Tp::element_type>(__begin, __end); 2569 1.1.1.3 mrg else if constexpr (__detail::__is_subrange<_Tp>) 2570 1.1.1.3 mrg { 2571 1.1.1.3 mrg if constexpr (_Tp::_S_store_size) 2572 1.1.1.3 mrg { 2573 1.1.1.3 mrg using ranges::__detail::__to_unsigned_like; 2574 1.1.1.3 mrg auto __m = ranges::distance(__r) - __n; 2575 1.1.1.3 mrg return _Tp(__begin, __end, __to_unsigned_like(__m)); 2576 1.1.1.3 mrg } 2577 1.1.1.3 mrg else 2578 1.1.1.3 mrg return _Tp(__begin, __end); 2579 1.1.1.3 mrg } 2580 1.1.1.3 mrg else 2581 1.1.1.3 mrg return _Tp(__begin, __end); 2582 1.1.1.3 mrg } 2583 1.1.1.3 mrg else 2584 1.1.1.3 mrg return drop_view(std::forward<_Range>(__r), __n); 2585 1.1.1.3 mrg } 2586 1.1.1.3 mrg 2587 1.1.1.3 mrg using _RangeAdaptor<_Drop>::operator(); 2588 1.1.1.3 mrg static constexpr int _S_arity = 2; 2589 1.1.1.3 mrg template<typename _Tp> 2590 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args 2591 1.1.1.3 mrg = _Take::_S_has_simple_extra_args<_Tp>; 2592 1.1.1.3 mrg }; 2593 1.1.1.3 mrg 2594 1.1.1.3 mrg inline constexpr _Drop drop; 2595 1.1 mrg } // namespace views 2596 1.1 mrg 2597 1.1 mrg template<view _Vp, typename _Pred> 2598 1.1 mrg requires input_range<_Vp> && is_object_v<_Pred> 2599 1.1 mrg && indirect_unary_predicate<const _Pred, iterator_t<_Vp>> 2600 1.1 mrg class drop_while_view : public view_interface<drop_while_view<_Vp, _Pred>> 2601 1.1 mrg { 2602 1.1 mrg private: 2603 1.1 mrg _Vp _M_base = _Vp(); 2604 1.1.1.3 mrg [[no_unique_address]] __detail::__box<_Pred> _M_pred; 2605 1.1 mrg [[no_unique_address]] __detail::_CachedPosition<_Vp> _M_cached_begin; 2606 1.1 mrg 2607 1.1 mrg public: 2608 1.1.1.3 mrg drop_while_view() requires (default_initializable<_Vp> 2609 1.1.1.3 mrg && default_initializable<_Pred>) 2610 1.1.1.3 mrg = default; 2611 1.1 mrg 2612 1.1 mrg constexpr 2613 1.1 mrg drop_while_view(_Vp __base, _Pred __pred) 2614 1.1 mrg : _M_base(std::move(__base)), _M_pred(std::move(__pred)) 2615 1.1 mrg { } 2616 1.1 mrg 2617 1.1 mrg constexpr _Vp 2618 1.1 mrg base() const& requires copy_constructible<_Vp> 2619 1.1 mrg { return _M_base; } 2620 1.1 mrg 2621 1.1 mrg constexpr _Vp 2622 1.1 mrg base() && 2623 1.1 mrg { return std::move(_M_base); } 2624 1.1 mrg 2625 1.1 mrg constexpr const _Pred& 2626 1.1 mrg pred() const 2627 1.1 mrg { return *_M_pred; } 2628 1.1 mrg 2629 1.1 mrg constexpr auto 2630 1.1 mrg begin() 2631 1.1 mrg { 2632 1.1 mrg if (_M_cached_begin._M_has_value()) 2633 1.1 mrg return _M_cached_begin._M_get(_M_base); 2634 1.1 mrg 2635 1.1 mrg __glibcxx_assert(_M_pred.has_value()); 2636 1.1.1.3 mrg auto __it = ranges::find_if_not(ranges::begin(_M_base), 2637 1.1.1.3 mrg ranges::end(_M_base), 2638 1.1.1.3 mrg std::cref(*_M_pred)); 2639 1.1 mrg _M_cached_begin._M_set(_M_base, __it); 2640 1.1 mrg return __it; 2641 1.1 mrg } 2642 1.1 mrg 2643 1.1 mrg constexpr auto 2644 1.1 mrg end() 2645 1.1 mrg { return ranges::end(_M_base); } 2646 1.1 mrg }; 2647 1.1 mrg 2648 1.1 mrg template<typename _Range, typename _Pred> 2649 1.1 mrg drop_while_view(_Range&&, _Pred) 2650 1.1 mrg -> drop_while_view<views::all_t<_Range>, _Pred>; 2651 1.1 mrg 2652 1.1 mrg template<typename _Tp, typename _Pred> 2653 1.1 mrg inline constexpr bool enable_borrowed_range<drop_while_view<_Tp, _Pred>> 2654 1.1 mrg = enable_borrowed_range<_Tp>; 2655 1.1 mrg 2656 1.1 mrg namespace views 2657 1.1 mrg { 2658 1.1.1.3 mrg namespace __detail 2659 1.1.1.3 mrg { 2660 1.1.1.3 mrg template<typename _Range, typename _Pred> 2661 1.1.1.3 mrg concept __can_drop_while_view 2662 1.1.1.3 mrg = requires { drop_while_view(std::declval<_Range>(), std::declval<_Pred>()); }; 2663 1.1.1.3 mrg } // namespace __detail 2664 1.1.1.3 mrg 2665 1.1.1.3 mrg struct _DropWhile : __adaptor::_RangeAdaptor<_DropWhile> 2666 1.1.1.3 mrg { 2667 1.1.1.3 mrg template<viewable_range _Range, typename _Pred> 2668 1.1.1.3 mrg requires __detail::__can_drop_while_view<_Range, _Pred> 2669 1.1.1.3 mrg constexpr auto 2670 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Pred&& __p) const 2671 1.1.1.3 mrg { 2672 1.1.1.3 mrg return drop_while_view(std::forward<_Range>(__r), 2673 1.1.1.3 mrg std::forward<_Pred>(__p)); 2674 1.1.1.3 mrg } 2675 1.1.1.3 mrg 2676 1.1.1.3 mrg using _RangeAdaptor<_DropWhile>::operator(); 2677 1.1.1.3 mrg static constexpr int _S_arity = 2; 2678 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args = true; 2679 1.1.1.3 mrg }; 2680 1.1.1.3 mrg 2681 1.1.1.3 mrg inline constexpr _DropWhile drop_while; 2682 1.1 mrg } // namespace views 2683 1.1 mrg 2684 1.1 mrg template<input_range _Vp> 2685 1.1 mrg requires view<_Vp> && input_range<range_reference_t<_Vp>> 2686 1.1 mrg class join_view : public view_interface<join_view<_Vp>> 2687 1.1 mrg { 2688 1.1 mrg private: 2689 1.1 mrg using _InnerRange = range_reference_t<_Vp>; 2690 1.1 mrg 2691 1.1 mrg template<bool _Const> 2692 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 2693 1.1 mrg 2694 1.1 mrg template<bool _Const> 2695 1.1 mrg using _Outer_iter = iterator_t<_Base<_Const>>; 2696 1.1 mrg 2697 1.1 mrg template<bool _Const> 2698 1.1 mrg using _Inner_iter = iterator_t<range_reference_t<_Base<_Const>>>; 2699 1.1 mrg 2700 1.1 mrg template<bool _Const> 2701 1.1 mrg static constexpr bool _S_ref_is_glvalue 2702 1.1 mrg = is_reference_v<range_reference_t<_Base<_Const>>>; 2703 1.1 mrg 2704 1.1 mrg template<bool _Const> 2705 1.1 mrg struct __iter_cat 2706 1.1 mrg { }; 2707 1.1 mrg 2708 1.1 mrg template<bool _Const> 2709 1.1 mrg requires _S_ref_is_glvalue<_Const> 2710 1.1 mrg && forward_range<_Base<_Const>> 2711 1.1 mrg && forward_range<range_reference_t<_Base<_Const>>> 2712 1.1 mrg struct __iter_cat<_Const> 2713 1.1 mrg { 2714 1.1 mrg private: 2715 1.1 mrg static constexpr auto 2716 1.1 mrg _S_iter_cat() 2717 1.1 mrg { 2718 1.1 mrg using _Outer_iter = join_view::_Outer_iter<_Const>; 2719 1.1 mrg using _Inner_iter = join_view::_Inner_iter<_Const>; 2720 1.1 mrg using _OuterCat = typename iterator_traits<_Outer_iter>::iterator_category; 2721 1.1 mrg using _InnerCat = typename iterator_traits<_Inner_iter>::iterator_category; 2722 1.1 mrg if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag> 2723 1.1.1.3 mrg && derived_from<_InnerCat, bidirectional_iterator_tag> 2724 1.1.1.3 mrg && common_range<range_reference_t<_Base<_Const>>>) 2725 1.1 mrg return bidirectional_iterator_tag{}; 2726 1.1 mrg else if constexpr (derived_from<_OuterCat, forward_iterator_tag> 2727 1.1 mrg && derived_from<_InnerCat, forward_iterator_tag>) 2728 1.1 mrg return forward_iterator_tag{}; 2729 1.1 mrg else 2730 1.1 mrg return input_iterator_tag{}; 2731 1.1 mrg } 2732 1.1 mrg public: 2733 1.1 mrg using iterator_category = decltype(_S_iter_cat()); 2734 1.1 mrg }; 2735 1.1 mrg 2736 1.1 mrg template<bool _Const> 2737 1.1 mrg struct _Sentinel; 2738 1.1 mrg 2739 1.1 mrg template<bool _Const> 2740 1.1 mrg struct _Iterator : __iter_cat<_Const> 2741 1.1 mrg { 2742 1.1 mrg private: 2743 1.1 mrg using _Parent = __detail::__maybe_const_t<_Const, join_view>; 2744 1.1 mrg using _Base = join_view::_Base<_Const>; 2745 1.1 mrg 2746 1.1 mrg static constexpr bool _S_ref_is_glvalue 2747 1.1 mrg = join_view::_S_ref_is_glvalue<_Const>; 2748 1.1 mrg 2749 1.1 mrg constexpr void 2750 1.1 mrg _M_satisfy() 2751 1.1 mrg { 2752 1.1.1.3 mrg auto __update_inner = [this] (const iterator_t<_Base>& __x) -> auto&& { 2753 1.1 mrg if constexpr (_S_ref_is_glvalue) 2754 1.1.1.3 mrg return *__x; 2755 1.1 mrg else 2756 1.1.1.3 mrg return _M_parent->_M_inner._M_emplace_deref(__x); 2757 1.1 mrg }; 2758 1.1 mrg 2759 1.1 mrg for (; _M_outer != ranges::end(_M_parent->_M_base); ++_M_outer) 2760 1.1 mrg { 2761 1.1.1.3 mrg auto&& __inner = __update_inner(_M_outer); 2762 1.1 mrg _M_inner = ranges::begin(__inner); 2763 1.1 mrg if (_M_inner != ranges::end(__inner)) 2764 1.1 mrg return; 2765 1.1 mrg } 2766 1.1 mrg 2767 1.1 mrg if constexpr (_S_ref_is_glvalue) 2768 1.1 mrg _M_inner = _Inner_iter(); 2769 1.1 mrg } 2770 1.1 mrg 2771 1.1 mrg static constexpr auto 2772 1.1 mrg _S_iter_concept() 2773 1.1 mrg { 2774 1.1 mrg if constexpr (_S_ref_is_glvalue 2775 1.1 mrg && bidirectional_range<_Base> 2776 1.1.1.3 mrg && bidirectional_range<range_reference_t<_Base>> 2777 1.1.1.3 mrg && common_range<range_reference_t<_Base>>) 2778 1.1 mrg return bidirectional_iterator_tag{}; 2779 1.1 mrg else if constexpr (_S_ref_is_glvalue 2780 1.1 mrg && forward_range<_Base> 2781 1.1 mrg && forward_range<range_reference_t<_Base>>) 2782 1.1 mrg return forward_iterator_tag{}; 2783 1.1 mrg else 2784 1.1 mrg return input_iterator_tag{}; 2785 1.1 mrg } 2786 1.1 mrg 2787 1.1 mrg using _Outer_iter = join_view::_Outer_iter<_Const>; 2788 1.1 mrg using _Inner_iter = join_view::_Inner_iter<_Const>; 2789 1.1 mrg 2790 1.1 mrg _Outer_iter _M_outer = _Outer_iter(); 2791 1.1 mrg _Inner_iter _M_inner = _Inner_iter(); 2792 1.1 mrg _Parent* _M_parent = nullptr; 2793 1.1 mrg 2794 1.1 mrg public: 2795 1.1 mrg using iterator_concept = decltype(_S_iter_concept()); 2796 1.1 mrg // iterator_category defined in __join_view_iter_cat 2797 1.1 mrg using value_type = range_value_t<range_reference_t<_Base>>; 2798 1.1 mrg using difference_type 2799 1.1 mrg = common_type_t<range_difference_t<_Base>, 2800 1.1 mrg range_difference_t<range_reference_t<_Base>>>; 2801 1.1 mrg 2802 1.1 mrg _Iterator() requires (default_initializable<_Outer_iter> 2803 1.1 mrg && default_initializable<_Inner_iter>) 2804 1.1 mrg = default; 2805 1.1 mrg 2806 1.1 mrg constexpr 2807 1.1 mrg _Iterator(_Parent* __parent, _Outer_iter __outer) 2808 1.1 mrg : _M_outer(std::move(__outer)), 2809 1.1 mrg _M_parent(__parent) 2810 1.1 mrg { _M_satisfy(); } 2811 1.1 mrg 2812 1.1 mrg constexpr 2813 1.1 mrg _Iterator(_Iterator<!_Const> __i) 2814 1.1 mrg requires _Const 2815 1.1 mrg && convertible_to<iterator_t<_Vp>, _Outer_iter> 2816 1.1 mrg && convertible_to<iterator_t<_InnerRange>, _Inner_iter> 2817 1.1 mrg : _M_outer(std::move(__i._M_outer)), _M_inner(std::move(__i._M_inner)), 2818 1.1 mrg _M_parent(__i._M_parent) 2819 1.1 mrg { } 2820 1.1 mrg 2821 1.1 mrg constexpr decltype(auto) 2822 1.1 mrg operator*() const 2823 1.1 mrg { return *_M_inner; } 2824 1.1 mrg 2825 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 2826 1.1 mrg // 3500. join_view::iterator::operator->() is bogus 2827 1.1 mrg constexpr _Inner_iter 2828 1.1 mrg operator->() const 2829 1.1 mrg requires __detail::__has_arrow<_Inner_iter> 2830 1.1 mrg && copyable<_Inner_iter> 2831 1.1 mrg { return _M_inner; } 2832 1.1 mrg 2833 1.1 mrg constexpr _Iterator& 2834 1.1 mrg operator++() 2835 1.1 mrg { 2836 1.1 mrg auto&& __inner_range = [this] () -> auto&& { 2837 1.1 mrg if constexpr (_S_ref_is_glvalue) 2838 1.1 mrg return *_M_outer; 2839 1.1 mrg else 2840 1.1.1.3 mrg return *_M_parent->_M_inner; 2841 1.1 mrg }(); 2842 1.1 mrg if (++_M_inner == ranges::end(__inner_range)) 2843 1.1 mrg { 2844 1.1 mrg ++_M_outer; 2845 1.1 mrg _M_satisfy(); 2846 1.1 mrg } 2847 1.1 mrg return *this; 2848 1.1 mrg } 2849 1.1 mrg 2850 1.1 mrg constexpr void 2851 1.1 mrg operator++(int) 2852 1.1 mrg { ++*this; } 2853 1.1 mrg 2854 1.1 mrg constexpr _Iterator 2855 1.1 mrg operator++(int) 2856 1.1 mrg requires _S_ref_is_glvalue && forward_range<_Base> 2857 1.1 mrg && forward_range<range_reference_t<_Base>> 2858 1.1 mrg { 2859 1.1 mrg auto __tmp = *this; 2860 1.1 mrg ++*this; 2861 1.1 mrg return __tmp; 2862 1.1 mrg } 2863 1.1 mrg 2864 1.1 mrg constexpr _Iterator& 2865 1.1 mrg operator--() 2866 1.1 mrg requires _S_ref_is_glvalue && bidirectional_range<_Base> 2867 1.1 mrg && bidirectional_range<range_reference_t<_Base>> 2868 1.1 mrg && common_range<range_reference_t<_Base>> 2869 1.1 mrg { 2870 1.1 mrg if (_M_outer == ranges::end(_M_parent->_M_base)) 2871 1.1 mrg _M_inner = ranges::end(*--_M_outer); 2872 1.1 mrg while (_M_inner == ranges::begin(*_M_outer)) 2873 1.1 mrg _M_inner = ranges::end(*--_M_outer); 2874 1.1 mrg --_M_inner; 2875 1.1 mrg return *this; 2876 1.1 mrg } 2877 1.1 mrg 2878 1.1 mrg constexpr _Iterator 2879 1.1 mrg operator--(int) 2880 1.1 mrg requires _S_ref_is_glvalue && bidirectional_range<_Base> 2881 1.1 mrg && bidirectional_range<range_reference_t<_Base>> 2882 1.1 mrg && common_range<range_reference_t<_Base>> 2883 1.1 mrg { 2884 1.1 mrg auto __tmp = *this; 2885 1.1 mrg --*this; 2886 1.1 mrg return __tmp; 2887 1.1 mrg } 2888 1.1 mrg 2889 1.1 mrg friend constexpr bool 2890 1.1 mrg operator==(const _Iterator& __x, const _Iterator& __y) 2891 1.1 mrg requires _S_ref_is_glvalue 2892 1.1 mrg && equality_comparable<_Outer_iter> 2893 1.1 mrg && equality_comparable<_Inner_iter> 2894 1.1 mrg { 2895 1.1 mrg return (__x._M_outer == __y._M_outer 2896 1.1 mrg && __x._M_inner == __y._M_inner); 2897 1.1 mrg } 2898 1.1 mrg 2899 1.1 mrg friend constexpr decltype(auto) 2900 1.1 mrg iter_move(const _Iterator& __i) 2901 1.1 mrg noexcept(noexcept(ranges::iter_move(__i._M_inner))) 2902 1.1 mrg { return ranges::iter_move(__i._M_inner); } 2903 1.1 mrg 2904 1.1 mrg friend constexpr void 2905 1.1 mrg iter_swap(const _Iterator& __x, const _Iterator& __y) 2906 1.1 mrg noexcept(noexcept(ranges::iter_swap(__x._M_inner, __y._M_inner))) 2907 1.1 mrg requires indirectly_swappable<_Inner_iter> 2908 1.1 mrg { return ranges::iter_swap(__x._M_inner, __y._M_inner); } 2909 1.1 mrg 2910 1.1 mrg friend _Iterator<!_Const>; 2911 1.1 mrg template<bool> friend struct _Sentinel; 2912 1.1 mrg }; 2913 1.1 mrg 2914 1.1 mrg template<bool _Const> 2915 1.1 mrg struct _Sentinel 2916 1.1 mrg { 2917 1.1 mrg private: 2918 1.1 mrg using _Parent = __detail::__maybe_const_t<_Const, join_view>; 2919 1.1 mrg using _Base = join_view::_Base<_Const>; 2920 1.1 mrg 2921 1.1 mrg template<bool _Const2> 2922 1.1 mrg constexpr bool 2923 1.1 mrg __equal(const _Iterator<_Const2>& __i) const 2924 1.1 mrg { return __i._M_outer == _M_end; } 2925 1.1 mrg 2926 1.1 mrg sentinel_t<_Base> _M_end = sentinel_t<_Base>(); 2927 1.1 mrg 2928 1.1 mrg public: 2929 1.1 mrg _Sentinel() = default; 2930 1.1 mrg 2931 1.1 mrg constexpr explicit 2932 1.1 mrg _Sentinel(_Parent* __parent) 2933 1.1 mrg : _M_end(ranges::end(__parent->_M_base)) 2934 1.1 mrg { } 2935 1.1 mrg 2936 1.1 mrg constexpr 2937 1.1 mrg _Sentinel(_Sentinel<!_Const> __s) 2938 1.1 mrg requires _Const && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>> 2939 1.1 mrg : _M_end(std::move(__s._M_end)) 2940 1.1 mrg { } 2941 1.1 mrg 2942 1.1 mrg template<bool _Const2> 2943 1.1 mrg requires sentinel_for<sentinel_t<_Base>, 2944 1.1 mrg iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>> 2945 1.1 mrg friend constexpr bool 2946 1.1 mrg operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y) 2947 1.1 mrg { return __y.__equal(__x); } 2948 1.1 mrg 2949 1.1 mrg friend _Sentinel<!_Const>; 2950 1.1 mrg }; 2951 1.1 mrg 2952 1.1 mrg _Vp _M_base = _Vp(); 2953 1.1 mrg [[no_unique_address]] 2954 1.1.1.3 mrg __detail::__non_propagating_cache<remove_cv_t<_InnerRange>> _M_inner; 2955 1.1 mrg 2956 1.1 mrg public: 2957 1.1 mrg join_view() requires default_initializable<_Vp> = default; 2958 1.1 mrg 2959 1.1 mrg constexpr explicit 2960 1.1 mrg join_view(_Vp __base) 2961 1.1 mrg : _M_base(std::move(__base)) 2962 1.1 mrg { } 2963 1.1 mrg 2964 1.1 mrg constexpr _Vp 2965 1.1 mrg base() const& requires copy_constructible<_Vp> 2966 1.1 mrg { return _M_base; } 2967 1.1 mrg 2968 1.1 mrg constexpr _Vp 2969 1.1 mrg base() && 2970 1.1 mrg { return std::move(_M_base); } 2971 1.1 mrg 2972 1.1 mrg constexpr auto 2973 1.1 mrg begin() 2974 1.1 mrg { 2975 1.1 mrg constexpr bool __use_const 2976 1.1 mrg = (__detail::__simple_view<_Vp> 2977 1.1 mrg && is_reference_v<range_reference_t<_Vp>>); 2978 1.1 mrg return _Iterator<__use_const>{this, ranges::begin(_M_base)}; 2979 1.1 mrg } 2980 1.1 mrg 2981 1.1 mrg constexpr auto 2982 1.1 mrg begin() const 2983 1.1 mrg requires input_range<const _Vp> 2984 1.1 mrg && is_reference_v<range_reference_t<const _Vp>> 2985 1.1 mrg { 2986 1.1 mrg return _Iterator<true>{this, ranges::begin(_M_base)}; 2987 1.1 mrg } 2988 1.1 mrg 2989 1.1 mrg constexpr auto 2990 1.1 mrg end() 2991 1.1 mrg { 2992 1.1 mrg if constexpr (forward_range<_Vp> && is_reference_v<_InnerRange> 2993 1.1 mrg && forward_range<_InnerRange> 2994 1.1 mrg && common_range<_Vp> && common_range<_InnerRange>) 2995 1.1 mrg return _Iterator<__detail::__simple_view<_Vp>>{this, 2996 1.1 mrg ranges::end(_M_base)}; 2997 1.1 mrg else 2998 1.1 mrg return _Sentinel<__detail::__simple_view<_Vp>>{this}; 2999 1.1 mrg } 3000 1.1 mrg 3001 1.1 mrg constexpr auto 3002 1.1 mrg end() const 3003 1.1 mrg requires input_range<const _Vp> 3004 1.1 mrg && is_reference_v<range_reference_t<const _Vp>> 3005 1.1 mrg { 3006 1.1 mrg if constexpr (forward_range<const _Vp> 3007 1.1 mrg && is_reference_v<range_reference_t<const _Vp>> 3008 1.1 mrg && forward_range<range_reference_t<const _Vp>> 3009 1.1 mrg && common_range<const _Vp> 3010 1.1 mrg && common_range<range_reference_t<const _Vp>>) 3011 1.1 mrg return _Iterator<true>{this, ranges::end(_M_base)}; 3012 1.1 mrg else 3013 1.1 mrg return _Sentinel<true>{this}; 3014 1.1 mrg } 3015 1.1 mrg }; 3016 1.1 mrg 3017 1.1 mrg template<typename _Range> 3018 1.1 mrg explicit join_view(_Range&&) -> join_view<views::all_t<_Range>>; 3019 1.1 mrg 3020 1.1 mrg namespace views 3021 1.1 mrg { 3022 1.1.1.3 mrg namespace __detail 3023 1.1.1.3 mrg { 3024 1.1.1.3 mrg template<typename _Range> 3025 1.1.1.3 mrg concept __can_join_view 3026 1.1.1.3 mrg = requires { join_view<all_t<_Range>>{std::declval<_Range>()}; }; 3027 1.1.1.3 mrg } // namespace __detail 3028 1.1.1.3 mrg 3029 1.1.1.3 mrg struct _Join : __adaptor::_RangeAdaptorClosure 3030 1.1.1.3 mrg { 3031 1.1.1.3 mrg template<viewable_range _Range> 3032 1.1.1.3 mrg requires __detail::__can_join_view<_Range> 3033 1.1.1.3 mrg constexpr auto 3034 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r) const 3035 1.1.1.3 mrg { 3036 1.1.1.3 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 3037 1.1.1.3 mrg // 3474. Nesting join_views is broken because of CTAD 3038 1.1.1.3 mrg return join_view<all_t<_Range>>{std::forward<_Range>(__r)}; 3039 1.1.1.3 mrg } 3040 1.1.1.3 mrg 3041 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 3042 1.1.1.3 mrg }; 3043 1.1.1.3 mrg 3044 1.1.1.3 mrg inline constexpr _Join join; 3045 1.1 mrg } // namespace views 3046 1.1 mrg 3047 1.1 mrg namespace __detail 3048 1.1 mrg { 3049 1.1 mrg template<auto> 3050 1.1 mrg struct __require_constant; 3051 1.1 mrg 3052 1.1 mrg template<typename _Range> 3053 1.1 mrg concept __tiny_range = sized_range<_Range> 3054 1.1 mrg && requires 3055 1.1 mrg { typename __require_constant<remove_reference_t<_Range>::size()>; } 3056 1.1 mrg && (remove_reference_t<_Range>::size() <= 1); 3057 1.1 mrg 3058 1.1 mrg template<typename _Base> 3059 1.1.1.3 mrg struct __lazy_split_view_outer_iter_cat 3060 1.1 mrg { }; 3061 1.1 mrg 3062 1.1 mrg template<forward_range _Base> 3063 1.1.1.3 mrg struct __lazy_split_view_outer_iter_cat<_Base> 3064 1.1 mrg { using iterator_category = input_iterator_tag; }; 3065 1.1 mrg 3066 1.1 mrg template<typename _Base> 3067 1.1.1.3 mrg struct __lazy_split_view_inner_iter_cat 3068 1.1 mrg { }; 3069 1.1 mrg 3070 1.1 mrg template<forward_range _Base> 3071 1.1.1.3 mrg struct __lazy_split_view_inner_iter_cat<_Base> 3072 1.1 mrg { 3073 1.1 mrg private: 3074 1.1 mrg static constexpr auto 3075 1.1 mrg _S_iter_cat() 3076 1.1 mrg { 3077 1.1 mrg using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category; 3078 1.1 mrg if constexpr (derived_from<_Cat, forward_iterator_tag>) 3079 1.1 mrg return forward_iterator_tag{}; 3080 1.1 mrg else 3081 1.1 mrg return _Cat{}; 3082 1.1 mrg } 3083 1.1 mrg public: 3084 1.1 mrg using iterator_category = decltype(_S_iter_cat()); 3085 1.1 mrg }; 3086 1.1 mrg } 3087 1.1 mrg 3088 1.1 mrg template<input_range _Vp, forward_range _Pattern> 3089 1.1 mrg requires view<_Vp> && view<_Pattern> 3090 1.1 mrg && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>, 3091 1.1 mrg ranges::equal_to> 3092 1.1 mrg && (forward_range<_Vp> || __detail::__tiny_range<_Pattern>) 3093 1.1.1.3 mrg class lazy_split_view : public view_interface<lazy_split_view<_Vp, _Pattern>> 3094 1.1 mrg { 3095 1.1 mrg private: 3096 1.1 mrg template<bool _Const> 3097 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 3098 1.1 mrg 3099 1.1 mrg template<bool _Const> 3100 1.1 mrg struct _InnerIter; 3101 1.1 mrg 3102 1.1 mrg template<bool _Const> 3103 1.1 mrg struct _OuterIter 3104 1.1.1.3 mrg : __detail::__lazy_split_view_outer_iter_cat<_Base<_Const>> 3105 1.1 mrg { 3106 1.1 mrg private: 3107 1.1.1.3 mrg using _Parent = __detail::__maybe_const_t<_Const, lazy_split_view>; 3108 1.1.1.3 mrg using _Base = lazy_split_view::_Base<_Const>; 3109 1.1 mrg 3110 1.1 mrg constexpr bool 3111 1.1 mrg __at_end() const 3112 1.1.1.3 mrg { return __current() == ranges::end(_M_parent->_M_base) && !_M_trailing_empty; } 3113 1.1 mrg 3114 1.1.1.3 mrg // [range.lazy.split.outer] p1 3115 1.1 mrg // Many of the following specifications refer to the notional member 3116 1.1 mrg // current of outer-iterator. current is equivalent to current_ if 3117 1.1 mrg // V models forward_range, and parent_->current_ otherwise. 3118 1.1 mrg constexpr auto& 3119 1.1 mrg __current() noexcept 3120 1.1 mrg { 3121 1.1 mrg if constexpr (forward_range<_Vp>) 3122 1.1 mrg return _M_current; 3123 1.1 mrg else 3124 1.1.1.3 mrg return *_M_parent->_M_current; 3125 1.1 mrg } 3126 1.1 mrg 3127 1.1 mrg constexpr auto& 3128 1.1 mrg __current() const noexcept 3129 1.1 mrg { 3130 1.1 mrg if constexpr (forward_range<_Vp>) 3131 1.1 mrg return _M_current; 3132 1.1 mrg else 3133 1.1.1.3 mrg return *_M_parent->_M_current; 3134 1.1 mrg } 3135 1.1 mrg 3136 1.1 mrg _Parent* _M_parent = nullptr; 3137 1.1 mrg 3138 1.1 mrg // XXX: _M_current is present only if "V models forward_range" 3139 1.1 mrg [[no_unique_address]] 3140 1.1 mrg __detail::__maybe_present_t<forward_range<_Vp>, 3141 1.1 mrg iterator_t<_Base>> _M_current; 3142 1.1.1.3 mrg bool _M_trailing_empty = false; 3143 1.1 mrg 3144 1.1 mrg public: 3145 1.1.1.3 mrg using iterator_concept = __conditional_t<forward_range<_Base>, 3146 1.1.1.3 mrg forward_iterator_tag, 3147 1.1.1.3 mrg input_iterator_tag>; 3148 1.1.1.3 mrg // iterator_category defined in __lazy_split_view_outer_iter_cat 3149 1.1 mrg using difference_type = range_difference_t<_Base>; 3150 1.1 mrg 3151 1.1 mrg struct value_type : view_interface<value_type> 3152 1.1 mrg { 3153 1.1 mrg private: 3154 1.1 mrg _OuterIter _M_i = _OuterIter(); 3155 1.1 mrg 3156 1.1 mrg public: 3157 1.1 mrg value_type() = default; 3158 1.1 mrg 3159 1.1 mrg constexpr explicit 3160 1.1 mrg value_type(_OuterIter __i) 3161 1.1 mrg : _M_i(std::move(__i)) 3162 1.1 mrg { } 3163 1.1 mrg 3164 1.1 mrg constexpr _InnerIter<_Const> 3165 1.1 mrg begin() const 3166 1.1 mrg { return _InnerIter<_Const>{_M_i}; } 3167 1.1 mrg 3168 1.1 mrg constexpr default_sentinel_t 3169 1.1.1.3 mrg end() const noexcept 3170 1.1 mrg { return default_sentinel; } 3171 1.1 mrg }; 3172 1.1 mrg 3173 1.1 mrg _OuterIter() = default; 3174 1.1 mrg 3175 1.1 mrg constexpr explicit 3176 1.1 mrg _OuterIter(_Parent* __parent) requires (!forward_range<_Base>) 3177 1.1 mrg : _M_parent(__parent) 3178 1.1 mrg { } 3179 1.1 mrg 3180 1.1 mrg constexpr 3181 1.1 mrg _OuterIter(_Parent* __parent, iterator_t<_Base> __current) 3182 1.1 mrg requires forward_range<_Base> 3183 1.1 mrg : _M_parent(__parent), 3184 1.1 mrg _M_current(std::move(__current)) 3185 1.1 mrg { } 3186 1.1 mrg 3187 1.1 mrg constexpr 3188 1.1 mrg _OuterIter(_OuterIter<!_Const> __i) 3189 1.1 mrg requires _Const 3190 1.1 mrg && convertible_to<iterator_t<_Vp>, iterator_t<_Base>> 3191 1.1.1.3 mrg : _M_parent(__i._M_parent), _M_current(std::move(__i._M_current)), 3192 1.1.1.3 mrg _M_trailing_empty(__i._M_trailing_empty) 3193 1.1 mrg { } 3194 1.1 mrg 3195 1.1 mrg constexpr value_type 3196 1.1 mrg operator*() const 3197 1.1 mrg { return value_type{*this}; } 3198 1.1 mrg 3199 1.1 mrg constexpr _OuterIter& 3200 1.1 mrg operator++() 3201 1.1 mrg { 3202 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 3203 1.1.1.3 mrg // 3505. lazy_split_view::outer-iterator::operator++ misspecified 3204 1.1 mrg const auto __end = ranges::end(_M_parent->_M_base); 3205 1.1 mrg if (__current() == __end) 3206 1.1.1.3 mrg { 3207 1.1.1.3 mrg _M_trailing_empty = false; 3208 1.1.1.3 mrg return *this; 3209 1.1.1.3 mrg } 3210 1.1 mrg const auto [__pbegin, __pend] = subrange{_M_parent->_M_pattern}; 3211 1.1 mrg if (__pbegin == __pend) 3212 1.1 mrg ++__current(); 3213 1.1 mrg else if constexpr (__detail::__tiny_range<_Pattern>) 3214 1.1 mrg { 3215 1.1.1.3 mrg __current() = ranges::find(std::move(__current()), __end, 3216 1.1.1.3 mrg *__pbegin); 3217 1.1 mrg if (__current() != __end) 3218 1.1.1.3 mrg { 3219 1.1.1.3 mrg ++__current(); 3220 1.1.1.3 mrg if (__current() == __end) 3221 1.1.1.3 mrg _M_trailing_empty = true; 3222 1.1.1.3 mrg } 3223 1.1 mrg } 3224 1.1 mrg else 3225 1.1 mrg do 3226 1.1 mrg { 3227 1.1 mrg auto [__b, __p] 3228 1.1.1.3 mrg = ranges::mismatch(__current(), __end, __pbegin, __pend); 3229 1.1 mrg if (__p == __pend) 3230 1.1 mrg { 3231 1.1 mrg __current() = __b; 3232 1.1.1.3 mrg if (__current() == __end) 3233 1.1.1.3 mrg _M_trailing_empty = true; 3234 1.1 mrg break; 3235 1.1 mrg } 3236 1.1 mrg } while (++__current() != __end); 3237 1.1 mrg return *this; 3238 1.1 mrg } 3239 1.1 mrg 3240 1.1 mrg constexpr decltype(auto) 3241 1.1 mrg operator++(int) 3242 1.1 mrg { 3243 1.1 mrg if constexpr (forward_range<_Base>) 3244 1.1 mrg { 3245 1.1 mrg auto __tmp = *this; 3246 1.1 mrg ++*this; 3247 1.1 mrg return __tmp; 3248 1.1 mrg } 3249 1.1 mrg else 3250 1.1 mrg ++*this; 3251 1.1 mrg } 3252 1.1 mrg 3253 1.1 mrg friend constexpr bool 3254 1.1 mrg operator==(const _OuterIter& __x, const _OuterIter& __y) 3255 1.1 mrg requires forward_range<_Base> 3256 1.1.1.3 mrg { 3257 1.1.1.3 mrg return __x._M_current == __y._M_current 3258 1.1.1.3 mrg && __x._M_trailing_empty == __y._M_trailing_empty; 3259 1.1.1.3 mrg } 3260 1.1 mrg 3261 1.1 mrg friend constexpr bool 3262 1.1 mrg operator==(const _OuterIter& __x, default_sentinel_t) 3263 1.1 mrg { return __x.__at_end(); }; 3264 1.1 mrg 3265 1.1 mrg friend _OuterIter<!_Const>; 3266 1.1 mrg friend _InnerIter<_Const>; 3267 1.1 mrg }; 3268 1.1 mrg 3269 1.1 mrg template<bool _Const> 3270 1.1 mrg struct _InnerIter 3271 1.1.1.3 mrg : __detail::__lazy_split_view_inner_iter_cat<_Base<_Const>> 3272 1.1 mrg { 3273 1.1 mrg private: 3274 1.1.1.3 mrg using _Base = lazy_split_view::_Base<_Const>; 3275 1.1 mrg 3276 1.1 mrg constexpr bool 3277 1.1 mrg __at_end() const 3278 1.1 mrg { 3279 1.1 mrg auto [__pcur, __pend] = subrange{_M_i._M_parent->_M_pattern}; 3280 1.1 mrg auto __end = ranges::end(_M_i._M_parent->_M_base); 3281 1.1 mrg if constexpr (__detail::__tiny_range<_Pattern>) 3282 1.1 mrg { 3283 1.1 mrg const auto& __cur = _M_i_current(); 3284 1.1 mrg if (__cur == __end) 3285 1.1 mrg return true; 3286 1.1 mrg if (__pcur == __pend) 3287 1.1 mrg return _M_incremented; 3288 1.1 mrg return *__cur == *__pcur; 3289 1.1 mrg } 3290 1.1 mrg else 3291 1.1 mrg { 3292 1.1 mrg auto __cur = _M_i_current(); 3293 1.1 mrg if (__cur == __end) 3294 1.1 mrg return true; 3295 1.1 mrg if (__pcur == __pend) 3296 1.1 mrg return _M_incremented; 3297 1.1 mrg do 3298 1.1 mrg { 3299 1.1 mrg if (*__cur != *__pcur) 3300 1.1 mrg return false; 3301 1.1 mrg if (++__pcur == __pend) 3302 1.1 mrg return true; 3303 1.1 mrg } while (++__cur != __end); 3304 1.1 mrg return false; 3305 1.1 mrg } 3306 1.1 mrg } 3307 1.1 mrg 3308 1.1 mrg constexpr auto& 3309 1.1 mrg _M_i_current() noexcept 3310 1.1 mrg { return _M_i.__current(); } 3311 1.1 mrg 3312 1.1 mrg constexpr auto& 3313 1.1 mrg _M_i_current() const noexcept 3314 1.1 mrg { return _M_i.__current(); } 3315 1.1 mrg 3316 1.1 mrg _OuterIter<_Const> _M_i = _OuterIter<_Const>(); 3317 1.1 mrg bool _M_incremented = false; 3318 1.1 mrg 3319 1.1 mrg public: 3320 1.1 mrg using iterator_concept 3321 1.1 mrg = typename _OuterIter<_Const>::iterator_concept; 3322 1.1.1.3 mrg // iterator_category defined in __lazy_split_view_inner_iter_cat 3323 1.1 mrg using value_type = range_value_t<_Base>; 3324 1.1 mrg using difference_type = range_difference_t<_Base>; 3325 1.1 mrg 3326 1.1 mrg _InnerIter() = default; 3327 1.1 mrg 3328 1.1 mrg constexpr explicit 3329 1.1 mrg _InnerIter(_OuterIter<_Const> __i) 3330 1.1 mrg : _M_i(std::move(__i)) 3331 1.1 mrg { } 3332 1.1 mrg 3333 1.1 mrg constexpr const iterator_t<_Base>& 3334 1.1 mrg base() const& noexcept 3335 1.1 mrg { return _M_i_current(); } 3336 1.1 mrg 3337 1.1 mrg constexpr iterator_t<_Base> 3338 1.1.1.3 mrg base() && requires forward_range<_Vp> 3339 1.1 mrg { return std::move(_M_i_current()); } 3340 1.1 mrg 3341 1.1 mrg constexpr decltype(auto) 3342 1.1 mrg operator*() const 3343 1.1 mrg { return *_M_i_current(); } 3344 1.1 mrg 3345 1.1 mrg constexpr _InnerIter& 3346 1.1 mrg operator++() 3347 1.1 mrg { 3348 1.1 mrg _M_incremented = true; 3349 1.1 mrg if constexpr (!forward_range<_Base>) 3350 1.1 mrg if constexpr (_Pattern::size() == 0) 3351 1.1 mrg return *this; 3352 1.1 mrg ++_M_i_current(); 3353 1.1 mrg return *this; 3354 1.1 mrg } 3355 1.1 mrg 3356 1.1 mrg constexpr decltype(auto) 3357 1.1 mrg operator++(int) 3358 1.1 mrg { 3359 1.1 mrg if constexpr (forward_range<_Base>) 3360 1.1 mrg { 3361 1.1 mrg auto __tmp = *this; 3362 1.1 mrg ++*this; 3363 1.1 mrg return __tmp; 3364 1.1 mrg } 3365 1.1 mrg else 3366 1.1 mrg ++*this; 3367 1.1 mrg } 3368 1.1 mrg 3369 1.1 mrg friend constexpr bool 3370 1.1 mrg operator==(const _InnerIter& __x, const _InnerIter& __y) 3371 1.1 mrg requires forward_range<_Base> 3372 1.1 mrg { return __x._M_i == __y._M_i; } 3373 1.1 mrg 3374 1.1 mrg friend constexpr bool 3375 1.1 mrg operator==(const _InnerIter& __x, default_sentinel_t) 3376 1.1 mrg { return __x.__at_end(); } 3377 1.1 mrg 3378 1.1 mrg friend constexpr decltype(auto) 3379 1.1 mrg iter_move(const _InnerIter& __i) 3380 1.1 mrg noexcept(noexcept(ranges::iter_move(__i._M_i_current()))) 3381 1.1 mrg { return ranges::iter_move(__i._M_i_current()); } 3382 1.1 mrg 3383 1.1 mrg friend constexpr void 3384 1.1 mrg iter_swap(const _InnerIter& __x, const _InnerIter& __y) 3385 1.1 mrg noexcept(noexcept(ranges::iter_swap(__x._M_i_current(), 3386 1.1 mrg __y._M_i_current()))) 3387 1.1 mrg requires indirectly_swappable<iterator_t<_Base>> 3388 1.1 mrg { ranges::iter_swap(__x._M_i_current(), __y._M_i_current()); } 3389 1.1 mrg }; 3390 1.1 mrg 3391 1.1 mrg _Vp _M_base = _Vp(); 3392 1.1 mrg _Pattern _M_pattern = _Pattern(); 3393 1.1 mrg // XXX: _M_current is "present only if !forward_range<V>" 3394 1.1 mrg [[no_unique_address]] 3395 1.1.1.3 mrg __detail::__maybe_present_t<!forward_range<_Vp>, 3396 1.1.1.3 mrg __detail::__non_propagating_cache<iterator_t<_Vp>>> _M_current; 3397 1.1 mrg 3398 1.1 mrg 3399 1.1 mrg public: 3400 1.1.1.3 mrg lazy_split_view() requires (default_initializable<_Vp> 3401 1.1.1.3 mrg && default_initializable<_Pattern>) 3402 1.1 mrg = default; 3403 1.1 mrg 3404 1.1 mrg constexpr 3405 1.1.1.3 mrg lazy_split_view(_Vp __base, _Pattern __pattern) 3406 1.1 mrg : _M_base(std::move(__base)), _M_pattern(std::move(__pattern)) 3407 1.1 mrg { } 3408 1.1 mrg 3409 1.1 mrg template<input_range _Range> 3410 1.1 mrg requires constructible_from<_Vp, views::all_t<_Range>> 3411 1.1 mrg && constructible_from<_Pattern, single_view<range_value_t<_Range>>> 3412 1.1 mrg constexpr 3413 1.1.1.3 mrg lazy_split_view(_Range&& __r, range_value_t<_Range> __e) 3414 1.1 mrg : _M_base(views::all(std::forward<_Range>(__r))), 3415 1.1.1.3 mrg _M_pattern(views::single(std::move(__e))) 3416 1.1 mrg { } 3417 1.1 mrg 3418 1.1 mrg constexpr _Vp 3419 1.1 mrg base() const& requires copy_constructible<_Vp> 3420 1.1 mrg { return _M_base; } 3421 1.1 mrg 3422 1.1 mrg constexpr _Vp 3423 1.1 mrg base() && 3424 1.1 mrg { return std::move(_M_base); } 3425 1.1 mrg 3426 1.1 mrg constexpr auto 3427 1.1 mrg begin() 3428 1.1 mrg { 3429 1.1 mrg if constexpr (forward_range<_Vp>) 3430 1.1.1.3 mrg { 3431 1.1.1.3 mrg constexpr bool __simple 3432 1.1.1.3 mrg = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>; 3433 1.1.1.3 mrg return _OuterIter<__simple>{this, ranges::begin(_M_base)}; 3434 1.1.1.3 mrg } 3435 1.1 mrg else 3436 1.1 mrg { 3437 1.1 mrg _M_current = ranges::begin(_M_base); 3438 1.1 mrg return _OuterIter<false>{this}; 3439 1.1 mrg } 3440 1.1 mrg } 3441 1.1 mrg 3442 1.1 mrg constexpr auto 3443 1.1 mrg begin() const requires forward_range<_Vp> && forward_range<const _Vp> 3444 1.1 mrg { 3445 1.1 mrg return _OuterIter<true>{this, ranges::begin(_M_base)}; 3446 1.1 mrg } 3447 1.1 mrg 3448 1.1 mrg constexpr auto 3449 1.1 mrg end() requires forward_range<_Vp> && common_range<_Vp> 3450 1.1 mrg { 3451 1.1.1.3 mrg constexpr bool __simple 3452 1.1.1.3 mrg = __detail::__simple_view<_Vp> && __detail::__simple_view<_Pattern>; 3453 1.1.1.3 mrg return _OuterIter<__simple>{this, ranges::end(_M_base)}; 3454 1.1 mrg } 3455 1.1 mrg 3456 1.1 mrg constexpr auto 3457 1.1 mrg end() const 3458 1.1 mrg { 3459 1.1 mrg if constexpr (forward_range<_Vp> 3460 1.1 mrg && forward_range<const _Vp> 3461 1.1 mrg && common_range<const _Vp>) 3462 1.1 mrg return _OuterIter<true>{this, ranges::end(_M_base)}; 3463 1.1 mrg else 3464 1.1 mrg return default_sentinel; 3465 1.1 mrg } 3466 1.1 mrg }; 3467 1.1 mrg 3468 1.1.1.3 mrg template<typename _Range, typename _Pattern> 3469 1.1.1.3 mrg lazy_split_view(_Range&&, _Pattern&&) 3470 1.1.1.3 mrg -> lazy_split_view<views::all_t<_Range>, views::all_t<_Pattern>>; 3471 1.1 mrg 3472 1.1 mrg template<input_range _Range> 3473 1.1.1.3 mrg lazy_split_view(_Range&&, range_value_t<_Range>) 3474 1.1.1.3 mrg -> lazy_split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>; 3475 1.1.1.3 mrg 3476 1.1.1.3 mrg namespace views 3477 1.1.1.3 mrg { 3478 1.1.1.3 mrg namespace __detail 3479 1.1.1.3 mrg { 3480 1.1.1.3 mrg template<typename _Range, typename _Pattern> 3481 1.1.1.3 mrg concept __can_lazy_split_view 3482 1.1.1.3 mrg = requires { lazy_split_view(std::declval<_Range>(), std::declval<_Pattern>()); }; 3483 1.1.1.3 mrg } // namespace __detail 3484 1.1.1.3 mrg 3485 1.1.1.3 mrg struct _LazySplit : __adaptor::_RangeAdaptor<_LazySplit> 3486 1.1.1.3 mrg { 3487 1.1.1.3 mrg template<viewable_range _Range, typename _Pattern> 3488 1.1.1.3 mrg requires __detail::__can_lazy_split_view<_Range, _Pattern> 3489 1.1.1.3 mrg constexpr auto 3490 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f) const 3491 1.1.1.3 mrg { 3492 1.1.1.3 mrg return lazy_split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f)); 3493 1.1.1.3 mrg } 3494 1.1.1.3 mrg 3495 1.1.1.3 mrg using _RangeAdaptor<_LazySplit>::operator(); 3496 1.1.1.3 mrg static constexpr int _S_arity = 2; 3497 1.1.1.3 mrg // The pattern argument of views::lazy_split is not always simple -- it can be 3498 1.1.1.3 mrg // a non-view range, the value category of which affects whether the call 3499 1.1.1.3 mrg // is well-formed. But a scalar or a view pattern argument is surely 3500 1.1.1.3 mrg // simple. 3501 1.1.1.3 mrg template<typename _Pattern> 3502 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args 3503 1.1.1.3 mrg = is_scalar_v<_Pattern> || (view<_Pattern> 3504 1.1.1.3 mrg && copy_constructible<_Pattern>); 3505 1.1.1.3 mrg }; 3506 1.1.1.3 mrg 3507 1.1.1.3 mrg inline constexpr _LazySplit lazy_split; 3508 1.1.1.3 mrg } // namespace views 3509 1.1.1.3 mrg 3510 1.1.1.3 mrg template<forward_range _Vp, forward_range _Pattern> 3511 1.1.1.3 mrg requires view<_Vp> && view<_Pattern> 3512 1.1.1.3 mrg && indirectly_comparable<iterator_t<_Vp>, iterator_t<_Pattern>, 3513 1.1.1.3 mrg ranges::equal_to> 3514 1.1.1.3 mrg class split_view : public view_interface<split_view<_Vp, _Pattern>> 3515 1.1.1.3 mrg { 3516 1.1.1.3 mrg private: 3517 1.1.1.3 mrg _Vp _M_base = _Vp(); 3518 1.1.1.3 mrg _Pattern _M_pattern = _Pattern(); 3519 1.1.1.3 mrg __detail::__non_propagating_cache<subrange<iterator_t<_Vp>>> _M_cached_begin; 3520 1.1.1.3 mrg 3521 1.1.1.3 mrg struct _Iterator; 3522 1.1.1.3 mrg struct _Sentinel; 3523 1.1.1.3 mrg 3524 1.1.1.3 mrg public: 3525 1.1.1.3 mrg split_view() requires (default_initializable<_Vp> 3526 1.1.1.3 mrg && default_initializable<_Pattern>) 3527 1.1.1.3 mrg = default; 3528 1.1.1.3 mrg 3529 1.1.1.3 mrg constexpr 3530 1.1.1.3 mrg split_view(_Vp __base, _Pattern __pattern) 3531 1.1.1.3 mrg : _M_base(std::move(__base)), _M_pattern(std::move(__pattern)) 3532 1.1.1.3 mrg { } 3533 1.1.1.3 mrg 3534 1.1.1.3 mrg template<forward_range _Range> 3535 1.1.1.3 mrg requires constructible_from<_Vp, views::all_t<_Range>> 3536 1.1.1.3 mrg && constructible_from<_Pattern, single_view<range_value_t<_Range>>> 3537 1.1.1.3 mrg constexpr 3538 1.1.1.3 mrg split_view(_Range&& __r, range_value_t<_Range> __e) 3539 1.1.1.3 mrg : _M_base(views::all(std::forward<_Range>(__r))), 3540 1.1.1.3 mrg _M_pattern(views::single(std::move(__e))) 3541 1.1.1.3 mrg { } 3542 1.1.1.3 mrg 3543 1.1.1.3 mrg constexpr _Vp 3544 1.1.1.3 mrg base() const& requires copy_constructible<_Vp> 3545 1.1.1.3 mrg { return _M_base; } 3546 1.1.1.3 mrg 3547 1.1.1.3 mrg constexpr _Vp 3548 1.1.1.3 mrg base() && 3549 1.1.1.3 mrg { return std::move(_M_base); } 3550 1.1.1.3 mrg 3551 1.1.1.3 mrg constexpr _Iterator 3552 1.1.1.3 mrg begin() 3553 1.1.1.3 mrg { 3554 1.1.1.3 mrg if (!_M_cached_begin) 3555 1.1.1.3 mrg _M_cached_begin = _M_find_next(ranges::begin(_M_base)); 3556 1.1.1.3 mrg return {this, ranges::begin(_M_base), *_M_cached_begin}; 3557 1.1.1.3 mrg } 3558 1.1.1.3 mrg 3559 1.1.1.3 mrg constexpr auto 3560 1.1.1.3 mrg end() 3561 1.1.1.3 mrg { 3562 1.1.1.3 mrg if constexpr (common_range<_Vp>) 3563 1.1.1.3 mrg return _Iterator{this, ranges::end(_M_base), {}}; 3564 1.1.1.3 mrg else 3565 1.1.1.3 mrg return _Sentinel{this}; 3566 1.1.1.3 mrg } 3567 1.1.1.3 mrg 3568 1.1.1.3 mrg constexpr subrange<iterator_t<_Vp>> 3569 1.1.1.3 mrg _M_find_next(iterator_t<_Vp> __it) 3570 1.1.1.3 mrg { 3571 1.1.1.3 mrg auto [__b, __e] = ranges::search(subrange(__it, ranges::end(_M_base)), _M_pattern); 3572 1.1.1.3 mrg if (__b != ranges::end(_M_base) && ranges::empty(_M_pattern)) 3573 1.1.1.3 mrg { 3574 1.1.1.3 mrg ++__b; 3575 1.1.1.3 mrg ++__e; 3576 1.1.1.3 mrg } 3577 1.1.1.3 mrg return {__b, __e}; 3578 1.1.1.3 mrg } 3579 1.1.1.3 mrg 3580 1.1.1.3 mrg private: 3581 1.1.1.3 mrg struct _Iterator 3582 1.1.1.3 mrg { 3583 1.1.1.3 mrg private: 3584 1.1.1.3 mrg split_view* _M_parent = nullptr; 3585 1.1.1.3 mrg iterator_t<_Vp> _M_cur = iterator_t<_Vp>(); 3586 1.1.1.3 mrg subrange<iterator_t<_Vp>> _M_next = subrange<iterator_t<_Vp>>(); 3587 1.1.1.3 mrg bool _M_trailing_empty = false; 3588 1.1.1.3 mrg 3589 1.1.1.3 mrg friend struct _Sentinel; 3590 1.1.1.3 mrg 3591 1.1.1.3 mrg public: 3592 1.1.1.3 mrg using iterator_concept = forward_iterator_tag; 3593 1.1.1.3 mrg using iterator_category = input_iterator_tag; 3594 1.1.1.3 mrg using value_type = subrange<iterator_t<_Vp>>; 3595 1.1.1.3 mrg using difference_type = range_difference_t<_Vp>; 3596 1.1.1.3 mrg 3597 1.1.1.3 mrg _Iterator() = default; 3598 1.1.1.3 mrg 3599 1.1.1.3 mrg constexpr 3600 1.1.1.3 mrg _Iterator(split_view* __parent, 3601 1.1.1.3 mrg iterator_t<_Vp> __current, 3602 1.1.1.3 mrg subrange<iterator_t<_Vp>> __next) 3603 1.1.1.3 mrg : _M_parent(__parent), 3604 1.1.1.3 mrg _M_cur(std::move(__current)), 3605 1.1.1.3 mrg _M_next(std::move(__next)) 3606 1.1.1.3 mrg { } 3607 1.1.1.3 mrg 3608 1.1.1.3 mrg constexpr iterator_t<_Vp> 3609 1.1.1.3 mrg base() const 3610 1.1.1.3 mrg { return _M_cur; } 3611 1.1.1.3 mrg 3612 1.1.1.3 mrg constexpr value_type 3613 1.1.1.3 mrg operator*() const 3614 1.1.1.3 mrg { return {_M_cur, _M_next.begin()}; } 3615 1.1.1.3 mrg 3616 1.1.1.3 mrg constexpr _Iterator& 3617 1.1.1.3 mrg operator++() 3618 1.1.1.3 mrg { 3619 1.1.1.3 mrg _M_cur = _M_next.begin(); 3620 1.1.1.3 mrg if (_M_cur != ranges::end(_M_parent->_M_base)) 3621 1.1.1.3 mrg { 3622 1.1.1.3 mrg _M_cur = _M_next.end(); 3623 1.1.1.3 mrg if (_M_cur == ranges::end(_M_parent->_M_base)) 3624 1.1.1.3 mrg { 3625 1.1.1.3 mrg _M_trailing_empty = true; 3626 1.1.1.3 mrg _M_next = {_M_cur, _M_cur}; 3627 1.1.1.3 mrg } 3628 1.1.1.3 mrg else 3629 1.1.1.3 mrg _M_next = _M_parent->_M_find_next(_M_cur); 3630 1.1.1.3 mrg } 3631 1.1.1.3 mrg else 3632 1.1.1.3 mrg _M_trailing_empty = false; 3633 1.1.1.3 mrg return *this; 3634 1.1.1.3 mrg } 3635 1.1.1.3 mrg 3636 1.1.1.3 mrg constexpr _Iterator 3637 1.1.1.3 mrg operator++(int) 3638 1.1.1.3 mrg { 3639 1.1.1.3 mrg auto __tmp = *this; 3640 1.1.1.3 mrg ++*this; 3641 1.1.1.3 mrg return __tmp; 3642 1.1.1.3 mrg } 3643 1.1.1.3 mrg 3644 1.1.1.3 mrg friend constexpr bool 3645 1.1.1.3 mrg operator==(const _Iterator& __x, const _Iterator& __y) 3646 1.1.1.3 mrg { 3647 1.1.1.3 mrg return __x._M_cur == __y._M_cur 3648 1.1.1.3 mrg && __x._M_trailing_empty == __y._M_trailing_empty; 3649 1.1.1.3 mrg } 3650 1.1.1.3 mrg }; 3651 1.1.1.3 mrg 3652 1.1.1.3 mrg struct _Sentinel 3653 1.1.1.3 mrg { 3654 1.1.1.3 mrg private: 3655 1.1.1.3 mrg sentinel_t<_Vp> _M_end = sentinel_t<_Vp>(); 3656 1.1.1.3 mrg 3657 1.1.1.3 mrg constexpr bool 3658 1.1.1.3 mrg _M_equal(const _Iterator& __x) const 3659 1.1.1.3 mrg { return __x._M_cur == _M_end && !__x._M_trailing_empty; } 3660 1.1.1.3 mrg 3661 1.1.1.3 mrg public: 3662 1.1.1.3 mrg _Sentinel() = default; 3663 1.1.1.3 mrg 3664 1.1.1.3 mrg constexpr explicit 3665 1.1.1.3 mrg _Sentinel(split_view* __parent) 3666 1.1.1.3 mrg : _M_end(ranges::end(__parent->_M_base)) 3667 1.1.1.3 mrg { } 3668 1.1.1.3 mrg 3669 1.1.1.3 mrg friend constexpr bool 3670 1.1.1.3 mrg operator==(const _Iterator& __x, const _Sentinel& __y) 3671 1.1.1.3 mrg { return __y._M_equal(__x); } 3672 1.1.1.3 mrg }; 3673 1.1.1.3 mrg }; 3674 1.1.1.3 mrg 3675 1.1.1.3 mrg template<typename _Range, typename _Pattern> 3676 1.1.1.3 mrg split_view(_Range&&, _Pattern&&) 3677 1.1.1.3 mrg -> split_view<views::all_t<_Range>, views::all_t<_Pattern>>; 3678 1.1.1.3 mrg 3679 1.1.1.3 mrg template<forward_range _Range> 3680 1.1 mrg split_view(_Range&&, range_value_t<_Range>) 3681 1.1 mrg -> split_view<views::all_t<_Range>, single_view<range_value_t<_Range>>>; 3682 1.1 mrg 3683 1.1 mrg namespace views 3684 1.1 mrg { 3685 1.1.1.3 mrg namespace __detail 3686 1.1.1.3 mrg { 3687 1.1.1.3 mrg template<typename _Range, typename _Pattern> 3688 1.1.1.3 mrg concept __can_split_view 3689 1.1.1.3 mrg = requires { split_view(std::declval<_Range>(), std::declval<_Pattern>()); }; 3690 1.1.1.3 mrg } // namespace __detail 3691 1.1.1.3 mrg 3692 1.1.1.3 mrg struct _Split : __adaptor::_RangeAdaptor<_Split> 3693 1.1.1.3 mrg { 3694 1.1.1.3 mrg template<viewable_range _Range, typename _Pattern> 3695 1.1.1.3 mrg requires __detail::__can_split_view<_Range, _Pattern> 3696 1.1.1.3 mrg constexpr auto 3697 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r, _Pattern&& __f) const 3698 1.1.1.3 mrg { 3699 1.1.1.3 mrg return split_view(std::forward<_Range>(__r), std::forward<_Pattern>(__f)); 3700 1.1.1.3 mrg } 3701 1.1.1.3 mrg 3702 1.1.1.3 mrg using _RangeAdaptor<_Split>::operator(); 3703 1.1.1.3 mrg static constexpr int _S_arity = 2; 3704 1.1.1.3 mrg template<typename _Pattern> 3705 1.1.1.3 mrg static constexpr bool _S_has_simple_extra_args 3706 1.1.1.3 mrg = _LazySplit::_S_has_simple_extra_args<_Pattern>; 3707 1.1.1.3 mrg }; 3708 1.1.1.3 mrg 3709 1.1.1.3 mrg inline constexpr _Split split; 3710 1.1 mrg } // namespace views 3711 1.1 mrg 3712 1.1 mrg namespace views 3713 1.1 mrg { 3714 1.1 mrg struct _Counted 3715 1.1 mrg { 3716 1.1 mrg template<input_or_output_iterator _Iter> 3717 1.1 mrg constexpr auto 3718 1.1.1.3 mrg operator() [[nodiscard]] (_Iter __i, iter_difference_t<_Iter> __n) const 3719 1.1 mrg { 3720 1.1.1.3 mrg if constexpr (contiguous_iterator<_Iter>) 3721 1.1.1.3 mrg return span(std::__to_address(__i), __n); 3722 1.1.1.3 mrg else if constexpr (random_access_iterator<_Iter>) 3723 1.1.1.3 mrg return subrange(__i, __i + __n); 3724 1.1 mrg else 3725 1.1.1.3 mrg return subrange(counted_iterator(std::move(__i), __n), 3726 1.1.1.3 mrg default_sentinel); 3727 1.1 mrg } 3728 1.1 mrg }; 3729 1.1 mrg 3730 1.1 mrg inline constexpr _Counted counted{}; 3731 1.1 mrg } // namespace views 3732 1.1 mrg 3733 1.1 mrg template<view _Vp> 3734 1.1 mrg requires (!common_range<_Vp>) && copyable<iterator_t<_Vp>> 3735 1.1 mrg class common_view : public view_interface<common_view<_Vp>> 3736 1.1 mrg { 3737 1.1 mrg private: 3738 1.1 mrg _Vp _M_base = _Vp(); 3739 1.1 mrg 3740 1.1 mrg public: 3741 1.1 mrg common_view() requires default_initializable<_Vp> = default; 3742 1.1 mrg 3743 1.1 mrg constexpr explicit 3744 1.1 mrg common_view(_Vp __r) 3745 1.1 mrg : _M_base(std::move(__r)) 3746 1.1 mrg { } 3747 1.1 mrg 3748 1.1 mrg /* XXX: LWG 3280 didn't remove this constructor, but I think it should? 3749 1.1 mrg template<viewable_range _Range> 3750 1.1 mrg requires (!common_range<_Range>) 3751 1.1 mrg && constructible_from<_Vp, views::all_t<_Range>> 3752 1.1 mrg constexpr explicit 3753 1.1 mrg common_view(_Range&& __r) 3754 1.1 mrg : _M_base(views::all(std::forward<_Range>(__r))) 3755 1.1 mrg { } 3756 1.1 mrg */ 3757 1.1 mrg 3758 1.1 mrg constexpr _Vp 3759 1.1 mrg base() const& requires copy_constructible<_Vp> 3760 1.1 mrg { return _M_base; } 3761 1.1 mrg 3762 1.1 mrg constexpr _Vp 3763 1.1 mrg base() && 3764 1.1 mrg { return std::move(_M_base); } 3765 1.1 mrg 3766 1.1 mrg constexpr auto 3767 1.1 mrg begin() 3768 1.1 mrg { 3769 1.1 mrg if constexpr (random_access_range<_Vp> && sized_range<_Vp>) 3770 1.1 mrg return ranges::begin(_M_base); 3771 1.1 mrg else 3772 1.1 mrg return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>> 3773 1.1 mrg (ranges::begin(_M_base)); 3774 1.1 mrg } 3775 1.1 mrg 3776 1.1 mrg constexpr auto 3777 1.1 mrg begin() const requires range<const _Vp> 3778 1.1 mrg { 3779 1.1 mrg if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>) 3780 1.1 mrg return ranges::begin(_M_base); 3781 1.1 mrg else 3782 1.1 mrg return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>> 3783 1.1 mrg (ranges::begin(_M_base)); 3784 1.1 mrg } 3785 1.1 mrg 3786 1.1 mrg constexpr auto 3787 1.1 mrg end() 3788 1.1 mrg { 3789 1.1 mrg if constexpr (random_access_range<_Vp> && sized_range<_Vp>) 3790 1.1 mrg return ranges::begin(_M_base) + ranges::size(_M_base); 3791 1.1 mrg else 3792 1.1 mrg return common_iterator<iterator_t<_Vp>, sentinel_t<_Vp>> 3793 1.1 mrg (ranges::end(_M_base)); 3794 1.1 mrg } 3795 1.1 mrg 3796 1.1 mrg constexpr auto 3797 1.1 mrg end() const requires range<const _Vp> 3798 1.1 mrg { 3799 1.1 mrg if constexpr (random_access_range<const _Vp> && sized_range<const _Vp>) 3800 1.1 mrg return ranges::begin(_M_base) + ranges::size(_M_base); 3801 1.1 mrg else 3802 1.1 mrg return common_iterator<iterator_t<const _Vp>, sentinel_t<const _Vp>> 3803 1.1 mrg (ranges::end(_M_base)); 3804 1.1 mrg } 3805 1.1 mrg 3806 1.1 mrg constexpr auto 3807 1.1 mrg size() requires sized_range<_Vp> 3808 1.1 mrg { return ranges::size(_M_base); } 3809 1.1 mrg 3810 1.1 mrg constexpr auto 3811 1.1 mrg size() const requires sized_range<const _Vp> 3812 1.1 mrg { return ranges::size(_M_base); } 3813 1.1 mrg }; 3814 1.1 mrg 3815 1.1 mrg template<typename _Range> 3816 1.1 mrg common_view(_Range&&) -> common_view<views::all_t<_Range>>; 3817 1.1 mrg 3818 1.1 mrg template<typename _Tp> 3819 1.1 mrg inline constexpr bool enable_borrowed_range<common_view<_Tp>> 3820 1.1 mrg = enable_borrowed_range<_Tp>; 3821 1.1 mrg 3822 1.1 mrg namespace views 3823 1.1 mrg { 3824 1.1.1.3 mrg namespace __detail 3825 1.1.1.3 mrg { 3826 1.1.1.3 mrg template<typename _Range> 3827 1.1.1.3 mrg concept __already_common = common_range<_Range> 3828 1.1.1.3 mrg && requires { views::all(std::declval<_Range>()); }; 3829 1.1.1.3 mrg 3830 1.1.1.3 mrg template<typename _Range> 3831 1.1.1.3 mrg concept __can_common_view 3832 1.1.1.3 mrg = requires { common_view{std::declval<_Range>()}; }; 3833 1.1.1.3 mrg } // namespace __detail 3834 1.1.1.3 mrg 3835 1.1.1.3 mrg struct _Common : __adaptor::_RangeAdaptorClosure 3836 1.1.1.3 mrg { 3837 1.1.1.3 mrg template<viewable_range _Range> 3838 1.1.1.3 mrg requires __detail::__already_common<_Range> 3839 1.1.1.3 mrg || __detail::__can_common_view<_Range> 3840 1.1.1.3 mrg constexpr auto 3841 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r) const 3842 1.1.1.3 mrg { 3843 1.1.1.3 mrg if constexpr (__detail::__already_common<_Range>) 3844 1.1.1.3 mrg return views::all(std::forward<_Range>(__r)); 3845 1.1.1.3 mrg else 3846 1.1.1.3 mrg return common_view{std::forward<_Range>(__r)}; 3847 1.1.1.3 mrg } 3848 1.1.1.3 mrg 3849 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 3850 1.1.1.3 mrg }; 3851 1.1 mrg 3852 1.1.1.3 mrg inline constexpr _Common common; 3853 1.1 mrg } // namespace views 3854 1.1 mrg 3855 1.1 mrg template<view _Vp> 3856 1.1 mrg requires bidirectional_range<_Vp> 3857 1.1 mrg class reverse_view : public view_interface<reverse_view<_Vp>> 3858 1.1 mrg { 3859 1.1 mrg private: 3860 1.1 mrg static constexpr bool _S_needs_cached_begin 3861 1.1.1.3 mrg = !common_range<_Vp> && !(random_access_range<_Vp> 3862 1.1.1.3 mrg && sized_sentinel_for<sentinel_t<_Vp>, 3863 1.1.1.3 mrg iterator_t<_Vp>>); 3864 1.1.1.3 mrg 3865 1.1.1.3 mrg _Vp _M_base = _Vp(); 3866 1.1 mrg [[no_unique_address]] 3867 1.1 mrg __detail::__maybe_present_t<_S_needs_cached_begin, 3868 1.1 mrg __detail::_CachedPosition<_Vp>> 3869 1.1 mrg _M_cached_begin; 3870 1.1 mrg 3871 1.1 mrg public: 3872 1.1 mrg reverse_view() requires default_initializable<_Vp> = default; 3873 1.1 mrg 3874 1.1 mrg constexpr explicit 3875 1.1 mrg reverse_view(_Vp __r) 3876 1.1 mrg : _M_base(std::move(__r)) 3877 1.1 mrg { } 3878 1.1 mrg 3879 1.1 mrg constexpr _Vp 3880 1.1 mrg base() const& requires copy_constructible<_Vp> 3881 1.1 mrg { return _M_base; } 3882 1.1 mrg 3883 1.1 mrg constexpr _Vp 3884 1.1 mrg base() && 3885 1.1 mrg { return std::move(_M_base); } 3886 1.1 mrg 3887 1.1 mrg constexpr reverse_iterator<iterator_t<_Vp>> 3888 1.1 mrg begin() 3889 1.1 mrg { 3890 1.1 mrg if constexpr (_S_needs_cached_begin) 3891 1.1 mrg if (_M_cached_begin._M_has_value()) 3892 1.1 mrg return std::make_reverse_iterator(_M_cached_begin._M_get(_M_base)); 3893 1.1 mrg 3894 1.1 mrg auto __it = ranges::next(ranges::begin(_M_base), ranges::end(_M_base)); 3895 1.1 mrg if constexpr (_S_needs_cached_begin) 3896 1.1 mrg _M_cached_begin._M_set(_M_base, __it); 3897 1.1 mrg return std::make_reverse_iterator(std::move(__it)); 3898 1.1 mrg } 3899 1.1 mrg 3900 1.1 mrg constexpr auto 3901 1.1 mrg begin() requires common_range<_Vp> 3902 1.1 mrg { return std::make_reverse_iterator(ranges::end(_M_base)); } 3903 1.1 mrg 3904 1.1 mrg constexpr auto 3905 1.1 mrg begin() const requires common_range<const _Vp> 3906 1.1 mrg { return std::make_reverse_iterator(ranges::end(_M_base)); } 3907 1.1 mrg 3908 1.1 mrg constexpr reverse_iterator<iterator_t<_Vp>> 3909 1.1 mrg end() 3910 1.1 mrg { return std::make_reverse_iterator(ranges::begin(_M_base)); } 3911 1.1 mrg 3912 1.1 mrg constexpr auto 3913 1.1 mrg end() const requires common_range<const _Vp> 3914 1.1 mrg { return std::make_reverse_iterator(ranges::begin(_M_base)); } 3915 1.1 mrg 3916 1.1 mrg constexpr auto 3917 1.1 mrg size() requires sized_range<_Vp> 3918 1.1 mrg { return ranges::size(_M_base); } 3919 1.1 mrg 3920 1.1 mrg constexpr auto 3921 1.1 mrg size() const requires sized_range<const _Vp> 3922 1.1 mrg { return ranges::size(_M_base); } 3923 1.1 mrg }; 3924 1.1 mrg 3925 1.1 mrg template<typename _Range> 3926 1.1 mrg reverse_view(_Range&&) -> reverse_view<views::all_t<_Range>>; 3927 1.1 mrg 3928 1.1 mrg template<typename _Tp> 3929 1.1 mrg inline constexpr bool enable_borrowed_range<reverse_view<_Tp>> 3930 1.1 mrg = enable_borrowed_range<_Tp>; 3931 1.1 mrg 3932 1.1 mrg namespace views 3933 1.1 mrg { 3934 1.1 mrg namespace __detail 3935 1.1 mrg { 3936 1.1 mrg template<typename> 3937 1.1 mrg inline constexpr bool __is_reversible_subrange = false; 3938 1.1 mrg 3939 1.1 mrg template<typename _Iter, subrange_kind _Kind> 3940 1.1 mrg inline constexpr bool 3941 1.1 mrg __is_reversible_subrange<subrange<reverse_iterator<_Iter>, 3942 1.1 mrg reverse_iterator<_Iter>, 3943 1.1 mrg _Kind>> = true; 3944 1.1 mrg 3945 1.1 mrg template<typename> 3946 1.1 mrg inline constexpr bool __is_reverse_view = false; 3947 1.1 mrg 3948 1.1 mrg template<typename _Vp> 3949 1.1 mrg inline constexpr bool __is_reverse_view<reverse_view<_Vp>> = true; 3950 1.1 mrg 3951 1.1.1.3 mrg template<typename _Range> 3952 1.1.1.3 mrg concept __can_reverse_view 3953 1.1.1.3 mrg = requires { reverse_view{std::declval<_Range>()}; }; 3954 1.1.1.3 mrg } // namespace __detail 3955 1.1.1.3 mrg 3956 1.1.1.3 mrg struct _Reverse : __adaptor::_RangeAdaptorClosure 3957 1.1.1.3 mrg { 3958 1.1.1.3 mrg template<viewable_range _Range> 3959 1.1.1.3 mrg requires __detail::__is_reverse_view<remove_cvref_t<_Range>> 3960 1.1.1.3 mrg || __detail::__is_reversible_subrange<remove_cvref_t<_Range>> 3961 1.1.1.3 mrg || __detail::__can_reverse_view<_Range> 3962 1.1.1.3 mrg constexpr auto 3963 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r) const 3964 1.1.1.3 mrg { 3965 1.1.1.3 mrg using _Tp = remove_cvref_t<_Range>; 3966 1.1.1.3 mrg if constexpr (__detail::__is_reverse_view<_Tp>) 3967 1.1.1.3 mrg return std::forward<_Range>(__r).base(); 3968 1.1.1.3 mrg else if constexpr (__detail::__is_reversible_subrange<_Tp>) 3969 1.1.1.3 mrg { 3970 1.1.1.3 mrg using _Iter = decltype(ranges::begin(__r).base()); 3971 1.1.1.3 mrg if constexpr (sized_range<_Tp>) 3972 1.1.1.3 mrg return subrange<_Iter, _Iter, subrange_kind::sized> 3973 1.1.1.3 mrg {__r.end().base(), __r.begin().base(), __r.size()}; 3974 1.1.1.3 mrg else 3975 1.1.1.3 mrg return subrange<_Iter, _Iter, subrange_kind::unsized> 3976 1.1.1.3 mrg {__r.end().base(), __r.begin().base()}; 3977 1.1.1.3 mrg } 3978 1.1.1.3 mrg else 3979 1.1.1.3 mrg return reverse_view{std::forward<_Range>(__r)}; 3980 1.1.1.3 mrg } 3981 1.1.1.3 mrg 3982 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 3983 1.1.1.3 mrg }; 3984 1.1.1.3 mrg 3985 1.1.1.3 mrg inline constexpr _Reverse reverse; 3986 1.1 mrg } // namespace views 3987 1.1 mrg 3988 1.1 mrg namespace __detail 3989 1.1 mrg { 3990 1.1 mrg template<typename _Tp, size_t _Nm> 3991 1.1 mrg concept __has_tuple_element = requires(_Tp __t) 3992 1.1 mrg { 3993 1.1 mrg typename tuple_size<_Tp>::type; 3994 1.1 mrg requires _Nm < tuple_size_v<_Tp>; 3995 1.1 mrg typename tuple_element_t<_Nm, _Tp>; 3996 1.1 mrg { std::get<_Nm>(__t) } 3997 1.1 mrg -> convertible_to<const tuple_element_t<_Nm, _Tp>&>; 3998 1.1 mrg }; 3999 1.1 mrg 4000 1.1 mrg template<typename _Tp, size_t _Nm> 4001 1.1 mrg concept __returnable_element 4002 1.1 mrg = is_reference_v<_Tp> || move_constructible<tuple_element_t<_Nm, _Tp>>; 4003 1.1 mrg } 4004 1.1 mrg 4005 1.1 mrg template<input_range _Vp, size_t _Nm> 4006 1.1 mrg requires view<_Vp> 4007 1.1 mrg && __detail::__has_tuple_element<range_value_t<_Vp>, _Nm> 4008 1.1 mrg && __detail::__has_tuple_element<remove_reference_t<range_reference_t<_Vp>>, 4009 1.1 mrg _Nm> 4010 1.1 mrg && __detail::__returnable_element<range_reference_t<_Vp>, _Nm> 4011 1.1 mrg class elements_view : public view_interface<elements_view<_Vp, _Nm>> 4012 1.1 mrg { 4013 1.1 mrg public: 4014 1.1 mrg elements_view() requires default_initializable<_Vp> = default; 4015 1.1 mrg 4016 1.1 mrg constexpr explicit 4017 1.1 mrg elements_view(_Vp base) 4018 1.1 mrg : _M_base(std::move(base)) 4019 1.1 mrg { } 4020 1.1 mrg 4021 1.1 mrg constexpr _Vp 4022 1.1 mrg base() const& requires copy_constructible<_Vp> 4023 1.1 mrg { return _M_base; } 4024 1.1 mrg 4025 1.1 mrg constexpr _Vp 4026 1.1 mrg base() && 4027 1.1 mrg { return std::move(_M_base); } 4028 1.1 mrg 4029 1.1 mrg constexpr auto 4030 1.1 mrg begin() requires (!__detail::__simple_view<_Vp>) 4031 1.1 mrg { return _Iterator<false>(ranges::begin(_M_base)); } 4032 1.1 mrg 4033 1.1 mrg constexpr auto 4034 1.1 mrg begin() const requires range<const _Vp> 4035 1.1 mrg { return _Iterator<true>(ranges::begin(_M_base)); } 4036 1.1 mrg 4037 1.1 mrg constexpr auto 4038 1.1 mrg end() requires (!__detail::__simple_view<_Vp> && !common_range<_Vp>) 4039 1.1 mrg { return _Sentinel<false>{ranges::end(_M_base)}; } 4040 1.1 mrg 4041 1.1 mrg constexpr auto 4042 1.1 mrg end() requires (!__detail::__simple_view<_Vp> && common_range<_Vp>) 4043 1.1 mrg { return _Iterator<false>{ranges::end(_M_base)}; } 4044 1.1 mrg 4045 1.1 mrg constexpr auto 4046 1.1 mrg end() const requires range<const _Vp> 4047 1.1 mrg { return _Sentinel<true>{ranges::end(_M_base)}; } 4048 1.1 mrg 4049 1.1 mrg constexpr auto 4050 1.1 mrg end() const requires common_range<const _Vp> 4051 1.1 mrg { return _Iterator<true>{ranges::end(_M_base)}; } 4052 1.1 mrg 4053 1.1 mrg constexpr auto 4054 1.1 mrg size() requires sized_range<_Vp> 4055 1.1 mrg { return ranges::size(_M_base); } 4056 1.1 mrg 4057 1.1 mrg constexpr auto 4058 1.1 mrg size() const requires sized_range<const _Vp> 4059 1.1 mrg { return ranges::size(_M_base); } 4060 1.1 mrg 4061 1.1 mrg private: 4062 1.1 mrg template<bool _Const> 4063 1.1 mrg using _Base = __detail::__maybe_const_t<_Const, _Vp>; 4064 1.1 mrg 4065 1.1 mrg template<bool _Const> 4066 1.1 mrg struct __iter_cat 4067 1.1 mrg { }; 4068 1.1 mrg 4069 1.1 mrg template<bool _Const> 4070 1.1 mrg requires forward_range<_Base<_Const>> 4071 1.1 mrg struct __iter_cat<_Const> 4072 1.1 mrg { 4073 1.1 mrg private: 4074 1.1 mrg static auto _S_iter_cat() 4075 1.1 mrg { 4076 1.1 mrg using _Base = elements_view::_Base<_Const>; 4077 1.1 mrg using _Cat = typename iterator_traits<iterator_t<_Base>>::iterator_category; 4078 1.1 mrg using _Res = decltype((std::get<_Nm>(*std::declval<iterator_t<_Base>>()))); 4079 1.1 mrg if constexpr (!is_lvalue_reference_v<_Res>) 4080 1.1 mrg return input_iterator_tag{}; 4081 1.1 mrg else if constexpr (derived_from<_Cat, random_access_iterator_tag>) 4082 1.1 mrg return random_access_iterator_tag{}; 4083 1.1 mrg else 4084 1.1 mrg return _Cat{}; 4085 1.1 mrg } 4086 1.1 mrg public: 4087 1.1 mrg using iterator_category = decltype(_S_iter_cat()); 4088 1.1 mrg }; 4089 1.1 mrg 4090 1.1 mrg template<bool _Const> 4091 1.1 mrg struct _Sentinel; 4092 1.1 mrg 4093 1.1 mrg template<bool _Const> 4094 1.1 mrg struct _Iterator : __iter_cat<_Const> 4095 1.1 mrg { 4096 1.1 mrg private: 4097 1.1 mrg using _Base = elements_view::_Base<_Const>; 4098 1.1 mrg 4099 1.1 mrg iterator_t<_Base> _M_current = iterator_t<_Base>(); 4100 1.1 mrg 4101 1.1 mrg static constexpr decltype(auto) 4102 1.1 mrg _S_get_element(const iterator_t<_Base>& __i) 4103 1.1 mrg { 4104 1.1 mrg if constexpr (is_reference_v<range_reference_t<_Base>>) 4105 1.1 mrg return std::get<_Nm>(*__i); 4106 1.1 mrg else 4107 1.1 mrg { 4108 1.1 mrg using _Et = remove_cv_t<tuple_element_t<_Nm, range_reference_t<_Base>>>; 4109 1.1 mrg return static_cast<_Et>(std::get<_Nm>(*__i)); 4110 1.1 mrg } 4111 1.1 mrg } 4112 1.1 mrg 4113 1.1 mrg static auto 4114 1.1 mrg _S_iter_concept() 4115 1.1 mrg { 4116 1.1 mrg if constexpr (random_access_range<_Base>) 4117 1.1 mrg return random_access_iterator_tag{}; 4118 1.1 mrg else if constexpr (bidirectional_range<_Base>) 4119 1.1 mrg return bidirectional_iterator_tag{}; 4120 1.1 mrg else if constexpr (forward_range<_Base>) 4121 1.1 mrg return forward_iterator_tag{}; 4122 1.1 mrg else 4123 1.1 mrg return input_iterator_tag{}; 4124 1.1 mrg } 4125 1.1 mrg 4126 1.1 mrg friend _Iterator<!_Const>; 4127 1.1 mrg 4128 1.1 mrg public: 4129 1.1 mrg using iterator_concept = decltype(_S_iter_concept()); 4130 1.1 mrg // iterator_category defined in elements_view::__iter_cat 4131 1.1 mrg using value_type 4132 1.1 mrg = remove_cvref_t<tuple_element_t<_Nm, range_value_t<_Base>>>; 4133 1.1 mrg using difference_type = range_difference_t<_Base>; 4134 1.1 mrg 4135 1.1 mrg _Iterator() requires default_initializable<iterator_t<_Base>> = default; 4136 1.1 mrg 4137 1.1 mrg constexpr explicit 4138 1.1 mrg _Iterator(iterator_t<_Base> current) 4139 1.1 mrg : _M_current(std::move(current)) 4140 1.1 mrg { } 4141 1.1 mrg 4142 1.1 mrg constexpr 4143 1.1 mrg _Iterator(_Iterator<!_Const> i) 4144 1.1 mrg requires _Const && convertible_to<iterator_t<_Vp>, iterator_t<_Base>> 4145 1.1 mrg : _M_current(std::move(i._M_current)) 4146 1.1 mrg { } 4147 1.1 mrg 4148 1.1 mrg constexpr const iterator_t<_Base>& 4149 1.1 mrg base() const& noexcept 4150 1.1 mrg { return _M_current; } 4151 1.1 mrg 4152 1.1 mrg constexpr iterator_t<_Base> 4153 1.1 mrg base() && 4154 1.1 mrg { return std::move(_M_current); } 4155 1.1 mrg 4156 1.1 mrg constexpr decltype(auto) 4157 1.1 mrg operator*() const 4158 1.1 mrg { return _S_get_element(_M_current); } 4159 1.1 mrg 4160 1.1 mrg constexpr _Iterator& 4161 1.1 mrg operator++() 4162 1.1 mrg { 4163 1.1 mrg ++_M_current; 4164 1.1 mrg return *this; 4165 1.1 mrg } 4166 1.1 mrg 4167 1.1 mrg constexpr void 4168 1.1 mrg operator++(int) 4169 1.1 mrg { ++_M_current; } 4170 1.1 mrg 4171 1.1 mrg constexpr _Iterator 4172 1.1 mrg operator++(int) requires forward_range<_Base> 4173 1.1 mrg { 4174 1.1 mrg auto __tmp = *this; 4175 1.1 mrg ++_M_current; 4176 1.1 mrg return __tmp; 4177 1.1 mrg } 4178 1.1 mrg 4179 1.1 mrg constexpr _Iterator& 4180 1.1 mrg operator--() requires bidirectional_range<_Base> 4181 1.1 mrg { 4182 1.1 mrg --_M_current; 4183 1.1 mrg return *this; 4184 1.1 mrg } 4185 1.1 mrg 4186 1.1 mrg constexpr _Iterator 4187 1.1 mrg operator--(int) requires bidirectional_range<_Base> 4188 1.1 mrg { 4189 1.1 mrg auto __tmp = *this; 4190 1.1 mrg --_M_current; 4191 1.1 mrg return __tmp; 4192 1.1 mrg } 4193 1.1 mrg 4194 1.1 mrg constexpr _Iterator& 4195 1.1 mrg operator+=(difference_type __n) 4196 1.1 mrg requires random_access_range<_Base> 4197 1.1 mrg { 4198 1.1 mrg _M_current += __n; 4199 1.1 mrg return *this; 4200 1.1 mrg } 4201 1.1 mrg 4202 1.1 mrg constexpr _Iterator& 4203 1.1 mrg operator-=(difference_type __n) 4204 1.1 mrg requires random_access_range<_Base> 4205 1.1 mrg { 4206 1.1 mrg _M_current -= __n; 4207 1.1 mrg return *this; 4208 1.1 mrg } 4209 1.1 mrg 4210 1.1 mrg constexpr decltype(auto) 4211 1.1 mrg operator[](difference_type __n) const 4212 1.1 mrg requires random_access_range<_Base> 4213 1.1 mrg { return _S_get_element(_M_current + __n); } 4214 1.1 mrg 4215 1.1 mrg friend constexpr bool 4216 1.1 mrg operator==(const _Iterator& __x, const _Iterator& __y) 4217 1.1 mrg requires equality_comparable<iterator_t<_Base>> 4218 1.1 mrg { return __x._M_current == __y._M_current; } 4219 1.1 mrg 4220 1.1 mrg friend constexpr bool 4221 1.1 mrg operator<(const _Iterator& __x, const _Iterator& __y) 4222 1.1 mrg requires random_access_range<_Base> 4223 1.1 mrg { return __x._M_current < __y._M_current; } 4224 1.1 mrg 4225 1.1 mrg friend constexpr bool 4226 1.1 mrg operator>(const _Iterator& __x, const _Iterator& __y) 4227 1.1 mrg requires random_access_range<_Base> 4228 1.1 mrg { return __y._M_current < __x._M_current; } 4229 1.1 mrg 4230 1.1 mrg friend constexpr bool 4231 1.1 mrg operator<=(const _Iterator& __x, const _Iterator& __y) 4232 1.1 mrg requires random_access_range<_Base> 4233 1.1 mrg { return !(__y._M_current > __x._M_current); } 4234 1.1 mrg 4235 1.1 mrg friend constexpr bool 4236 1.1 mrg operator>=(const _Iterator& __x, const _Iterator& __y) 4237 1.1 mrg requires random_access_range<_Base> 4238 1.1 mrg { return !(__x._M_current > __y._M_current); } 4239 1.1 mrg 4240 1.1 mrg #ifdef __cpp_lib_three_way_comparison 4241 1.1 mrg friend constexpr auto 4242 1.1 mrg operator<=>(const _Iterator& __x, const _Iterator& __y) 4243 1.1 mrg requires random_access_range<_Base> 4244 1.1 mrg && three_way_comparable<iterator_t<_Base>> 4245 1.1 mrg { return __x._M_current <=> __y._M_current; } 4246 1.1 mrg #endif 4247 1.1 mrg 4248 1.1 mrg friend constexpr _Iterator 4249 1.1 mrg operator+(const _Iterator& __x, difference_type __y) 4250 1.1 mrg requires random_access_range<_Base> 4251 1.1 mrg { return _Iterator{__x} += __y; } 4252 1.1 mrg 4253 1.1 mrg friend constexpr _Iterator 4254 1.1 mrg operator+(difference_type __x, const _Iterator& __y) 4255 1.1 mrg requires random_access_range<_Base> 4256 1.1 mrg { return __y + __x; } 4257 1.1 mrg 4258 1.1 mrg friend constexpr _Iterator 4259 1.1 mrg operator-(const _Iterator& __x, difference_type __y) 4260 1.1 mrg requires random_access_range<_Base> 4261 1.1 mrg { return _Iterator{__x} -= __y; } 4262 1.1 mrg 4263 1.1 mrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 4264 1.1 mrg // 3483. transform_view::iterator's difference is overconstrained 4265 1.1 mrg friend constexpr difference_type 4266 1.1 mrg operator-(const _Iterator& __x, const _Iterator& __y) 4267 1.1 mrg requires sized_sentinel_for<iterator_t<_Base>, iterator_t<_Base>> 4268 1.1 mrg { return __x._M_current - __y._M_current; } 4269 1.1 mrg 4270 1.1 mrg template <bool> friend struct _Sentinel; 4271 1.1 mrg }; 4272 1.1 mrg 4273 1.1 mrg template<bool _Const> 4274 1.1 mrg struct _Sentinel 4275 1.1 mrg { 4276 1.1 mrg private: 4277 1.1 mrg template<bool _Const2> 4278 1.1 mrg constexpr bool 4279 1.1 mrg _M_equal(const _Iterator<_Const2>& __x) const 4280 1.1 mrg { return __x._M_current == _M_end; } 4281 1.1 mrg 4282 1.1 mrg template<bool _Const2> 4283 1.1 mrg constexpr auto 4284 1.1 mrg _M_distance_from(const _Iterator<_Const2>& __i) const 4285 1.1 mrg { return _M_end - __i._M_current; } 4286 1.1 mrg 4287 1.1 mrg using _Base = elements_view::_Base<_Const>; 4288 1.1 mrg sentinel_t<_Base> _M_end = sentinel_t<_Base>(); 4289 1.1 mrg 4290 1.1 mrg public: 4291 1.1 mrg _Sentinel() = default; 4292 1.1 mrg 4293 1.1 mrg constexpr explicit 4294 1.1 mrg _Sentinel(sentinel_t<_Base> __end) 4295 1.1 mrg : _M_end(std::move(__end)) 4296 1.1 mrg { } 4297 1.1 mrg 4298 1.1 mrg constexpr 4299 1.1 mrg _Sentinel(_Sentinel<!_Const> __other) 4300 1.1 mrg requires _Const 4301 1.1 mrg && convertible_to<sentinel_t<_Vp>, sentinel_t<_Base>> 4302 1.1 mrg : _M_end(std::move(__other._M_end)) 4303 1.1 mrg { } 4304 1.1 mrg 4305 1.1 mrg constexpr sentinel_t<_Base> 4306 1.1 mrg base() const 4307 1.1 mrg { return _M_end; } 4308 1.1 mrg 4309 1.1 mrg template<bool _Const2> 4310 1.1 mrg requires sentinel_for<sentinel_t<_Base>, 4311 1.1 mrg iterator_t<__detail::__maybe_const_t<_Const2, _Vp>>> 4312 1.1 mrg friend constexpr bool 4313 1.1 mrg operator==(const _Iterator<_Const2>& __x, const _Sentinel& __y) 4314 1.1 mrg { return __y._M_equal(__x); } 4315 1.1 mrg 4316 1.1 mrg template<bool _Const2, 4317 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>> 4318 1.1 mrg requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 4319 1.1 mrg friend constexpr range_difference_t<_Base2> 4320 1.1 mrg operator-(const _Iterator<_Const2>& __x, const _Sentinel& __y) 4321 1.1 mrg { return -__y._M_distance_from(__x); } 4322 1.1 mrg 4323 1.1 mrg template<bool _Const2, 4324 1.1 mrg typename _Base2 = __detail::__maybe_const_t<_Const2, _Vp>> 4325 1.1 mrg requires sized_sentinel_for<sentinel_t<_Base>, iterator_t<_Base2>> 4326 1.1 mrg friend constexpr range_difference_t<_Base2> 4327 1.1 mrg operator-(const _Sentinel& __x, const _Iterator<_Const2>& __y) 4328 1.1 mrg { return __x._M_distance_from(__y); } 4329 1.1 mrg 4330 1.1 mrg friend _Sentinel<!_Const>; 4331 1.1 mrg }; 4332 1.1 mrg 4333 1.1 mrg _Vp _M_base = _Vp(); 4334 1.1 mrg }; 4335 1.1 mrg 4336 1.1 mrg template<typename _Tp, size_t _Nm> 4337 1.1 mrg inline constexpr bool enable_borrowed_range<elements_view<_Tp, _Nm>> 4338 1.1 mrg = enable_borrowed_range<_Tp>; 4339 1.1 mrg 4340 1.1 mrg template<typename _Range> 4341 1.1 mrg using keys_view = elements_view<views::all_t<_Range>, 0>; 4342 1.1 mrg 4343 1.1 mrg template<typename _Range> 4344 1.1 mrg using values_view = elements_view<views::all_t<_Range>, 1>; 4345 1.1 mrg 4346 1.1 mrg namespace views 4347 1.1 mrg { 4348 1.1.1.3 mrg namespace __detail 4349 1.1.1.3 mrg { 4350 1.1.1.3 mrg template<size_t _Nm, typename _Range> 4351 1.1.1.3 mrg concept __can_elements_view 4352 1.1.1.3 mrg = requires { elements_view<all_t<_Range>, _Nm>{std::declval<_Range>()}; }; 4353 1.1.1.3 mrg } // namespace __detail 4354 1.1.1.3 mrg 4355 1.1 mrg template<size_t _Nm> 4356 1.1.1.3 mrg struct _Elements : __adaptor::_RangeAdaptorClosure 4357 1.1 mrg { 4358 1.1.1.3 mrg template<viewable_range _Range> 4359 1.1.1.3 mrg requires __detail::__can_elements_view<_Nm, _Range> 4360 1.1.1.3 mrg constexpr auto 4361 1.1.1.3 mrg operator() [[nodiscard]] (_Range&& __r) const 4362 1.1.1.3 mrg { 4363 1.1.1.3 mrg return elements_view<all_t<_Range>, _Nm>{std::forward<_Range>(__r)}; 4364 1.1.1.3 mrg } 4365 1.1.1.3 mrg 4366 1.1.1.3 mrg static constexpr bool _S_has_simple_call_op = true; 4367 1.1 mrg }; 4368 1.1 mrg 4369 1.1.1.3 mrg template<size_t _Nm> 4370 1.1.1.3 mrg inline constexpr _Elements<_Nm> elements; 4371 1.1.1.3 mrg inline constexpr auto keys = elements<0>; 4372 1.1.1.3 mrg inline constexpr auto values = elements<1>; 4373 1.1 mrg } // namespace views 4374 1.1 mrg 4375 1.1 mrg } // namespace ranges 4376 1.1 mrg 4377 1.1 mrg namespace views = ranges::views; 4378 1.1 mrg 4379 1.1 mrg _GLIBCXX_END_NAMESPACE_VERSION 4380 1.1 mrg } // namespace 4381 1.1 mrg #endif // library concepts 4382 1.1 mrg #endif // C++2a 4383 1.1 mrg #endif /* _GLIBCXX_RANGES */ 4384