iterator 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
  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.swap], concept indirectly_swappable
  104. template<class I1, class I2 = I1>
  105. concept indirectly_swappable = see below; // since C++20
  106. template<class I1, class I2, class R, class P1 = identity,
  107. class P2 = identity>
  108. concept indirectly_comparable =
  109. indirect_binary_predicate<R, projected<I1, P1>, projected<I2, P2>>; // since C++20
  110. template<input_or_output_iterator I, sentinel_for<I> S>
  111. requires (!same_as<I, S> && copyable<I>)
  112. class common_iterator; // since C++20
  113. template<class Category, class T, class Distance = ptrdiff_t,
  114. class Pointer = T*, class Reference = T&>
  115. struct iterator // deprecated in C++17
  116. {
  117. typedef T value_type;
  118. typedef Distance difference_type;
  119. typedef Pointer pointer;
  120. typedef Reference reference;
  121. typedef Category iterator_category;
  122. };
  123. struct input_iterator_tag {};
  124. struct output_iterator_tag {};
  125. struct forward_iterator_tag : public input_iterator_tag {};
  126. struct bidirectional_iterator_tag : public forward_iterator_tag {};
  127. struct random_access_iterator_tag : public bidirectional_iterator_tag {};
  128. // 27.4.3, iterator operations
  129. template <class InputIterator, class Distance> // constexpr in C++17
  130. constexpr void advance(InputIterator& i, Distance n);
  131. template <class InputIterator> // constexpr in C++17
  132. constexpr typename iterator_traits<InputIterator>::difference_type
  133. distance(InputIterator first, InputIterator last);
  134. template <class InputIterator> // constexpr in C++17
  135. constexpr InputIterator next(InputIterator x,
  136. typename iterator_traits<InputIterator>::difference_type n = 1);
  137. template <class BidirectionalIterator> // constexpr in C++17
  138. constexpr BidirectionalIterator prev(BidirectionalIterator x,
  139. typename iterator_traits<BidirectionalIterator>::difference_type n = 1);
  140. // [range.iter.ops], range iterator operations
  141. namespace ranges {
  142. // [range.iter.op.advance], ranges::advance
  143. template<input_or_output_iterator I>
  144. constexpr void advance(I& i, iter_difference_t<I> n); // since C++20
  145. template<input_or_output_iterator I, sentinel_for<I> S>
  146. constexpr void advance(I& i, S bound); // since C++20
  147. template<input_or_output_iterator I, sentinel_for<I> S>
  148. constexpr iter_difference_t<I> advance(I& i, iter_difference_t<I> n, S bound); // since C++20
  149. }
  150. template <class Iterator>
  151. class reverse_iterator
  152. : public iterator<typename iterator_traits<Iterator>::iterator_category, // until C++17
  153. typename iterator_traits<Iterator>::value_type,
  154. typename iterator_traits<Iterator>::difference_type,
  155. typename iterator_traits<Iterator>::pointer,
  156. typename iterator_traits<Iterator>::reference>
  157. {
  158. protected:
  159. Iterator current;
  160. public:
  161. typedef Iterator iterator_type;
  162. typedef typename iterator_traits<Iterator>::difference_type difference_type;
  163. typedef typename iterator_traits<Iterator>::reference reference;
  164. typedef typename iterator_traits<Iterator>::pointer pointer;
  165. constexpr reverse_iterator();
  166. constexpr explicit reverse_iterator(Iterator x);
  167. template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u);
  168. template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u);
  169. constexpr Iterator base() const;
  170. constexpr reference operator*() const;
  171. constexpr pointer operator->() const;
  172. constexpr reverse_iterator& operator++();
  173. constexpr reverse_iterator operator++(int);
  174. constexpr reverse_iterator& operator--();
  175. constexpr reverse_iterator operator--(int);
  176. constexpr reverse_iterator operator+ (difference_type n) const;
  177. constexpr reverse_iterator& operator+=(difference_type n);
  178. constexpr reverse_iterator operator- (difference_type n) const;
  179. constexpr reverse_iterator& operator-=(difference_type n);
  180. constexpr reference operator[](difference_type n) const;
  181. };
  182. template <class Iterator1, class Iterator2>
  183. constexpr bool // constexpr in C++17
  184. operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  185. template <class Iterator1, class Iterator2>
  186. constexpr bool // constexpr in C++17
  187. operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  188. template <class Iterator1, class Iterator2>
  189. constexpr bool // constexpr in C++17
  190. operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  191. template <class Iterator1, class Iterator2>
  192. constexpr bool // constexpr in C++17
  193. operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  194. template <class Iterator1, class Iterator2>
  195. constexpr bool // constexpr in C++17
  196. operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  197. template <class Iterator1, class Iterator2>
  198. constexpr bool // constexpr in C++17
  199. operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y);
  200. template <class Iterator1, class Iterator2>
  201. constexpr auto
  202. operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y)
  203. -> decltype(__y.base() - __x.base()); // constexpr in C++17
  204. template <class Iterator>
  205. constexpr reverse_iterator<Iterator>
  206. operator+(typename reverse_iterator<Iterator>::difference_type n,
  207. const reverse_iterator<Iterator>& x); // constexpr in C++17
  208. template <class Iterator>
  209. constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17
  210. template <class Container>
  211. class back_insert_iterator
  212. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  213. {
  214. protected:
  215. Container* container;
  216. public:
  217. typedef Container container_type;
  218. typedef void value_type;
  219. typedef void difference_type; // until C++20
  220. typedef ptrdiff_t difference_type; // since C++20
  221. typedef void reference;
  222. typedef void pointer;
  223. explicit back_insert_iterator(Container& x); // constexpr in C++20
  224. back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  225. back_insert_iterator& operator*(); // constexpr in C++20
  226. back_insert_iterator& operator++(); // constexpr in C++20
  227. back_insert_iterator operator++(int); // constexpr in C++20
  228. };
  229. template <class Container> back_insert_iterator<Container> back_inserter(Container& x); // constexpr in C++20
  230. template <class Container>
  231. class front_insert_iterator
  232. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  233. {
  234. protected:
  235. Container* container;
  236. public:
  237. typedef Container container_type;
  238. typedef void value_type;
  239. typedef void difference_type; // until C++20
  240. typedef ptrdiff_t difference_type; // since C++20
  241. typedef void reference;
  242. typedef void pointer;
  243. explicit front_insert_iterator(Container& x); // constexpr in C++20
  244. front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  245. front_insert_iterator& operator*(); // constexpr in C++20
  246. front_insert_iterator& operator++(); // constexpr in C++20
  247. front_insert_iterator operator++(int); // constexpr in C++20
  248. };
  249. template <class Container> front_insert_iterator<Container> front_inserter(Container& x); // constexpr in C++20
  250. template <class Container>
  251. class insert_iterator
  252. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  253. {
  254. protected:
  255. Container* container;
  256. typename Container::iterator iter;
  257. public:
  258. typedef Container container_type;
  259. typedef void value_type;
  260. typedef void difference_type; // until C++20
  261. typedef ptrdiff_t difference_type; // since C++20
  262. typedef void reference;
  263. typedef void pointer;
  264. insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20
  265. insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20
  266. insert_iterator& operator*(); // constexpr in C++20
  267. insert_iterator& operator++(); // constexpr in C++20
  268. insert_iterator& operator++(int); // constexpr in C++20
  269. };
  270. template <class Container, class Iterator>
  271. insert_iterator<Container> inserter(Container& x, Iterator i); // constexpr in C++20
  272. template <class Iterator>
  273. class move_iterator {
  274. public:
  275. typedef Iterator iterator_type;
  276. typedef typename iterator_traits<Iterator>::difference_type difference_type;
  277. typedef Iterator pointer;
  278. typedef typename iterator_traits<Iterator>::value_type value_type;
  279. typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
  280. typedef value_type&& reference;
  281. constexpr move_iterator(); // all the constexprs are in C++17
  282. constexpr explicit move_iterator(Iterator i);
  283. template <class U>
  284. constexpr move_iterator(const move_iterator<U>& u);
  285. template <class U>
  286. constexpr move_iterator& operator=(const move_iterator<U>& u);
  287. constexpr iterator_type base() const;
  288. constexpr reference operator*() const;
  289. constexpr pointer operator->() const;
  290. constexpr move_iterator& operator++();
  291. constexpr move_iterator operator++(int);
  292. constexpr move_iterator& operator--();
  293. constexpr move_iterator operator--(int);
  294. constexpr move_iterator operator+(difference_type n) const;
  295. constexpr move_iterator& operator+=(difference_type n);
  296. constexpr move_iterator operator-(difference_type n) const;
  297. constexpr move_iterator& operator-=(difference_type n);
  298. constexpr unspecified operator[](difference_type n) const;
  299. private:
  300. Iterator current; // exposition only
  301. };
  302. template <class Iterator1, class Iterator2>
  303. constexpr bool // constexpr in C++17
  304. operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  305. template <class Iterator1, class Iterator2>
  306. constexpr bool // constexpr in C++17
  307. operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  308. template <class Iterator1, class Iterator2>
  309. constexpr bool // constexpr in C++17
  310. operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  311. template <class Iterator1, class Iterator2>
  312. constexpr bool // constexpr in C++17
  313. operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  314. template <class Iterator1, class Iterator2>
  315. constexpr bool // constexpr in C++17
  316. operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  317. template <class Iterator1, class Iterator2>
  318. constexpr bool // constexpr in C++17
  319. operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
  320. template <class Iterator1, class Iterator2>
  321. constexpr auto // constexpr in C++17
  322. operator-(const move_iterator<Iterator1>& x,
  323. const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base());
  324. template <class Iterator>
  325. constexpr move_iterator<Iterator> operator+( // constexpr in C++17
  326. typename move_iterator<Iterator>::difference_type n,
  327. const move_iterator<Iterator>& x);
  328. template <class Iterator> // constexpr in C++17
  329. constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i);
  330. // [default.sentinel], default sentinel
  331. struct default_sentinel_t;
  332. inline constexpr default_sentinel_t default_sentinel{};
  333. // [iterators.counted], counted iterators
  334. template<input_or_output_iterator I> class counted_iterator;
  335. template<input_iterator I>
  336. requires see below
  337. struct iterator_traits<counted_iterator<I>>;
  338. // [unreachable.sentinel], unreachable sentinel
  339. struct unreachable_sentinel_t;
  340. inline constexpr unreachable_sentinel_t unreachable_sentinel{};
  341. template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t>
  342. class istream_iterator
  343. : public iterator<input_iterator_tag, T, Distance, const T*, const T&> // until C++17
  344. {
  345. public:
  346. typedef input_iterator_tag iterator_category;
  347. typedef T value_type;
  348. typedef Distance difference_type;
  349. typedef const T* pointer;
  350. typedef const T& reference;
  351. typedef charT char_type;
  352. typedef traits traits_type;
  353. typedef basic_istream<charT, traits> istream_type;
  354. constexpr istream_iterator();
  355. istream_iterator(istream_type& s);
  356. istream_iterator(const istream_iterator& x);
  357. ~istream_iterator();
  358. const T& operator*() const;
  359. const T* operator->() const;
  360. istream_iterator& operator++();
  361. istream_iterator operator++(int);
  362. };
  363. template <class T, class charT, class traits, class Distance>
  364. bool operator==(const istream_iterator<T,charT,traits,Distance>& x,
  365. const istream_iterator<T,charT,traits,Distance>& y);
  366. template <class T, class charT, class traits, class Distance>
  367. bool operator!=(const istream_iterator<T,charT,traits,Distance>& x,
  368. const istream_iterator<T,charT,traits,Distance>& y);
  369. template <class T, class charT = char, class traits = char_traits<charT> >
  370. class ostream_iterator
  371. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  372. {
  373. public:
  374. typedef output_iterator_tag iterator_category;
  375. typedef void value_type;
  376. typedef void difference_type; // until C++20
  377. typedef ptrdiff_t difference_type; // since C++20
  378. typedef void pointer;
  379. typedef void reference;
  380. typedef charT char_type;
  381. typedef traits traits_type;
  382. typedef basic_ostream<charT,traits> ostream_type;
  383. ostream_iterator(ostream_type& s);
  384. ostream_iterator(ostream_type& s, const charT* delimiter);
  385. ostream_iterator(const ostream_iterator& x);
  386. ~ostream_iterator();
  387. ostream_iterator& operator=(const T& value);
  388. ostream_iterator& operator*();
  389. ostream_iterator& operator++();
  390. ostream_iterator& operator++(int);
  391. };
  392. template<class charT, class traits = char_traits<charT> >
  393. class istreambuf_iterator
  394. : public iterator<input_iterator_tag, charT, traits::off_type, unspecified, charT> // until C++17
  395. {
  396. public:
  397. typedef input_iterator_tag iterator_category;
  398. typedef charT value_type;
  399. typedef traits::off_type difference_type;
  400. typedef unspecified pointer;
  401. typedef charT reference;
  402. typedef charT char_type;
  403. typedef traits traits_type;
  404. typedef traits::int_type int_type;
  405. typedef basic_streambuf<charT, traits> streambuf_type;
  406. typedef basic_istream<charT, traits> istream_type;
  407. istreambuf_iterator() noexcept;
  408. istreambuf_iterator(istream_type& s) noexcept;
  409. istreambuf_iterator(streambuf_type* s) noexcept;
  410. istreambuf_iterator(a-private-type) noexcept;
  411. charT operator*() const;
  412. pointer operator->() const;
  413. istreambuf_iterator& operator++();
  414. a-private-type operator++(int);
  415. bool equal(const istreambuf_iterator& b) const;
  416. };
  417. template <class charT, class traits>
  418. bool operator==(const istreambuf_iterator<charT,traits>& a,
  419. const istreambuf_iterator<charT,traits>& b);
  420. template <class charT, class traits>
  421. bool operator!=(const istreambuf_iterator<charT,traits>& a,
  422. const istreambuf_iterator<charT,traits>& b);
  423. template <class charT, class traits = char_traits<charT> >
  424. class ostreambuf_iterator
  425. : public iterator<output_iterator_tag, void, void, void, void> // until C++17
  426. {
  427. public:
  428. typedef output_iterator_tag iterator_category;
  429. typedef void value_type;
  430. typedef void difference_type; // until C++20
  431. typedef ptrdiff_t difference_type; // since C++20
  432. typedef void pointer;
  433. typedef void reference;
  434. typedef charT char_type;
  435. typedef traits traits_type;
  436. typedef basic_streambuf<charT, traits> streambuf_type;
  437. typedef basic_ostream<charT, traits> ostream_type;
  438. ostreambuf_iterator(ostream_type& s) noexcept;
  439. ostreambuf_iterator(streambuf_type* s) noexcept;
  440. ostreambuf_iterator& operator=(charT c);
  441. ostreambuf_iterator& operator*();
  442. ostreambuf_iterator& operator++();
  443. ostreambuf_iterator& operator++(int);
  444. bool failed() const noexcept;
  445. };
  446. template <class C> constexpr auto begin(C& c) -> decltype(c.begin());
  447. template <class C> constexpr auto begin(const C& c) -> decltype(c.begin());
  448. template <class C> constexpr auto end(C& c) -> decltype(c.end());
  449. template <class C> constexpr auto end(const C& c) -> decltype(c.end());
  450. template <class T, size_t N> constexpr T* begin(T (&array)[N]);
  451. template <class T, size_t N> constexpr T* end(T (&array)[N]);
  452. template <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14
  453. template <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14
  454. template <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14
  455. template <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14
  456. template <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14
  457. template <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14
  458. template <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14
  459. template <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14
  460. template <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14
  461. template <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14
  462. template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14
  463. template <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14
  464. // 24.8, container access:
  465. template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17
  466. template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17
  467. template <class C> constexpr auto ssize(const C& c)
  468. -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>; // C++20
  469. template <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20
  470. template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17
  471. template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17
  472. template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17
  473. template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17
  474. template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17
  475. template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17
  476. template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17
  477. } // std
  478. */
  479. #include <__config>
  480. #include <__debug>
  481. #include <__functional_base>
  482. #include <__iterator/access.h>
  483. #include <__iterator/advance.h>
  484. #include <__iterator/back_insert_iterator.h>
  485. #include <__iterator/common_iterator.h>
  486. #include <__iterator/concepts.h>
  487. #include <__iterator/counted_iterator.h>
  488. #include <__iterator/data.h>
  489. #include <__iterator/default_sentinel.h>
  490. #include <__iterator/distance.h>
  491. #include <__iterator/empty.h>
  492. #include <__iterator/erase_if_container.h>
  493. #include <__iterator/front_insert_iterator.h>
  494. #include <__iterator/incrementable_traits.h>
  495. #include <__iterator/indirectly_comparable.h>
  496. #include <__iterator/insert_iterator.h>
  497. #include <__iterator/istream_iterator.h>
  498. #include <__iterator/istreambuf_iterator.h>
  499. #include <__iterator/iter_move.h>
  500. #include <__iterator/iter_swap.h>
  501. #include <__iterator/iterator.h>
  502. #include <__iterator/iterator_traits.h>
  503. #include <__iterator/move_iterator.h>
  504. #include <__iterator/next.h>
  505. #include <__iterator/ostream_iterator.h>
  506. #include <__iterator/ostreambuf_iterator.h>
  507. #include <__iterator/prev.h>
  508. #include <__iterator/projected.h>
  509. #include <__iterator/readable_traits.h>
  510. #include <__iterator/reverse_access.h>
  511. #include <__iterator/reverse_iterator.h>
  512. #include <__iterator/size.h>
  513. #include <__iterator/unreachable_sentinel.h>
  514. #include <__iterator/wrap_iter.h>
  515. #include <__memory/addressof.h>
  516. #include <__memory/pointer_traits.h>
  517. #include <__utility/forward.h>
  518. #include <compare>
  519. #include <concepts> // Mandated by the Standard.
  520. #include <cstddef>
  521. #include <initializer_list>
  522. #include <type_traits>
  523. #include <version>
  524. #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
  525. #pragma GCC system_header
  526. #endif
  527. #endif // _LIBCPP_ITERATOR