146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_ITERATOR 1146035553Spatrick#define _LIBCPP_ITERATOR 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick iterator synopsis 1546035553Spatrick 1676d0caaeSpatrick#include <concepts> 1776d0caaeSpatrick 1846035553Spatricknamespace std 1946035553Spatrick{ 2076d0caaeSpatricktemplate<class> struct incrementable_traits; // since C++20 2176d0caaeSpatricktemplate<class T> 2276d0caaeSpatrick using iter_difference_t = see below; // since C++20 2376d0caaeSpatrick 2476d0caaeSpatricktemplate<class> struct indirectly_readable_traits; // since C++20 2576d0caaeSpatricktemplate<class T> 2676d0caaeSpatrick using iter_value_t = see below; // since C++20 2746035553Spatrick 2846035553Spatricktemplate<class Iterator> 2976d0caaeSpatrickstruct iterator_traits; 3046035553Spatrick 3146035553Spatricktemplate<class T> 3276d0caaeSpatrick requires is_object_v<T> // since C++20 3376d0caaeSpatrickstruct iterator_traits<T*>; 3476d0caaeSpatrick 3576d0caaeSpatricktemplate<dereferenceable T> 3676d0caaeSpatrick using iter_reference_t = decltype(*declval<T&>()); 3776d0caaeSpatrick 3876d0caaeSpatricknamespace ranges::inline unspecified { 3976d0caaeSpatrick inline constexpr unspecified iter_move = unspecified; // since C++20, nodiscard as an extension 4076d0caaeSpatrick}} 4176d0caaeSpatrick 4276d0caaeSpatricktemplate<dereferenceable T> 4376d0caaeSpatrick requires ... 4476d0caaeSpatrickusing iter_rvalue_reference_t = decltype(ranges::iter_move(declval<T&>())); // since C++20 4576d0caaeSpatrick 4676d0caaeSpatrick// [iterator.concepts], iterator concepts 4776d0caaeSpatrick// [iterator.concept.readable], concept indirectly_readable 4876d0caaeSpatricktemplate<class In> 4976d0caaeSpatrick concept indirectly_readable = see below; // since C++20 5076d0caaeSpatrick 5176d0caaeSpatricktemplate<indirectly_readable T> 5276d0caaeSpatrick using iter_common_reference_t = 5376d0caaeSpatrick common_reference_t<iter_reference_t<T>, iter_value_t<T>&>; // since C++20 5476d0caaeSpatrick 5576d0caaeSpatrick// [iterator.concept.writable], concept indirectly_writable 5676d0caaeSpatricktemplate<class Out, class T> 5776d0caaeSpatrick concept indirectly_writable = see below; // since C++20 5876d0caaeSpatrick 5976d0caaeSpatrick// [iterator.concept.winc], concept weakly_incrementable 6076d0caaeSpatricktemplate<class I> 6176d0caaeSpatrick concept weakly_incrementable = see below; // since C++20 6276d0caaeSpatrick 6376d0caaeSpatrick// [iterator.concept.inc], concept incrementable 6476d0caaeSpatricktemplate<class I> 6576d0caaeSpatrick concept incrementable = see below; // since C++20 6676d0caaeSpatrick 6776d0caaeSpatrick// [iterator.concept.iterator], concept input_or_output_iterator 6876d0caaeSpatrick template<class I> 6976d0caaeSpatrick concept input_or_output_iterator = see below; // since C++20 7076d0caaeSpatrick 7176d0caaeSpatrick// [iterator.concept.sentinel], concept sentinel_for 7276d0caaeSpatricktemplate<class S, class I> 7376d0caaeSpatrick concept sentinel_for = see below; // since C++20 7476d0caaeSpatrick 7576d0caaeSpatrick// [iterator.concept.sizedsentinel], concept sized_sentinel_for 7676d0caaeSpatricktemplate<class S, class I> 7776d0caaeSpatrick inline constexpr bool disable_sized_sentinel_for = false; 7876d0caaeSpatrick 7976d0caaeSpatricktemplate<class S, class I> 8076d0caaeSpatrick concept sized_sentinel_for = see below; 8176d0caaeSpatrick 8276d0caaeSpatrick// [iterator.concept.input], concept input_iterator 8376d0caaeSpatricktemplate<class I> 8476d0caaeSpatrick concept input_iterator = see below; // since C++20 8576d0caaeSpatrick 8676d0caaeSpatrick// [iterator.concept.output], concept output_iterator 8776d0caaeSpatricktemplate<class I, class T> 8876d0caaeSpatrick concept output_iterator = see below; // since C++20 8976d0caaeSpatrick 9076d0caaeSpatrick// [iterator.concept.forward], concept forward_iterator 9176d0caaeSpatricktemplate<class I> 9276d0caaeSpatrick concept forward_iterator = see below; // since C++20 9376d0caaeSpatrick 9476d0caaeSpatrick// [iterator.concept.bidir], concept bidirectional_iterator 9576d0caaeSpatricktemplate<class I> 9676d0caaeSpatrick concept bidirectional_iterator = see below; // since C++20 9776d0caaeSpatrick 9876d0caaeSpatrick// [iterator.concept.random.access], concept random_access_iterator 9976d0caaeSpatricktemplate<class I> 10076d0caaeSpatrick concept random_access_iterator = see below; // since C++20 10176d0caaeSpatrick 10276d0caaeSpatrick// [indirectcallable] 10376d0caaeSpatrick// [indirectcallable.indirectinvocable] 10476d0caaeSpatricktemplate<class F, class I> 10576d0caaeSpatrick concept indirectly_unary_invocable = see below; // since C++20 10676d0caaeSpatrick 10776d0caaeSpatricktemplate<class F, class I> 10876d0caaeSpatrick concept indirectly_regular_unary_invocable = see below; // since C++20 10976d0caaeSpatrick 11076d0caaeSpatricktemplate<class F, class I> 11176d0caaeSpatrick concept indirect_unary_predicate = see below; // since C++20 11276d0caaeSpatrick 11376d0caaeSpatricktemplate<class F, class I1, class I2> 11476d0caaeSpatrick concept indirect_binary_predicate = see below; // since C++20 11576d0caaeSpatrick 11676d0caaeSpatricktemplate<class F, class I1, class I2 = I1> 11776d0caaeSpatrick concept indirect_equivalence_relation = see below; // since C++20 11876d0caaeSpatrick 11976d0caaeSpatricktemplate<class F, class I1, class I2 = I1> 12076d0caaeSpatrick concept indirect_strict_weak_order = see below; // since C++20 12176d0caaeSpatrick 12276d0caaeSpatricktemplate<class F, class... Is> 12376d0caaeSpatrick using indirect_result_t = see below; // since C++20 12476d0caaeSpatrick 12576d0caaeSpatrick// [projected], projected 12676d0caaeSpatricktemplate<indirectly_readable I, indirectly_regular_unary_invocable<I> Proj> 12776d0caaeSpatrick struct projected; // since C++20 12876d0caaeSpatrick 12976d0caaeSpatricktemplate<weakly_incrementable I, indirectly_regular_unary_invocable<I> Proj> 13076d0caaeSpatrick struct incrementable_traits<projected<I, Proj>>; // since C++20 13176d0caaeSpatrick 13276d0caaeSpatrick// [alg.req.ind.move], concept indirectly_movable 13376d0caaeSpatricktemplate<class In, class Out> 13476d0caaeSpatrick concept indirectly_movable = see below; // since C++20 13576d0caaeSpatrick 13676d0caaeSpatricktemplate<class In, class Out> 13776d0caaeSpatrick concept indirectly_movable_storable = see below; // since C++20 13876d0caaeSpatrick 139*4bdff4beSrobert// [alg.req.ind.copy], concept indirectly_copyable 140*4bdff4beSroberttemplate<class In, class Out> 141*4bdff4beSrobert concept indirectly_copyable = see below; // since C++20 142*4bdff4beSrobert 143*4bdff4beSroberttemplate<class In, class Out> 144*4bdff4beSrobert concept indirectly_copyable_storable = see below; // since C++20 145*4bdff4beSrobert 14676d0caaeSpatrick// [alg.req.ind.swap], concept indirectly_swappable 14776d0caaeSpatricktemplate<class I1, class I2 = I1> 14876d0caaeSpatrick concept indirectly_swappable = see below; // since C++20 14976d0caaeSpatrick 150*4bdff4beSroberttemplate<class I1, class I2, class R, class P1 = identity, 151*4bdff4beSrobert class P2 = identity> 152*4bdff4beSrobert concept indirectly_comparable = 153*4bdff4beSrobert indirect_binary_predicate<R, projected<I1, P1>, projected<I2, P2>>; // since C++20 154*4bdff4beSrobert 155*4bdff4beSrobert// [alg.req.permutable], concept permutable 156*4bdff4beSroberttemplate<class I> 157*4bdff4beSrobert concept permutable = see below; // since C++20 158*4bdff4beSrobert 159*4bdff4beSrobert // [alg.req.mergeable], concept mergeable 160*4bdff4beSroberttemplate<class I1, class I2, class Out, 161*4bdff4beSrobert class R = ranges::less, class P1 = identity, class P2 = identity> 162*4bdff4beSrobert concept mergeable = see below; // since C++20 163*4bdff4beSrobert 164*4bdff4beSrobert// [alg.req.sortable], concept sortable 165*4bdff4beSroberttemplate<class I, class R = ranges::less, class P = identity> 166*4bdff4beSrobert concept sortable = see below; // since C++20 167*4bdff4beSrobert 16876d0caaeSpatricktemplate<input_or_output_iterator I, sentinel_for<I> S> 16976d0caaeSpatrick requires (!same_as<I, S> && copyable<I>) 17076d0caaeSpatrickclass common_iterator; // since C++20 17146035553Spatrick 17246035553Spatricktemplate<class Category, class T, class Distance = ptrdiff_t, 17346035553Spatrick class Pointer = T*, class Reference = T&> 17476d0caaeSpatrickstruct iterator // deprecated in C++17 17546035553Spatrick{ 17646035553Spatrick typedef T value_type; 17746035553Spatrick typedef Distance difference_type; 17846035553Spatrick typedef Pointer pointer; 17946035553Spatrick typedef Reference reference; 18046035553Spatrick typedef Category iterator_category; 18146035553Spatrick}; 18246035553Spatrick 18346035553Spatrickstruct input_iterator_tag {}; 18446035553Spatrickstruct output_iterator_tag {}; 18546035553Spatrickstruct forward_iterator_tag : public input_iterator_tag {}; 18646035553Spatrickstruct bidirectional_iterator_tag : public forward_iterator_tag {}; 18746035553Spatrickstruct random_access_iterator_tag : public bidirectional_iterator_tag {}; 188*4bdff4beSrobertstruct contiguous_iterator_tag : public random_access_iterator_tag {}; 18946035553Spatrick 19046035553Spatrick// 27.4.3, iterator operations 191037e7968Spatricktemplate <class InputIterator, class Distance> // constexpr in C++17 192037e7968Spatrick constexpr void advance(InputIterator& i, Distance n); 19346035553Spatrick 19446035553Spatricktemplate <class InputIterator> // constexpr in C++17 19546035553Spatrick constexpr typename iterator_traits<InputIterator>::difference_type 19646035553Spatrick distance(InputIterator first, InputIterator last); 19746035553Spatrick 19846035553Spatricktemplate <class InputIterator> // constexpr in C++17 19946035553Spatrick constexpr InputIterator next(InputIterator x, 20046035553Spatricktypename iterator_traits<InputIterator>::difference_type n = 1); 20146035553Spatrick 20246035553Spatricktemplate <class BidirectionalIterator> // constexpr in C++17 20346035553Spatrick constexpr BidirectionalIterator prev(BidirectionalIterator x, 20446035553Spatrick typename iterator_traits<BidirectionalIterator>::difference_type n = 1); 20546035553Spatrick 20676d0caaeSpatrick// [range.iter.ops], range iterator operations 20776d0caaeSpatricknamespace ranges { 20876d0caaeSpatrick // [range.iter.op.advance], ranges::advance 20976d0caaeSpatrick template<input_or_output_iterator I> 21076d0caaeSpatrick constexpr void advance(I& i, iter_difference_t<I> n); // since C++20 21176d0caaeSpatrick template<input_or_output_iterator I, sentinel_for<I> S> 21276d0caaeSpatrick constexpr void advance(I& i, S bound); // since C++20 21376d0caaeSpatrick template<input_or_output_iterator I, sentinel_for<I> S> 21476d0caaeSpatrick constexpr iter_difference_t<I> advance(I& i, iter_difference_t<I> n, S bound); // since C++20 21576d0caaeSpatrick} 21676d0caaeSpatrick 21746035553Spatricktemplate <class Iterator> 21846035553Spatrickclass reverse_iterator 21976d0caaeSpatrick : public iterator<typename iterator_traits<Iterator>::iterator_category, // until C++17 22046035553Spatrick typename iterator_traits<Iterator>::value_type, 22146035553Spatrick typename iterator_traits<Iterator>::difference_type, 22246035553Spatrick typename iterator_traits<Iterator>::pointer, 22346035553Spatrick typename iterator_traits<Iterator>::reference> 22446035553Spatrick{ 22546035553Spatrickprotected: 22646035553Spatrick Iterator current; 22746035553Spatrickpublic: 228*4bdff4beSrobert using iterator_type = Iterator; 229*4bdff4beSrobert using iterator_concept = see below; // since C++20 230*4bdff4beSrobert using iterator_category = typename iterator_traits<Iterator>::iterator_category; // since C++17, until C++20 231*4bdff4beSrobert using iterator_category = see below; // since C++20 232*4bdff4beSrobert using value_type = typename iterator_traits<Iterator>::value_type; // since C++17, until C++20 233*4bdff4beSrobert using value_type = iter_value_t<Iterator>; // since C++20 234*4bdff4beSrobert using difference_type = typename iterator_traits<Iterator>::difference_type; // until C++20 235*4bdff4beSrobert using difference_type = iter_difference_t<Iterator>; // since C++20 236*4bdff4beSrobert using pointer = typename iterator_traits<Iterator>::pointer; 237*4bdff4beSrobert using reference = typename iterator_traits<Iterator>::reference; // until C++20 238*4bdff4beSrobert using reference = iter_reference_t<Iterator>; // since C++20 23946035553Spatrick 24046035553Spatrick constexpr reverse_iterator(); 24146035553Spatrick constexpr explicit reverse_iterator(Iterator x); 24246035553Spatrick template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u); 24346035553Spatrick template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); 24446035553Spatrick constexpr Iterator base() const; 24546035553Spatrick constexpr reference operator*() const; 246*4bdff4beSrobert constexpr pointer operator->() const; // until C++20 247*4bdff4beSrobert constexpr pointer operator->() const requires see below; // since C++20 24846035553Spatrick constexpr reverse_iterator& operator++(); 24946035553Spatrick constexpr reverse_iterator operator++(int); 25046035553Spatrick constexpr reverse_iterator& operator--(); 25146035553Spatrick constexpr reverse_iterator operator--(int); 25246035553Spatrick constexpr reverse_iterator operator+ (difference_type n) const; 25346035553Spatrick constexpr reverse_iterator& operator+=(difference_type n); 25446035553Spatrick constexpr reverse_iterator operator- (difference_type n) const; 25546035553Spatrick constexpr reverse_iterator& operator-=(difference_type n); 256*4bdff4beSrobert constexpr unspecified operator[](difference_type n) const; 257*4bdff4beSrobert 258*4bdff4beSrobert friend constexpr iter_rvalue_reference_t<Iterator> 259*4bdff4beSrobert iter_move(const reverse_iterator& i) noexcept(see below); 260*4bdff4beSrobert template<indirectly_swappable<Iterator> Iterator2> 261*4bdff4beSrobert friend constexpr void 262*4bdff4beSrobert iter_swap(const reverse_iterator& x, 263*4bdff4beSrobert const reverse_iterator<Iterator2>& y) noexcept(see below); 26446035553Spatrick}; 26546035553Spatrick 26646035553Spatricktemplate <class Iterator1, class Iterator2> 26746035553Spatrickconstexpr bool // constexpr in C++17 26846035553Spatrickoperator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 26946035553Spatrick 27046035553Spatricktemplate <class Iterator1, class Iterator2> 27146035553Spatrickconstexpr bool // constexpr in C++17 272*4bdff4beSrobertoperator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 27346035553Spatrick 27446035553Spatricktemplate <class Iterator1, class Iterator2> 27546035553Spatrickconstexpr bool // constexpr in C++17 276*4bdff4beSrobertoperator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 27746035553Spatrick 27846035553Spatricktemplate <class Iterator1, class Iterator2> 27946035553Spatrickconstexpr bool // constexpr in C++17 28046035553Spatrickoperator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 28146035553Spatrick 28246035553Spatricktemplate <class Iterator1, class Iterator2> 28346035553Spatrickconstexpr bool // constexpr in C++17 284*4bdff4beSrobertoperator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 28546035553Spatrick 28646035553Spatricktemplate <class Iterator1, class Iterator2> 28746035553Spatrickconstexpr bool // constexpr in C++17 288*4bdff4beSrobertoperator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 289*4bdff4beSrobert 290*4bdff4beSroberttemplate<class Iterator1, three_way_comparable_with<Iterator1> Iterator2> 291*4bdff4beSrobert constexpr compare_three_way_result_t<Iterator1, Iterator2> 292*4bdff4beSrobert operator<=>(const reverse_iterator<Iterator1>& x, 293*4bdff4beSrobert const reverse_iterator<Iterator2>& y); 29446035553Spatrick 29546035553Spatricktemplate <class Iterator1, class Iterator2> 29646035553Spatrickconstexpr auto 29746035553Spatrickoperator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y) 29846035553Spatrick-> decltype(__y.base() - __x.base()); // constexpr in C++17 29946035553Spatrick 30046035553Spatricktemplate <class Iterator> 30146035553Spatrickconstexpr reverse_iterator<Iterator> 30246035553Spatrickoperator+(typename reverse_iterator<Iterator>::difference_type n, 30346035553Spatrick const reverse_iterator<Iterator>& x); // constexpr in C++17 30446035553Spatrick 30546035553Spatricktemplate <class Iterator> 30646035553Spatrickconstexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17 30746035553Spatrick 308*4bdff4beSroberttemplate<class Iterator1, class Iterator2> 309*4bdff4beSrobert requires (!sized_sentinel_for<Iterator1, Iterator2>) 310*4bdff4beSrobert inline constexpr bool disable_sized_sentinel_for<reverse_iterator<Iterator1>, 311*4bdff4beSrobert reverse_iterator<Iterator2>> = true; 312*4bdff4beSrobert 31346035553Spatricktemplate <class Container> 31446035553Spatrickclass back_insert_iterator 31576d0caaeSpatrick : public iterator<output_iterator_tag, void, void, void, void> // until C++17 31646035553Spatrick{ 31746035553Spatrickprotected: 31846035553Spatrick Container* container; 31946035553Spatrickpublic: 32046035553Spatrick typedef Container container_type; 32146035553Spatrick typedef void value_type; 32276d0caaeSpatrick typedef void difference_type; // until C++20 32376d0caaeSpatrick typedef ptrdiff_t difference_type; // since C++20 32446035553Spatrick typedef void reference; 32546035553Spatrick typedef void pointer; 32646035553Spatrick 32776d0caaeSpatrick explicit back_insert_iterator(Container& x); // constexpr in C++20 32876d0caaeSpatrick back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 32976d0caaeSpatrick back_insert_iterator& operator*(); // constexpr in C++20 33076d0caaeSpatrick back_insert_iterator& operator++(); // constexpr in C++20 33176d0caaeSpatrick back_insert_iterator operator++(int); // constexpr in C++20 33246035553Spatrick}; 33346035553Spatrick 33476d0caaeSpatricktemplate <class Container> back_insert_iterator<Container> back_inserter(Container& x); // constexpr in C++20 33546035553Spatrick 33646035553Spatricktemplate <class Container> 33746035553Spatrickclass front_insert_iterator 33876d0caaeSpatrick : public iterator<output_iterator_tag, void, void, void, void> // until C++17 33946035553Spatrick{ 34046035553Spatrickprotected: 34146035553Spatrick Container* container; 34246035553Spatrickpublic: 34346035553Spatrick typedef Container container_type; 34446035553Spatrick typedef void value_type; 34576d0caaeSpatrick typedef void difference_type; // until C++20 34676d0caaeSpatrick typedef ptrdiff_t difference_type; // since C++20 34746035553Spatrick typedef void reference; 34846035553Spatrick typedef void pointer; 34946035553Spatrick 35076d0caaeSpatrick explicit front_insert_iterator(Container& x); // constexpr in C++20 35176d0caaeSpatrick front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 35276d0caaeSpatrick front_insert_iterator& operator*(); // constexpr in C++20 35376d0caaeSpatrick front_insert_iterator& operator++(); // constexpr in C++20 35476d0caaeSpatrick front_insert_iterator operator++(int); // constexpr in C++20 35546035553Spatrick}; 35646035553Spatrick 35776d0caaeSpatricktemplate <class Container> front_insert_iterator<Container> front_inserter(Container& x); // constexpr in C++20 35846035553Spatrick 35946035553Spatricktemplate <class Container> 36046035553Spatrickclass insert_iterator 36176d0caaeSpatrick : public iterator<output_iterator_tag, void, void, void, void> // until C++17 36246035553Spatrick{ 36346035553Spatrickprotected: 36446035553Spatrick Container* container; 36546035553Spatrick typename Container::iterator iter; 36646035553Spatrickpublic: 36746035553Spatrick typedef Container container_type; 36846035553Spatrick typedef void value_type; 36976d0caaeSpatrick typedef void difference_type; // until C++20 37076d0caaeSpatrick typedef ptrdiff_t difference_type; // since C++20 37146035553Spatrick typedef void reference; 37246035553Spatrick typedef void pointer; 37346035553Spatrick 37476d0caaeSpatrick insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20 37576d0caaeSpatrick insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 37676d0caaeSpatrick insert_iterator& operator*(); // constexpr in C++20 37776d0caaeSpatrick insert_iterator& operator++(); // constexpr in C++20 37876d0caaeSpatrick insert_iterator& operator++(int); // constexpr in C++20 37946035553Spatrick}; 38046035553Spatrick 381*4bdff4beSroberttemplate <class Container> 382*4bdff4beSrobertinsert_iterator<Container> inserter(Container& x, typename Container::iterator i); // until C++20 383*4bdff4beSroberttemplate <class Container> 384*4bdff4beSrobertconstexpr insert_iterator<Container> inserter(Container& x, ranges::iterator_t<Container> i); // since C++20 38546035553Spatrick 38646035553Spatricktemplate <class Iterator> 38746035553Spatrickclass move_iterator { 38846035553Spatrickpublic: 389*4bdff4beSrobert using iterator_type = Iterator; 390*4bdff4beSrobert using iterator_concept = input_iterator_tag; // From C++20 391*4bdff4beSrobert using iterator_category = see below; // not always present starting from C++20 392*4bdff4beSrobert using value_type = iter_value_t<Iterator>; // Until C++20, iterator_traits<Iterator>::value_type 393*4bdff4beSrobert using difference_type = iter_difference_t<Iterator>; // Until C++20, iterator_traits<Iterator>::difference_type; 394*4bdff4beSrobert using pointer = Iterator; 395*4bdff4beSrobert using reference = iter_rvalue_reference_t<Iterator>; // Until C++20, value_type&& 39646035553Spatrick 39746035553Spatrick constexpr move_iterator(); // all the constexprs are in C++17 39846035553Spatrick constexpr explicit move_iterator(Iterator i); 39946035553Spatrick template <class U> 40046035553Spatrick constexpr move_iterator(const move_iterator<U>& u); 40146035553Spatrick template <class U> 40246035553Spatrick constexpr move_iterator& operator=(const move_iterator<U>& u); 403*4bdff4beSrobert 404*4bdff4beSrobert constexpr iterator_type base() const; // Until C++20 405*4bdff4beSrobert constexpr const Iterator& base() const & noexcept; // From C++20 406*4bdff4beSrobert constexpr Iterator base() &&; // From C++20 407*4bdff4beSrobert 40846035553Spatrick constexpr reference operator*() const; 409*4bdff4beSrobert constexpr pointer operator->() const; // Deprecated in C++20 41046035553Spatrick constexpr move_iterator& operator++(); 411*4bdff4beSrobert constexpr auto operator++(int); // Return type was move_iterator until C++20 41246035553Spatrick constexpr move_iterator& operator--(); 41346035553Spatrick constexpr move_iterator operator--(int); 41446035553Spatrick constexpr move_iterator operator+(difference_type n) const; 41546035553Spatrick constexpr move_iterator& operator+=(difference_type n); 41646035553Spatrick constexpr move_iterator operator-(difference_type n) const; 41746035553Spatrick constexpr move_iterator& operator-=(difference_type n); 418*4bdff4beSrobert constexpr reference operator[](difference_type n) const; // Return type unspecified until C++20 419*4bdff4beSrobert 420*4bdff4beSrobert template<sentinel_for<Iterator> S> 421*4bdff4beSrobert friend constexpr bool 422*4bdff4beSrobert operator==(const move_iterator& x, const move_sentinel<S>& y); // Since C++20 423*4bdff4beSrobert template<sized_sentinel_for<Iterator> S> 424*4bdff4beSrobert friend constexpr iter_difference_t<Iterator> 425*4bdff4beSrobert operator-(const move_sentinel<S>& x, const move_iterator& y); // Since C++20 426*4bdff4beSrobert template<sized_sentinel_for<Iterator> S> 427*4bdff4beSrobert friend constexpr iter_difference_t<Iterator> 428*4bdff4beSrobert operator-(const move_iterator& x, const move_sentinel<S>& y); // Since C++20 429*4bdff4beSrobert friend constexpr iter_rvalue_reference_t<Iterator> 430*4bdff4beSrobert iter_move(const move_iterator& i) 431*4bdff4beSrobert noexcept(noexcept(ranges::iter_move(i.current))); // Since C++20 432*4bdff4beSrobert template<indirectly_swappable<Iterator> Iterator2> 433*4bdff4beSrobert friend constexpr void 434*4bdff4beSrobert iter_swap(const move_iterator& x, const move_iterator<Iterator2>& y) 435*4bdff4beSrobert noexcept(noexcept(ranges::iter_swap(x.current, y.current))); // Since C++20 436*4bdff4beSrobert 43746035553Spatrickprivate: 43846035553Spatrick Iterator current; // exposition only 43946035553Spatrick}; 44046035553Spatrick 44146035553Spatricktemplate <class Iterator1, class Iterator2> 44246035553Spatrickconstexpr bool // constexpr in C++17 44346035553Spatrickoperator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 44446035553Spatrick 44546035553Spatricktemplate <class Iterator1, class Iterator2> 44646035553Spatrickconstexpr bool // constexpr in C++17 44746035553Spatrickoperator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 44846035553Spatrick 44946035553Spatricktemplate <class Iterator1, class Iterator2> 45046035553Spatrickconstexpr bool // constexpr in C++17 45146035553Spatrickoperator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 45246035553Spatrick 45346035553Spatricktemplate <class Iterator1, class Iterator2> 45446035553Spatrickconstexpr bool // constexpr in C++17 45546035553Spatrickoperator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 45646035553Spatrick 45746035553Spatricktemplate <class Iterator1, class Iterator2> 45846035553Spatrickconstexpr bool // constexpr in C++17 45946035553Spatrickoperator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 46046035553Spatrick 46146035553Spatricktemplate <class Iterator1, class Iterator2> 46246035553Spatrickconstexpr bool // constexpr in C++17 46346035553Spatrickoperator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 46446035553Spatrick 46546035553Spatricktemplate <class Iterator1, class Iterator2> 46646035553Spatrickconstexpr auto // constexpr in C++17 46746035553Spatrickoperator-(const move_iterator<Iterator1>& x, 46846035553Spatrick const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base()); 46946035553Spatrick 47046035553Spatricktemplate <class Iterator> 47146035553Spatrickconstexpr move_iterator<Iterator> operator+( // constexpr in C++17 47246035553Spatrick typename move_iterator<Iterator>::difference_type n, 47346035553Spatrick const move_iterator<Iterator>& x); 47446035553Spatrick 47546035553Spatricktemplate <class Iterator> // constexpr in C++17 47646035553Spatrickconstexpr move_iterator<Iterator> make_move_iterator(const Iterator& i); 47746035553Spatrick 478*4bdff4beSroberttemplate<semiregular S> 479*4bdff4beSrobertclass move_sentinel { 480*4bdff4beSrobertpublic: 481*4bdff4beSrobert constexpr move_sentinel(); 482*4bdff4beSrobert constexpr explicit move_sentinel(S s); 483*4bdff4beSrobert template<class S2> 484*4bdff4beSrobert requires convertible_to<const S2&, S> 485*4bdff4beSrobert constexpr move_sentinel(const move_sentinel<S2>& s); 486*4bdff4beSrobert template<class S2> 487*4bdff4beSrobert requires assignable_from<S&, const S2&> 488*4bdff4beSrobert constexpr move_sentinel& operator=(const move_sentinel<S2>& s); 489*4bdff4beSrobert 490*4bdff4beSrobert constexpr S base() const; 491*4bdff4beSrobertprivate: 492*4bdff4beSrobert S last; // exposition only 493*4bdff4beSrobert}; 494*4bdff4beSrobert 49576d0caaeSpatrick// [default.sentinel], default sentinel 49676d0caaeSpatrickstruct default_sentinel_t; 49776d0caaeSpatrickinline constexpr default_sentinel_t default_sentinel{}; 49876d0caaeSpatrick 49976d0caaeSpatrick// [iterators.counted], counted iterators 50076d0caaeSpatricktemplate<input_or_output_iterator I> class counted_iterator; 50176d0caaeSpatrick 50276d0caaeSpatricktemplate<input_iterator I> 50376d0caaeSpatrick requires see below 50476d0caaeSpatrick struct iterator_traits<counted_iterator<I>>; 50546035553Spatrick 506*4bdff4beSrobert// [unreachable.sentinel], unreachable sentinel 507*4bdff4beSrobertstruct unreachable_sentinel_t; 508*4bdff4beSrobertinline constexpr unreachable_sentinel_t unreachable_sentinel{}; 509*4bdff4beSrobert 51046035553Spatricktemplate <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> 51146035553Spatrickclass istream_iterator 51276d0caaeSpatrick : public iterator<input_iterator_tag, T, Distance, const T*, const T&> // until C++17 51346035553Spatrick{ 51446035553Spatrickpublic: 51576d0caaeSpatrick typedef input_iterator_tag iterator_category; 51676d0caaeSpatrick typedef T value_type; 51776d0caaeSpatrick typedef Distance difference_type; 51876d0caaeSpatrick typedef const T* pointer; 51976d0caaeSpatrick typedef const T& reference; 52076d0caaeSpatrick 52146035553Spatrick typedef charT char_type; 52246035553Spatrick typedef traits traits_type; 52346035553Spatrick typedef basic_istream<charT, traits> istream_type; 52446035553Spatrick 525*4bdff4beSrobert istream_iterator(); // constexpr since C++11 526*4bdff4beSrobert constexpr istream_iterator(default_sentinel_t); // since C++20 52746035553Spatrick istream_iterator(istream_type& s); 52846035553Spatrick istream_iterator(const istream_iterator& x); 52946035553Spatrick ~istream_iterator(); 53046035553Spatrick 53146035553Spatrick const T& operator*() const; 53246035553Spatrick const T* operator->() const; 53346035553Spatrick istream_iterator& operator++(); 53446035553Spatrick istream_iterator operator++(int); 535*4bdff4beSrobert friend bool operator==(const istream_iterator& i, default_sentinel_t); // since C++20 53646035553Spatrick}; 53746035553Spatrick 53846035553Spatricktemplate <class T, class charT, class traits, class Distance> 53946035553Spatrickbool operator==(const istream_iterator<T,charT,traits,Distance>& x, 54046035553Spatrick const istream_iterator<T,charT,traits,Distance>& y); 54146035553Spatricktemplate <class T, class charT, class traits, class Distance> 54246035553Spatrickbool operator!=(const istream_iterator<T,charT,traits,Distance>& x, 543*4bdff4beSrobert const istream_iterator<T,charT,traits,Distance>& y); // until C++20 54446035553Spatrick 54546035553Spatricktemplate <class T, class charT = char, class traits = char_traits<charT> > 54646035553Spatrickclass ostream_iterator 54776d0caaeSpatrick : public iterator<output_iterator_tag, void, void, void, void> // until C++17 54846035553Spatrick{ 54946035553Spatrickpublic: 55076d0caaeSpatrick typedef output_iterator_tag iterator_category; 55176d0caaeSpatrick typedef void value_type; 55276d0caaeSpatrick typedef void difference_type; // until C++20 55376d0caaeSpatrick typedef ptrdiff_t difference_type; // since C++20 55476d0caaeSpatrick typedef void pointer; 55576d0caaeSpatrick typedef void reference; 55676d0caaeSpatrick 55746035553Spatrick typedef charT char_type; 55846035553Spatrick typedef traits traits_type; 55946035553Spatrick typedef basic_ostream<charT,traits> ostream_type; 56046035553Spatrick 56146035553Spatrick ostream_iterator(ostream_type& s); 56246035553Spatrick ostream_iterator(ostream_type& s, const charT* delimiter); 56346035553Spatrick ostream_iterator(const ostream_iterator& x); 56446035553Spatrick ~ostream_iterator(); 56546035553Spatrick ostream_iterator& operator=(const T& value); 56646035553Spatrick 56746035553Spatrick ostream_iterator& operator*(); 56846035553Spatrick ostream_iterator& operator++(); 56946035553Spatrick ostream_iterator& operator++(int); 57046035553Spatrick}; 57146035553Spatrick 57246035553Spatricktemplate<class charT, class traits = char_traits<charT> > 57346035553Spatrickclass istreambuf_iterator 57476d0caaeSpatrick : public iterator<input_iterator_tag, charT, traits::off_type, unspecified, charT> // until C++17 57546035553Spatrick{ 57646035553Spatrickpublic: 57776d0caaeSpatrick typedef input_iterator_tag iterator_category; 57876d0caaeSpatrick typedef charT value_type; 57976d0caaeSpatrick typedef traits::off_type difference_type; 58076d0caaeSpatrick typedef unspecified pointer; 58176d0caaeSpatrick typedef charT reference; 58276d0caaeSpatrick 58346035553Spatrick typedef charT char_type; 58446035553Spatrick typedef traits traits_type; 58576d0caaeSpatrick typedef traits::int_type int_type; 58646035553Spatrick typedef basic_streambuf<charT, traits> streambuf_type; 58746035553Spatrick typedef basic_istream<charT, traits> istream_type; 58846035553Spatrick 589*4bdff4beSrobert istreambuf_iterator() noexcept; // constexpr since C++11 590*4bdff4beSrobert constexpr istreambuf_iterator(default_sentinel_t) noexcept; // since C++20 59146035553Spatrick istreambuf_iterator(istream_type& s) noexcept; 59246035553Spatrick istreambuf_iterator(streambuf_type* s) noexcept; 59346035553Spatrick istreambuf_iterator(a-private-type) noexcept; 59446035553Spatrick 59546035553Spatrick charT operator*() const; 59646035553Spatrick pointer operator->() const; 59746035553Spatrick istreambuf_iterator& operator++(); 59846035553Spatrick a-private-type operator++(int); 59946035553Spatrick 60046035553Spatrick bool equal(const istreambuf_iterator& b) const; 601*4bdff4beSrobert friend bool operator==(const istreambuf_iterator& i, default_sentinel_t s); // since C++20 60246035553Spatrick}; 60346035553Spatrick 60446035553Spatricktemplate <class charT, class traits> 60546035553Spatrickbool operator==(const istreambuf_iterator<charT,traits>& a, 60646035553Spatrick const istreambuf_iterator<charT,traits>& b); 60746035553Spatricktemplate <class charT, class traits> 60846035553Spatrickbool operator!=(const istreambuf_iterator<charT,traits>& a, 609*4bdff4beSrobert const istreambuf_iterator<charT,traits>& b); // until C++20 61046035553Spatrick 61146035553Spatricktemplate <class charT, class traits = char_traits<charT> > 61246035553Spatrickclass ostreambuf_iterator 61376d0caaeSpatrick : public iterator<output_iterator_tag, void, void, void, void> // until C++17 61446035553Spatrick{ 61546035553Spatrickpublic: 61676d0caaeSpatrick typedef output_iterator_tag iterator_category; 61776d0caaeSpatrick typedef void value_type; 61876d0caaeSpatrick typedef void difference_type; // until C++20 61976d0caaeSpatrick typedef ptrdiff_t difference_type; // since C++20 62076d0caaeSpatrick typedef void pointer; 62176d0caaeSpatrick typedef void reference; 62276d0caaeSpatrick 62346035553Spatrick typedef charT char_type; 62446035553Spatrick typedef traits traits_type; 62546035553Spatrick typedef basic_streambuf<charT, traits> streambuf_type; 62646035553Spatrick typedef basic_ostream<charT, traits> ostream_type; 62746035553Spatrick 62846035553Spatrick ostreambuf_iterator(ostream_type& s) noexcept; 62946035553Spatrick ostreambuf_iterator(streambuf_type* s) noexcept; 63046035553Spatrick ostreambuf_iterator& operator=(charT c); 63146035553Spatrick ostreambuf_iterator& operator*(); 63246035553Spatrick ostreambuf_iterator& operator++(); 63346035553Spatrick ostreambuf_iterator& operator++(int); 63446035553Spatrick bool failed() const noexcept; 63546035553Spatrick}; 63646035553Spatrick 63746035553Spatricktemplate <class C> constexpr auto begin(C& c) -> decltype(c.begin()); 63846035553Spatricktemplate <class C> constexpr auto begin(const C& c) -> decltype(c.begin()); 63946035553Spatricktemplate <class C> constexpr auto end(C& c) -> decltype(c.end()); 64046035553Spatricktemplate <class C> constexpr auto end(const C& c) -> decltype(c.end()); 64146035553Spatricktemplate <class T, size_t N> constexpr T* begin(T (&array)[N]); 64246035553Spatricktemplate <class T, size_t N> constexpr T* end(T (&array)[N]); 64346035553Spatrick 64446035553Spatricktemplate <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14 64546035553Spatricktemplate <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14 64646035553Spatricktemplate <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14 64746035553Spatricktemplate <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14 64846035553Spatricktemplate <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14 64946035553Spatricktemplate <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14 65046035553Spatricktemplate <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14 65146035553Spatricktemplate <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14 65246035553Spatricktemplate <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14 65346035553Spatricktemplate <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14 65446035553Spatricktemplate <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 65546035553Spatricktemplate <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14 65646035553Spatrick 65746035553Spatrick// 24.8, container access: 65846035553Spatricktemplate <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17 65946035553Spatricktemplate <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17 66046035553Spatrick 66146035553Spatricktemplate <class C> constexpr auto ssize(const C& c) 66246035553Spatrick -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>; // C++20 66346035553Spatricktemplate <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20 66446035553Spatrick 66546035553Spatricktemplate <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17 66646035553Spatricktemplate <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17 66746035553Spatricktemplate <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17 66846035553Spatricktemplate <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17 66946035553Spatricktemplate <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17 67046035553Spatricktemplate <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17 67146035553Spatricktemplate <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17 67246035553Spatrick 67346035553Spatrick} // std 67446035553Spatrick 67546035553Spatrick*/ 67646035553Spatrick 677*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 67846035553Spatrick#include <__config> 67976d0caaeSpatrick#include <__debug> 68076d0caaeSpatrick#include <__iterator/access.h> 68176d0caaeSpatrick#include <__iterator/advance.h> 68276d0caaeSpatrick#include <__iterator/back_insert_iterator.h> 683*4bdff4beSrobert#include <__iterator/bounded_iter.h> 68476d0caaeSpatrick#include <__iterator/common_iterator.h> 68576d0caaeSpatrick#include <__iterator/concepts.h> 68676d0caaeSpatrick#include <__iterator/counted_iterator.h> 68776d0caaeSpatrick#include <__iterator/data.h> 68876d0caaeSpatrick#include <__iterator/default_sentinel.h> 68976d0caaeSpatrick#include <__iterator/distance.h> 69076d0caaeSpatrick#include <__iterator/empty.h> 69176d0caaeSpatrick#include <__iterator/erase_if_container.h> 69276d0caaeSpatrick#include <__iterator/front_insert_iterator.h> 69376d0caaeSpatrick#include <__iterator/incrementable_traits.h> 694*4bdff4beSrobert#include <__iterator/indirectly_comparable.h> 69576d0caaeSpatrick#include <__iterator/insert_iterator.h> 69676d0caaeSpatrick#include <__iterator/istream_iterator.h> 697*4bdff4beSrobert#include <__iterator/istreambuf_iterator.h> 69876d0caaeSpatrick#include <__iterator/iter_move.h> 69976d0caaeSpatrick#include <__iterator/iter_swap.h> 700*4bdff4beSrobert#include <__iterator/iterator.h> 701*4bdff4beSrobert#include <__iterator/iterator_traits.h> 702*4bdff4beSrobert#include <__iterator/mergeable.h> 70376d0caaeSpatrick#include <__iterator/move_iterator.h> 704*4bdff4beSrobert#include <__iterator/move_sentinel.h> 70576d0caaeSpatrick#include <__iterator/next.h> 70676d0caaeSpatrick#include <__iterator/ostream_iterator.h> 707*4bdff4beSrobert#include <__iterator/ostreambuf_iterator.h> 708*4bdff4beSrobert#include <__iterator/permutable.h> 70976d0caaeSpatrick#include <__iterator/prev.h> 71076d0caaeSpatrick#include <__iterator/projected.h> 71176d0caaeSpatrick#include <__iterator/readable_traits.h> 71276d0caaeSpatrick#include <__iterator/reverse_access.h> 71376d0caaeSpatrick#include <__iterator/reverse_iterator.h> 71476d0caaeSpatrick#include <__iterator/size.h> 715*4bdff4beSrobert#include <__iterator/sortable.h> 716*4bdff4beSrobert#include <__iterator/unreachable_sentinel.h> 71776d0caaeSpatrick#include <__iterator/wrap_iter.h> 71876d0caaeSpatrick#include <__memory/addressof.h> 71976d0caaeSpatrick#include <__memory/pointer_traits.h> 72046035553Spatrick#include <cstddef> 72146035553Spatrick#include <initializer_list> 72246035553Spatrick#include <version> 72346035553Spatrick 724*4bdff4beSrobert// standard-mandated includes 725*4bdff4beSrobert 726*4bdff4beSrobert// [iterator.synopsis] 727*4bdff4beSrobert#include <compare> 728*4bdff4beSrobert#include <concepts> 729*4bdff4beSrobert 73046035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 73146035553Spatrick# pragma GCC system_header 73246035553Spatrick#endif 73346035553Spatrick 734*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 735*4bdff4beSrobert# include <exception> 736*4bdff4beSrobert# include <new> 737*4bdff4beSrobert# include <type_traits> 738*4bdff4beSrobert# include <typeinfo> 739*4bdff4beSrobert# include <utility> 740*4bdff4beSrobert#endif 741*4bdff4beSrobert 74246035553Spatrick#endif // _LIBCPP_ITERATOR 743