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