1// -*- C++ -*- 2//===----------------------------------------------------------------------===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef _LIBCPP_ITERATOR 11#define _LIBCPP_ITERATOR 12 13/* 14 iterator synopsis 15 16#include <concepts> 17 18namespace std 19{ 20template<class> struct incrementable_traits; // since C++20 21template<class T> 22 using iter_difference_t = see below; // since C++20 23 24template<class> struct indirectly_readable_traits; // since C++20 25template<class T> 26 using iter_value_t = see below; // since C++20 27 28template<class Iterator> 29struct iterator_traits; 30 31template<class T> 32 requires is_object_v<T> // since C++20 33struct iterator_traits<T*>; 34 35template<dereferenceable T> 36 using iter_reference_t = decltype(*declval<T&>()); 37 38namespace ranges::inline unspecified { 39 inline constexpr unspecified iter_move = unspecified; // since C++20, nodiscard as an extension 40}} 41 42template<dereferenceable T> 43 requires ... 44using iter_rvalue_reference_t = decltype(ranges::iter_move(declval<T&>())); // since C++20 45 46// [iterator.concepts], iterator concepts 47// [iterator.concept.readable], concept indirectly_readable 48template<class In> 49 concept indirectly_readable = see below; // since C++20 50 51template<indirectly_readable T> 52 using iter_common_reference_t = 53 common_reference_t<iter_reference_t<T>, iter_value_t<T>&>; // since C++20 54 55// [iterator.concept.writable], concept indirectly_writable 56template<class Out, class T> 57 concept indirectly_writable = see below; // since C++20 58 59// [iterator.concept.winc], concept weakly_incrementable 60template<class I> 61 concept weakly_incrementable = see below; // since C++20 62 63// [iterator.concept.inc], concept incrementable 64template<class I> 65 concept incrementable = see below; // since C++20 66 67// [iterator.concept.iterator], concept input_or_output_iterator 68 template<class I> 69 concept input_or_output_iterator = see below; // since C++20 70 71// [iterator.concept.sentinel], concept sentinel_for 72template<class S, class I> 73 concept sentinel_for = see below; // since C++20 74 75// [iterator.concept.sizedsentinel], concept sized_sentinel_for 76template<class S, class I> 77 inline constexpr bool disable_sized_sentinel_for = false; 78 79template<class S, class I> 80 concept sized_sentinel_for = see below; 81 82// [iterator.concept.input], concept input_iterator 83template<class I> 84 concept input_iterator = see below; // since C++20 85 86// [iterator.concept.output], concept output_iterator 87template<class I, class T> 88 concept output_iterator = see below; // since C++20 89 90// [iterator.concept.forward], concept forward_iterator 91template<class I> 92 concept forward_iterator = see below; // since C++20 93 94// [iterator.concept.bidir], concept bidirectional_iterator 95template<class I> 96 concept bidirectional_iterator = see below; // since C++20 97 98// [iterator.concept.random.access], concept random_access_iterator 99template<class I> 100 concept random_access_iterator = see below; // since C++20 101 102// [indirectcallable] 103// [indirectcallable.indirectinvocable] 104template<class F, class I> 105 concept indirectly_unary_invocable = see below; // since C++20 106 107template<class F, class I> 108 concept indirectly_regular_unary_invocable = see below; // since C++20 109 110template<class F, class I> 111 concept indirect_unary_predicate = see below; // since C++20 112 113template<class F, class I1, class I2> 114 concept indirect_binary_predicate = see below; // since C++20 115 116template<class F, class I1, class I2 = I1> 117 concept indirect_equivalence_relation = see below; // since C++20 118 119template<class F, class I1, class I2 = I1> 120 concept indirect_strict_weak_order = see below; // since C++20 121 122template<class F, class... Is> 123 using indirect_result_t = see below; // since C++20 124 125// [projected], projected 126template<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj> 127 struct projected; // since C++20 128 129template<weakly_incrementable I, indirectly_regular_unary_invocable<I> Proj> 130 struct incrementable_traits<projected<I, Proj>>; // since C++20 131 132// [alg.req.ind.move], concept indirectly_movable 133template<class In, class Out> 134 concept indirectly_movable = see below; // since C++20 135 136template<class In, class Out> 137 concept indirectly_movable_storable = see below; // since C++20 138 139// [alg.req.ind.swap], concept indirectly_swappable 140template<class I1, class I2 = I1> 141 concept indirectly_swappable = see below; // since C++20 142 143template<class I1, class I2, class R, class P1 = identity, 144 class P2 = identity> 145 concept indirectly_comparable = 146 indirect_binary_predicate<R, projected<I1, P1>, projected<I2, P2>>; // since C++20 147 148template<input_or_output_iterator I, sentinel_for<I> S> 149 requires (!same_as<I, S> && copyable<I>) 150class common_iterator; // since C++20 151 152template<class Category, class T, class Distance = ptrdiff_t, 153 class Pointer = T*, class Reference = T&> 154struct iterator // deprecated in C++17 155{ 156 typedef T value_type; 157 typedef Distance difference_type; 158 typedef Pointer pointer; 159 typedef Reference reference; 160 typedef Category iterator_category; 161}; 162 163struct input_iterator_tag {}; 164struct output_iterator_tag {}; 165struct forward_iterator_tag : public input_iterator_tag {}; 166struct bidirectional_iterator_tag : public forward_iterator_tag {}; 167struct random_access_iterator_tag : public bidirectional_iterator_tag {}; 168struct contiguous_iterator_tag : public random_access_iterator_tag {}; 169 170// 27.4.3, iterator operations 171template <class InputIterator, class Distance> // constexpr in C++17 172 constexpr void advance(InputIterator& i, Distance n); 173 174template <class InputIterator> // constexpr in C++17 175 constexpr typename iterator_traits<InputIterator>::difference_type 176 distance(InputIterator first, InputIterator last); 177 178template <class InputIterator> // constexpr in C++17 179 constexpr InputIterator next(InputIterator x, 180typename iterator_traits<InputIterator>::difference_type n = 1); 181 182template <class BidirectionalIterator> // constexpr in C++17 183 constexpr BidirectionalIterator prev(BidirectionalIterator x, 184 typename iterator_traits<BidirectionalIterator>::difference_type n = 1); 185 186// [range.iter.ops], range iterator operations 187namespace ranges { 188 // [range.iter.op.advance], ranges::advance 189 template<input_or_output_iterator I> 190 constexpr void advance(I& i, iter_difference_t<I> n); // since C++20 191 template<input_or_output_iterator I, sentinel_for<I> S> 192 constexpr void advance(I& i, S bound); // since C++20 193 template<input_or_output_iterator I, sentinel_for<I> S> 194 constexpr iter_difference_t<I> advance(I& i, iter_difference_t<I> n, S bound); // since C++20 195} 196 197template <class Iterator> 198class reverse_iterator 199 : public iterator<typename iterator_traits<Iterator>::iterator_category, // until C++17 200 typename iterator_traits<Iterator>::value_type, 201 typename iterator_traits<Iterator>::difference_type, 202 typename iterator_traits<Iterator>::pointer, 203 typename iterator_traits<Iterator>::reference> 204{ 205protected: 206 Iterator current; 207public: 208 typedef Iterator iterator_type; 209 typedef typename iterator_traits<Iterator>::difference_type difference_type; 210 typedef typename iterator_traits<Iterator>::reference reference; 211 typedef typename iterator_traits<Iterator>::pointer pointer; 212 213 constexpr reverse_iterator(); 214 constexpr explicit reverse_iterator(Iterator x); 215 template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u); 216 template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); 217 constexpr Iterator base() const; 218 constexpr reference operator*() const; 219 constexpr pointer operator->() const; 220 constexpr reverse_iterator& operator++(); 221 constexpr reverse_iterator operator++(int); 222 constexpr reverse_iterator& operator--(); 223 constexpr reverse_iterator operator--(int); 224 constexpr reverse_iterator operator+ (difference_type n) const; 225 constexpr reverse_iterator& operator+=(difference_type n); 226 constexpr reverse_iterator operator- (difference_type n) const; 227 constexpr reverse_iterator& operator-=(difference_type n); 228 constexpr reference operator[](difference_type n) const; 229}; 230 231template <class Iterator1, class Iterator2> 232constexpr bool // constexpr in C++17 233operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 234 235template <class Iterator1, class Iterator2> 236constexpr bool // constexpr in C++17 237operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 238 239template <class Iterator1, class Iterator2> 240constexpr bool // constexpr in C++17 241operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 242 243template <class Iterator1, class Iterator2> 244constexpr bool // constexpr in C++17 245operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 246 247template <class Iterator1, class Iterator2> 248constexpr bool // constexpr in C++17 249operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 250 251template <class Iterator1, class Iterator2> 252constexpr bool // constexpr in C++17 253operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 254 255template <class Iterator1, class Iterator2> 256constexpr auto 257operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y) 258-> decltype(__y.base() - __x.base()); // constexpr in C++17 259 260template <class Iterator> 261constexpr reverse_iterator<Iterator> 262operator+(typename reverse_iterator<Iterator>::difference_type n, 263 const reverse_iterator<Iterator>& x); // constexpr in C++17 264 265template <class Iterator> 266constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17 267 268template <class Container> 269class back_insert_iterator 270 : public iterator<output_iterator_tag, void, void, void, void> // until C++17 271{ 272protected: 273 Container* container; 274public: 275 typedef Container container_type; 276 typedef void value_type; 277 typedef void difference_type; // until C++20 278 typedef ptrdiff_t difference_type; // since C++20 279 typedef void reference; 280 typedef void pointer; 281 282 explicit back_insert_iterator(Container& x); // constexpr in C++20 283 back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 284 back_insert_iterator& operator*(); // constexpr in C++20 285 back_insert_iterator& operator++(); // constexpr in C++20 286 back_insert_iterator operator++(int); // constexpr in C++20 287}; 288 289template <class Container> back_insert_iterator<Container> back_inserter(Container& x); // constexpr in C++20 290 291template <class Container> 292class front_insert_iterator 293 : public iterator<output_iterator_tag, void, void, void, void> // until C++17 294{ 295protected: 296 Container* container; 297public: 298 typedef Container container_type; 299 typedef void value_type; 300 typedef void difference_type; // until C++20 301 typedef ptrdiff_t difference_type; // since C++20 302 typedef void reference; 303 typedef void pointer; 304 305 explicit front_insert_iterator(Container& x); // constexpr in C++20 306 front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 307 front_insert_iterator& operator*(); // constexpr in C++20 308 front_insert_iterator& operator++(); // constexpr in C++20 309 front_insert_iterator operator++(int); // constexpr in C++20 310}; 311 312template <class Container> front_insert_iterator<Container> front_inserter(Container& x); // constexpr in C++20 313 314template <class Container> 315class insert_iterator 316 : public iterator<output_iterator_tag, void, void, void, void> // until C++17 317{ 318protected: 319 Container* container; 320 typename Container::iterator iter; 321public: 322 typedef Container container_type; 323 typedef void value_type; 324 typedef void difference_type; // until C++20 325 typedef ptrdiff_t difference_type; // since C++20 326 typedef void reference; 327 typedef void pointer; 328 329 insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20 330 insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 331 insert_iterator& operator*(); // constexpr in C++20 332 insert_iterator& operator++(); // constexpr in C++20 333 insert_iterator& operator++(int); // constexpr in C++20 334}; 335 336template <class Container, class Iterator> 337insert_iterator<Container> inserter(Container& x, Iterator i); // constexpr in C++20 338 339template <class Iterator> 340class move_iterator { 341public: 342 typedef Iterator iterator_type; 343 typedef typename iterator_traits<Iterator>::difference_type difference_type; 344 typedef Iterator pointer; 345 typedef typename iterator_traits<Iterator>::value_type value_type; 346 typedef typename iterator_traits<Iterator>::iterator_category iterator_category; 347 typedef value_type&& reference; 348 349 constexpr move_iterator(); // all the constexprs are in C++17 350 constexpr explicit move_iterator(Iterator i); 351 template <class U> 352 constexpr move_iterator(const move_iterator<U>& u); 353 template <class U> 354 constexpr move_iterator& operator=(const move_iterator<U>& u); 355 constexpr iterator_type base() const; 356 constexpr reference operator*() const; 357 constexpr pointer operator->() const; 358 constexpr move_iterator& operator++(); 359 constexpr move_iterator operator++(int); 360 constexpr move_iterator& operator--(); 361 constexpr move_iterator operator--(int); 362 constexpr move_iterator operator+(difference_type n) const; 363 constexpr move_iterator& operator+=(difference_type n); 364 constexpr move_iterator operator-(difference_type n) const; 365 constexpr move_iterator& operator-=(difference_type n); 366 constexpr unspecified operator[](difference_type n) const; 367private: 368 Iterator current; // exposition only 369}; 370 371template <class Iterator1, class Iterator2> 372constexpr bool // constexpr in C++17 373operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 374 375template <class Iterator1, class Iterator2> 376constexpr bool // constexpr in C++17 377operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 378 379template <class Iterator1, class Iterator2> 380constexpr bool // constexpr in C++17 381operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 382 383template <class Iterator1, class Iterator2> 384constexpr bool // constexpr in C++17 385operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 386 387template <class Iterator1, class Iterator2> 388constexpr bool // constexpr in C++17 389operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 390 391template <class Iterator1, class Iterator2> 392constexpr bool // constexpr in C++17 393operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 394 395template <class Iterator1, class Iterator2> 396constexpr auto // constexpr in C++17 397operator-(const move_iterator<Iterator1>& x, 398 const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base()); 399 400template <class Iterator> 401constexpr move_iterator<Iterator> operator+( // constexpr in C++17 402 typename move_iterator<Iterator>::difference_type n, 403 const move_iterator<Iterator>& x); 404 405template <class Iterator> // constexpr in C++17 406constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i); 407 408// [default.sentinel], default sentinel 409struct default_sentinel_t; 410inline constexpr default_sentinel_t default_sentinel{}; 411 412// [iterators.counted], counted iterators 413template<input_or_output_iterator I> class counted_iterator; 414 415template<input_iterator I> 416 requires see below 417 struct iterator_traits<counted_iterator<I>>; 418 419// [unreachable.sentinel], unreachable sentinel 420struct unreachable_sentinel_t; 421inline constexpr unreachable_sentinel_t unreachable_sentinel{}; 422 423template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> 424class istream_iterator 425 : public iterator<input_iterator_tag, T, Distance, const T*, const T&> // until C++17 426{ 427public: 428 typedef input_iterator_tag iterator_category; 429 typedef T value_type; 430 typedef Distance difference_type; 431 typedef const T* pointer; 432 typedef const T& reference; 433 434 typedef charT char_type; 435 typedef traits traits_type; 436 typedef basic_istream<charT, traits> istream_type; 437 438 constexpr istream_iterator(); 439 istream_iterator(istream_type& s); 440 istream_iterator(const istream_iterator& x); 441 ~istream_iterator(); 442 443 const T& operator*() const; 444 const T* operator->() const; 445 istream_iterator& operator++(); 446 istream_iterator operator++(int); 447}; 448 449template <class T, class charT, class traits, class Distance> 450bool operator==(const istream_iterator<T,charT,traits,Distance>& x, 451 const istream_iterator<T,charT,traits,Distance>& y); 452template <class T, class charT, class traits, class Distance> 453bool operator!=(const istream_iterator<T,charT,traits,Distance>& x, 454 const istream_iterator<T,charT,traits,Distance>& y); 455 456template <class T, class charT = char, class traits = char_traits<charT> > 457class ostream_iterator 458 : public iterator<output_iterator_tag, void, void, void, void> // until C++17 459{ 460public: 461 typedef output_iterator_tag iterator_category; 462 typedef void value_type; 463 typedef void difference_type; // until C++20 464 typedef ptrdiff_t difference_type; // since C++20 465 typedef void pointer; 466 typedef void reference; 467 468 typedef charT char_type; 469 typedef traits traits_type; 470 typedef basic_ostream<charT,traits> ostream_type; 471 472 ostream_iterator(ostream_type& s); 473 ostream_iterator(ostream_type& s, const charT* delimiter); 474 ostream_iterator(const ostream_iterator& x); 475 ~ostream_iterator(); 476 ostream_iterator& operator=(const T& value); 477 478 ostream_iterator& operator*(); 479 ostream_iterator& operator++(); 480 ostream_iterator& operator++(int); 481}; 482 483template<class charT, class traits = char_traits<charT> > 484class istreambuf_iterator 485 : public iterator<input_iterator_tag, charT, traits::off_type, unspecified, charT> // until C++17 486{ 487public: 488 typedef input_iterator_tag iterator_category; 489 typedef charT value_type; 490 typedef traits::off_type difference_type; 491 typedef unspecified pointer; 492 typedef charT reference; 493 494 typedef charT char_type; 495 typedef traits traits_type; 496 typedef traits::int_type int_type; 497 typedef basic_streambuf<charT, traits> streambuf_type; 498 typedef basic_istream<charT, traits> istream_type; 499 500 istreambuf_iterator() noexcept; 501 istreambuf_iterator(istream_type& s) noexcept; 502 istreambuf_iterator(streambuf_type* s) noexcept; 503 istreambuf_iterator(a-private-type) noexcept; 504 505 charT operator*() const; 506 pointer operator->() const; 507 istreambuf_iterator& operator++(); 508 a-private-type operator++(int); 509 510 bool equal(const istreambuf_iterator& b) const; 511}; 512 513template <class charT, class traits> 514bool operator==(const istreambuf_iterator<charT,traits>& a, 515 const istreambuf_iterator<charT,traits>& b); 516template <class charT, class traits> 517bool operator!=(const istreambuf_iterator<charT,traits>& a, 518 const istreambuf_iterator<charT,traits>& b); 519 520template <class charT, class traits = char_traits<charT> > 521class ostreambuf_iterator 522 : public iterator<output_iterator_tag, void, void, void, void> // until C++17 523{ 524public: 525 typedef output_iterator_tag iterator_category; 526 typedef void value_type; 527 typedef void difference_type; // until C++20 528 typedef ptrdiff_t difference_type; // since C++20 529 typedef void pointer; 530 typedef void reference; 531 532 typedef charT char_type; 533 typedef traits traits_type; 534 typedef basic_streambuf<charT, traits> streambuf_type; 535 typedef basic_ostream<charT, traits> ostream_type; 536 537 ostreambuf_iterator(ostream_type& s) noexcept; 538 ostreambuf_iterator(streambuf_type* s) noexcept; 539 ostreambuf_iterator& operator=(charT c); 540 ostreambuf_iterator& operator*(); 541 ostreambuf_iterator& operator++(); 542 ostreambuf_iterator& operator++(int); 543 bool failed() const noexcept; 544}; 545 546template <class C> constexpr auto begin(C& c) -> decltype(c.begin()); 547template <class C> constexpr auto begin(const C& c) -> decltype(c.begin()); 548template <class C> constexpr auto end(C& c) -> decltype(c.end()); 549template <class C> constexpr auto end(const C& c) -> decltype(c.end()); 550template <class T, size_t N> constexpr T* begin(T (&array)[N]); 551template <class T, size_t N> constexpr T* end(T (&array)[N]); 552 553template <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14 554template <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14 555template <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14 556template <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14 557template <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14 558template <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14 559template <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14 560template <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14 561template <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14 562template <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14 563template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 564template <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14 565 566// 24.8, container access: 567template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17 568template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17 569 570template <class C> constexpr auto ssize(const C& c) 571 -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>; // C++20 572template <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20 573 574template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17 575template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17 576template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17 577template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17 578template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17 579template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17 580template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17 581 582} // std 583 584*/ 585 586#include <__config> 587#include <__debug> 588#include <__functional_base> 589#include <__iterator/access.h> 590#include <__iterator/advance.h> 591#include <__iterator/back_insert_iterator.h> 592#include <__iterator/common_iterator.h> 593#include <__iterator/concepts.h> 594#include <__iterator/counted_iterator.h> 595#include <__iterator/data.h> 596#include <__iterator/default_sentinel.h> 597#include <__iterator/distance.h> 598#include <__iterator/empty.h> 599#include <__iterator/erase_if_container.h> 600#include <__iterator/front_insert_iterator.h> 601#include <__iterator/incrementable_traits.h> 602#include <__iterator/indirectly_comparable.h> 603#include <__iterator/insert_iterator.h> 604#include <__iterator/istream_iterator.h> 605#include <__iterator/istreambuf_iterator.h> 606#include <__iterator/iter_move.h> 607#include <__iterator/iter_swap.h> 608#include <__iterator/iterator.h> 609#include <__iterator/iterator_traits.h> 610#include <__iterator/move_iterator.h> 611#include <__iterator/next.h> 612#include <__iterator/ostream_iterator.h> 613#include <__iterator/ostreambuf_iterator.h> 614#include <__iterator/prev.h> 615#include <__iterator/projected.h> 616#include <__iterator/readable_traits.h> 617#include <__iterator/reverse_access.h> 618#include <__iterator/reverse_iterator.h> 619#include <__iterator/size.h> 620#include <__iterator/unreachable_sentinel.h> 621#include <__iterator/wrap_iter.h> 622#include <__memory/addressof.h> 623#include <__memory/pointer_traits.h> 624#include <__utility/forward.h> 625#include <compare> 626#include <concepts> // Mandated by the Standard. 627#include <cstddef> 628#include <initializer_list> 629#include <type_traits> 630#include <version> 631 632#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 633#pragma GCC system_header 634#endif 635 636#endif // _LIBCPP_ITERATOR 637