iterator 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  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. typedef Iterator iterator_type;
  178. typedef typename iterator_traits<Iterator>::difference_type difference_type;
  179. typedef typename iterator_traits<Iterator>::reference reference;
  180. typedef typename iterator_traits<Iterator>::pointer pointer;
  181. constexpr reverse_iterator();
  182. constexpr explicit reverse_iterator(Iterator x);
  183. template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
  184. template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
  185. constexpr Iterator base() const;
  186. constexpr reference operator*() const;
  187. constexpr pointer operator->() const;
  188. constexpr reverse_iterator& operator++();
  189. constexpr reverse_iterator operator++(int);
  190. constexpr reverse_iterator& operator--();
  191. constexpr reverse_iterator operator--(int);
  192. constexpr reverse_iterator operator+ (difference_type n) const;
  193. constexpr reverse_iterator& operator+=(difference_type n);
  194. constexpr reverse_iterator operator- (difference_type n) const;
  195. constexpr reverse_iterator& operator-=(difference_type n);
  196. constexpr reference operator[](difference_type n) const;
  197. };
  198. template <class Iterator1, class Iterator2>
  199. constexpr bool // constexpr in C++17
  200. operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  201. template <class Iterator1, class Iterator2>
  202. constexpr bool // constexpr in C++17
  203. operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  204. template <class Iterator1, class Iterator2>
  205. constexpr bool // constexpr in C++17
  206. operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  207. template <class Iterator1, class Iterator2>
  208. constexpr bool // constexpr in C++17
  209. operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  210. template <class Iterator1, class Iterator2>
  211. constexpr bool // constexpr in C++17
  212. operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  213. template <class Iterator1, class Iterator2>
  214. constexpr bool // constexpr in C++17
  215. operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  216. template <class Iterator1, class Iterator2>
  217. constexpr auto
  218. operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y)
  219. -> decltype(__y.base() - __x.base()); // constexpr in C++17
  220. template <class Iterator>
  221. constexpr reverse_iterator<Iterator>
  222. operator+(typename reverse_iterator<Iterator>::difference_type n,
  223. const reverse_iterator<Iterator>& x); // constexpr in C++17
  224. template <class Iterator>
  225. constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17
  226. template <class Container>
  227. class back_insert_iterator
  228. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  229. {
  230. protected:
  231. Container* container;
  232. public:
  233. typedef Container container_type;
  234. typedef void value_type;
  235. typedef void difference_type; // until C++20
  236. typedef ptrdiff_t difference_type; // since C++20
  237. typedef void reference;
  238. typedef void pointer;
  239. explicit back_insert_iterator(Container& x); // constexpr in C++20
  240. back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  241. back_insert_iterator& operator*(); // constexpr in C++20
  242. back_insert_iterator& operator++(); // constexpr in C++20
  243. back_insert_iterator operator++(int); // constexpr in C++20
  244. };
  245. template <class Container> back_insert_iterator<Container> back_inserter(Container& x); // constexpr in C++20
  246. template <class Container>
  247. class front_insert_iterator
  248. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  249. {
  250. protected:
  251. Container* container;
  252. public:
  253. typedef Container container_type;
  254. typedef void value_type;
  255. typedef void difference_type; // until C++20
  256. typedef ptrdiff_t difference_type; // since C++20
  257. typedef void reference;
  258. typedef void pointer;
  259. explicit front_insert_iterator(Container& x); // constexpr in C++20
  260. front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  261. front_insert_iterator& operator*(); // constexpr in C++20
  262. front_insert_iterator& operator++(); // constexpr in C++20
  263. front_insert_iterator operator++(int); // constexpr in C++20
  264. };
  265. template <class Container> front_insert_iterator<Container> front_inserter(Container& x); // constexpr in C++20
  266. template <class Container>
  267. class insert_iterator
  268. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  269. {
  270. protected:
  271. Container* container;
  272. typename Container::iterator iter;
  273. public:
  274. typedef Container container_type;
  275. typedef void value_type;
  276. typedef void difference_type; // until C++20
  277. typedef ptrdiff_t difference_type; // since C++20
  278. typedef void reference;
  279. typedef void pointer;
  280. insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20
  281. insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  282. insert_iterator& operator*(); // constexpr in C++20
  283. insert_iterator& operator++(); // constexpr in C++20
  284. insert_iterator& operator++(int); // constexpr in C++20
  285. };
  286. template <class Container>
  287. insert_iterator<Container> inserter(Container& x, typename Container::iterator i); // until C++20
  288. template <class Container>
  289. constexpr insert_iterator<Container> inserter(Container& x, ranges::iterator_t<Container> i); // since C++20
  290. template <class Iterator>
  291. class move_iterator {
  292. public:
  293. typedef Iterator iterator_type;
  294. typedef typename iterator_traits<Iterator>::difference_type difference_type;
  295. typedef Iterator pointer;
  296. typedef typename iterator_traits<Iterator>::value_type value_type;
  297. typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
  298. typedef value_type&& reference;
  299. constexpr move_iterator(); // all the constexprs are in C++17
  300. constexpr explicit move_iterator(Iterator i);
  301. template <class U>
  302. constexpr move_iterator(const move_iterator<U>& u);
  303. template <class U>
  304. constexpr move_iterator& operator=(const move_iterator<U>& u);
  305. constexpr iterator_type base() const;
  306. constexpr reference operator*() const;
  307. constexpr pointer operator->() const;
  308. constexpr move_iterator& operator++();
  309. constexpr move_iterator operator++(int);
  310. constexpr move_iterator& operator--();
  311. constexpr move_iterator operator--(int);
  312. constexpr move_iterator operator+(difference_type n) const;
  313. constexpr move_iterator& operator+=(difference_type n);
  314. constexpr move_iterator operator-(difference_type n) const;
  315. constexpr move_iterator& operator-=(difference_type n);
  316. constexpr unspecified operator[](difference_type n) const;
  317. private:
  318. Iterator current; // exposition only
  319. };
  320. template <class Iterator1, class Iterator2>
  321. constexpr bool // constexpr in C++17
  322. operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  323. template <class Iterator1, class Iterator2>
  324. constexpr bool // constexpr in C++17
  325. operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  326. template <class Iterator1, class Iterator2>
  327. constexpr bool // constexpr in C++17
  328. operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  329. template <class Iterator1, class Iterator2>
  330. constexpr bool // constexpr in C++17
  331. operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  332. template <class Iterator1, class Iterator2>
  333. constexpr bool // constexpr in C++17
  334. operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  335. template <class Iterator1, class Iterator2>
  336. constexpr bool // constexpr in C++17
  337. operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  338. template <class Iterator1, class Iterator2>
  339. constexpr auto // constexpr in C++17
  340. operator-(const move_iterator<Iterator1>& x,
  341. const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
  342. template <class Iterator>
  343. constexpr move_iterator<Iterator> operator+( // constexpr in C++17
  344. typename move_iterator<Iterator>::difference_type n,
  345. const move_iterator<Iterator>& x);
  346. template <class Iterator> // constexpr in C++17
  347. constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i);
  348. // [default.sentinel], default sentinel
  349. struct default_sentinel_t;
  350. inline constexpr default_sentinel_t default_sentinel{};
  351. // [iterators.counted], counted iterators
  352. template<input_or_output_iterator I> class counted_iterator;
  353. template<input_iterator I>
  354. requires see below
  355. struct iterator_traits<counted_iterator<I>>;
  356. // [unreachable.sentinel], unreachable sentinel
  357. struct unreachable_sentinel_t;
  358. inline constexpr unreachable_sentinel_t unreachable_sentinel{};
  359. template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
  360. class istream_iterator
  361. : public iterator<input_iterator_tag, T, Distance, const T*, const T&> // until C++17
  362. {
  363. public:
  364. typedef input_iterator_tag iterator_category;
  365. typedef T value_type;
  366. typedef Distance difference_type;
  367. typedef const T* pointer;
  368. typedef const T& reference;
  369. typedef charT char_type;
  370. typedef traits traits_type;
  371. typedef basic_istream<charT, traits> istream_type;
  372. istream_iterator(); // constexpr since C++11
  373. constexpr istream_iterator(default_sentinel_t); // since C++20
  374. istream_iterator(istream_type& s);
  375. istream_iterator(const istream_iterator& x);
  376. ~istream_iterator();
  377. const T& operator*() const;
  378. const T* operator->() const;
  379. istream_iterator& operator++();
  380. istream_iterator operator++(int);
  381. friend bool operator==(const istream_iterator& i, default_sentinel_t); // since C++20
  382. };
  383. template <class T, class charT, class traits, class Distance>
  384. bool operator==(const istream_iterator<T,charT,traits,Distance>& x,
  385. const istream_iterator<T,charT,traits,Distance>& y);
  386. template <class T, class charT, class traits, class Distance>
  387. bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
  388. const istream_iterator<T,charT,traits,Distance>& y); // until C++20
  389. template <class T, class charT = char, class traits = char_traits<charT> >
  390. class ostream_iterator
  391. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  392. {
  393. public:
  394. typedef output_iterator_tag iterator_category;
  395. typedef void value_type;
  396. typedef void difference_type; // until C++20
  397. typedef ptrdiff_t difference_type; // since C++20
  398. typedef void pointer;
  399. typedef void reference;
  400. typedef charT char_type;
  401. typedef traits traits_type;
  402. typedef basic_ostream<charT,traits> ostream_type;
  403. ostream_iterator(ostream_type& s);
  404. ostream_iterator(ostream_type& s, const charT* delimiter);
  405. ostream_iterator(const ostream_iterator& x);
  406. ~ostream_iterator();
  407. ostream_iterator& operator=(const T& value);
  408. ostream_iterator& operator*();
  409. ostream_iterator& operator++();
  410. ostream_iterator& operator++(int);
  411. };
  412. template<class charT, class traits = char_traits<charT> >
  413. class istreambuf_iterator
  414. : public iterator<input_iterator_tag, charT, traits::off_type, unspecified, charT> // until C++17
  415. {
  416. public:
  417. typedef input_iterator_tag iterator_category;
  418. typedef charT value_type;
  419. typedef traits::off_type difference_type;
  420. typedef unspecified pointer;
  421. typedef charT reference;
  422. typedef charT char_type;
  423. typedef traits traits_type;
  424. typedef traits::int_type int_type;
  425. typedef basic_streambuf<charT, traits> streambuf_type;
  426. typedef basic_istream<charT, traits> istream_type;
  427. istreambuf_iterator() noexcept; // constexpr since C++11
  428. constexpr istreambuf_iterator(default_sentinel_t) noexcept; // since C++20
  429. istreambuf_iterator(istream_type& s) noexcept;
  430. istreambuf_iterator(streambuf_type* s) noexcept;
  431. istreambuf_iterator(a-private-type) noexcept;
  432. charT operator*() const;
  433. pointer operator->() const;
  434. istreambuf_iterator& operator++();
  435. a-private-type operator++(int);
  436. bool equal(const istreambuf_iterator& b) const;
  437. friend bool operator==(const istreambuf_iterator& i, default_sentinel_t s); // since C++20
  438. };
  439. template <class charT, class traits>
  440. bool operator==(const istreambuf_iterator<charT,traits>& a,
  441. const istreambuf_iterator<charT,traits>& b);
  442. template <class charT, class traits>
  443. bool operator!=(const istreambuf_iterator<charT,traits>& a,
  444. const istreambuf_iterator<charT,traits>& b); // until C++20
  445. template <class charT, class traits = char_traits<charT> >
  446. class ostreambuf_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_streambuf<charT, traits> streambuf_type;
  459. typedef basic_ostream<charT, traits> ostream_type;
  460. ostreambuf_iterator(ostream_type& s) noexcept;
  461. ostreambuf_iterator(streambuf_type* s) noexcept;
  462. ostreambuf_iterator& operator=(charT c);
  463. ostreambuf_iterator& operator*();
  464. ostreambuf_iterator& operator++();
  465. ostreambuf_iterator& operator++(int);
  466. bool failed() const noexcept;
  467. };
  468. template <class C> constexpr auto begin(C& c) -> decltype(c.begin());
  469. template <class C> constexpr auto begin(const C& c) -> decltype(c.begin());
  470. template <class C> constexpr auto end(C& c) -> decltype(c.end());
  471. template <class C> constexpr auto end(const C& c) -> decltype(c.end());
  472. template <class T, size_t N> constexpr T* begin(T (&array)[N]);
  473. template <class T, size_t N> constexpr T* end(T (&array)[N]);
  474. template <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14
  475. template <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14
  476. template <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14
  477. template <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14
  478. template <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14
  479. template <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14
  480. template <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14
  481. template <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14
  482. template <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14
  483. template <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14
  484. template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14
  485. template <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14
  486. // 24.8, container access:
  487. template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17
  488. template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17
  489. template <class C> constexpr auto ssize(const C& c)
  490. -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>; // C++20
  491. template <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20
  492. template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17
  493. template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17
  494. template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17
  495. template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17
  496. template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17
  497. template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17
  498. template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17
  499. } // std
  500. */
  501. #include <__config>
  502. #include <__debug>
  503. #include <__iterator/access.h>
  504. #include <__iterator/advance.h>
  505. #include <__iterator/back_insert_iterator.h>
  506. #include <__iterator/common_iterator.h>
  507. #include <__iterator/concepts.h>
  508. #include <__iterator/counted_iterator.h>
  509. #include <__iterator/data.h>
  510. #include <__iterator/default_sentinel.h>
  511. #include <__iterator/distance.h>
  512. #include <__iterator/empty.h>
  513. #include <__iterator/erase_if_container.h>
  514. #include <__iterator/front_insert_iterator.h>
  515. #include <__iterator/incrementable_traits.h>
  516. #include <__iterator/indirectly_comparable.h>
  517. #include <__iterator/insert_iterator.h>
  518. #include <__iterator/istream_iterator.h>
  519. #include <__iterator/istreambuf_iterator.h>
  520. #include <__iterator/iter_move.h>
  521. #include <__iterator/iter_swap.h>
  522. #include <__iterator/iterator.h>
  523. #include <__iterator/iterator_traits.h>
  524. #include <__iterator/mergeable.h>
  525. #include <__iterator/move_iterator.h>
  526. #include <__iterator/next.h>
  527. #include <__iterator/ostream_iterator.h>
  528. #include <__iterator/ostreambuf_iterator.h>
  529. #include <__iterator/permutable.h>
  530. #include <__iterator/prev.h>
  531. #include <__iterator/projected.h>
  532. #include <__iterator/readable_traits.h>
  533. #include <__iterator/reverse_access.h>
  534. #include <__iterator/reverse_iterator.h>
  535. #include <__iterator/size.h>
  536. #include <__iterator/sortable.h>
  537. #include <__iterator/unreachable_sentinel.h>
  538. #include <__iterator/wrap_iter.h>
  539. #include <__memory/addressof.h>
  540. #include <__memory/pointer_traits.h>
  541. #include <compare>
  542. #include <concepts> // Mandated by the Standard.
  543. #include <cstddef>
  544. #include <initializer_list>
  545. #include <type_traits>
  546. #include <utility>
  547. #include <version>
  548. // TODO: remove these headers
  549. #include <__functional/binary_function.h>
  550. #include <__functional/invoke.h>
  551. #include <__functional/operations.h>
  552. #include <__functional/reference_wrapper.h>
  553. #include <__functional/unary_function.h>
  554. #include <__functional/weak_result_type.h>
  555. #include <__memory/allocator_arg_t.h>
  556. #include <__memory/uses_allocator.h>
  557. #include <exception>
  558. #include <new>
  559. #include <typeinfo>
  560. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  561. # pragma GCC system_header
  562. #endif
  563. #endif // _LIBCPP_ITERATOR