iterator 31 KB

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