1 1.1 joerg // -*- C++ -*- 2 1.1 joerg //===-------------------------- iterator ----------------------------------===// 3 1.1 joerg // 4 1.1 joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5 1.1 joerg // See https://llvm.org/LICENSE.txt for license information. 6 1.1 joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7 1.1 joerg // 8 1.1 joerg //===----------------------------------------------------------------------===// 9 1.1 joerg 10 1.1 joerg #ifndef _LIBCPP_ITERATOR 11 1.1 joerg #define _LIBCPP_ITERATOR 12 1.1 joerg 13 1.1 joerg /* 14 1.1 joerg iterator synopsis 15 1.1 joerg 16 1.1 joerg #include <concepts> 17 1.1 joerg 18 1.1 joerg namespace std 19 1.1 joerg { 20 1.1 joerg template<class> struct incrementable_traits; // since C++20 21 1.1 joerg template<class T> 22 1.1 joerg using iter_difference_t = see below; // since C++20 23 1.1 joerg 24 1.1 joerg template<class> struct indirectly_readable_traits; // since C++20 25 1.1 joerg template<class T> 26 1.1 joerg using iter_value_t = see below; // since C++20 27 1.1 joerg 28 1.1 joerg template<class Iterator> 29 1.1 joerg struct iterator_traits; 30 1.1 joerg 31 1.1 joerg template<class T> 32 1.1 joerg requires is_object_v<T> // since C++20 33 1.1 joerg struct iterator_traits<T*>; 34 1.1 joerg 35 1.1 joerg template<dereferenceable T> 36 1.1 joerg using iter_reference_t = decltype(*declval<T&>()); 37 1.1 joerg 38 1.1 joerg namespace ranges::inline unspecified { 39 1.1 joerg inline constexpr unspecified iter_move = unspecified; // since C++20, nodiscard as an extension 40 1.1 joerg }} 41 1.1 joerg 42 1.1 joerg template<dereferenceable T> 43 1.1 joerg requires ... 44 1.1 joerg using iter_rvalue_reference_t = decltype(ranges::iter_move(declval<T&>())); // since C++20 45 1.1 joerg 46 1.1 joerg // [iterator.concepts], iterator concepts 47 1.1 joerg // [iterator.concept.readable], concept indirectly_readable 48 1.1 joerg template<class In> 49 1.1 joerg concept indirectly_readable = see below; // since C++20 50 1.1 joerg 51 1.1 joerg // [iterator.concept.writable], concept indirectly_writable 52 1.1 joerg template<class Out, class T> 53 1.1 joerg concept indirectly_writable = see below; // since C++20 54 1.1 joerg 55 1.1 joerg // [iterator.concept.winc], concept weakly_incrementable 56 1.1 joerg template<class I> 57 1.1 joerg concept weakly_incrementable = see below; // since C++20 58 1.1 joerg 59 1.1 joerg // [iterator.concept.inc], concept incrementable 60 1.1 joerg template<class I> 61 1.1 joerg concept incrementable = see below; // since C++20 62 1.1 joerg 63 1.1 joerg // [iterator.concept.iterator], concept input_or_output_iterator 64 1.1 joerg template<class I> 65 1.1 joerg concept input_or_output_iterator = see below; // since C++20 66 1.1 joerg 67 1.1 joerg // [iterator.concept.sentinel], concept sentinel_for 68 1.1 joerg template<class S, class I> 69 1.1 joerg concept sentinel_for = see below; // since C++20 70 1.1 joerg 71 1.1 joerg // [iterator.concept.sizedsentinel], concept sized_sentinel_for 72 1.1 joerg template<class S, class I> 73 1.1 joerg inline constexpr bool disable_sized_sentinel_for = false; 74 1.1 joerg 75 1.1 joerg template<class S, class I> 76 1.1 joerg concept sized_sentinel_for = see below; 77 1.1 joerg 78 1.1 joerg // [iterator.concept.input], concept input_iterator 79 1.1 joerg template<class I> 80 1.1 joerg concept input_iterator = see below; // since C++20 81 1.1 joerg 82 1.1 joerg // [iterator.concept.forward], concept forward_iterator 83 1.1 joerg template<class I> 84 1.1 joerg concept forward_iterator = see below; // since C++20 85 1.1 joerg 86 1.1 joerg // [iterator.concept.bidir], concept bidirectional_iterator 87 1.1 joerg template<class I> 88 1.1 joerg concept bidirectional_iterator = see below; // since C++20 89 1.1 joerg 90 1.1 joerg // [iterator.concept.random.access], concept random_access_iterator 91 1.1 joerg template<class I> 92 1.1 joerg concept random_access_iterator = see below; // since C++20 93 1.1 joerg 94 1.1 joerg template<class Category, class T, class Distance = ptrdiff_t, 95 1.1 joerg class Pointer = T*, class Reference = T&> 96 1.1 joerg struct iterator 97 1.1 joerg { 98 1.1 joerg typedef T value_type; 99 1.1 joerg typedef Distance difference_type; 100 1.1 joerg typedef Pointer pointer; 101 1.1 joerg typedef Reference reference; 102 1.1 joerg typedef Category iterator_category; 103 1.1 joerg }; 104 1.1 joerg 105 1.1 joerg struct input_iterator_tag {}; 106 1.1 joerg struct output_iterator_tag {}; 107 1.1 joerg struct forward_iterator_tag : public input_iterator_tag {}; 108 1.1 joerg struct bidirectional_iterator_tag : public forward_iterator_tag {}; 109 1.1 joerg struct random_access_iterator_tag : public bidirectional_iterator_tag {}; 110 1.1 joerg 111 1.1 joerg // 27.4.3, iterator operations 112 1.1 joerg template <class InputIterator, class Distance> // constexpr in C++17 113 1.1 joerg constexpr void advance(InputIterator& i, Distance n); 114 1.1 joerg 115 1.1 joerg template <class InputIterator> // constexpr in C++17 116 1.1 joerg constexpr typename iterator_traits<InputIterator>::difference_type 117 1.1 joerg distance(InputIterator first, InputIterator last); 118 1.1 joerg 119 1.1 joerg template <class InputIterator> // constexpr in C++17 120 1.1 joerg constexpr InputIterator next(InputIterator x, 121 1.1 joerg typename iterator_traits<InputIterator>::difference_type n = 1); 122 1.1 joerg 123 1.1 joerg template <class BidirectionalIterator> // constexpr in C++17 124 1.1 joerg constexpr BidirectionalIterator prev(BidirectionalIterator x, 125 1.1 joerg typename iterator_traits<BidirectionalIterator>::difference_type n = 1); 126 1.1 joerg 127 1.1 joerg template <class Iterator> 128 1.1 joerg class reverse_iterator 129 1.1 joerg : public iterator<typename iterator_traits<Iterator>::iterator_category, 130 1.1 joerg typename iterator_traits<Iterator>::value_type, 131 1.1 joerg typename iterator_traits<Iterator>::difference_type, 132 1.1 joerg typename iterator_traits<Iterator>::pointer, 133 1.1 joerg typename iterator_traits<Iterator>::reference> 134 1.1 joerg { 135 1.1 joerg protected: 136 1.1 joerg Iterator current; 137 1.1 joerg public: 138 1.1 joerg typedef Iterator iterator_type; 139 1.1 joerg typedef typename iterator_traits<Iterator>::difference_type difference_type; 140 1.1 joerg typedef typename iterator_traits<Iterator>::reference reference; 141 1.1 joerg typedef typename iterator_traits<Iterator>::pointer pointer; 142 1.1 joerg 143 1.1 joerg constexpr reverse_iterator(); 144 1.1 joerg constexpr explicit reverse_iterator(Iterator x); 145 1.1 joerg template <class U> constexpr reverse_iterator(const reverse_iterator<U>& u); 146 1.1 joerg template <class U> constexpr reverse_iterator& operator=(const reverse_iterator<U>& u); 147 1.1 joerg constexpr Iterator base() const; 148 1.1 joerg constexpr reference operator*() const; 149 1.1 joerg constexpr pointer operator->() const; 150 1.1 joerg constexpr reverse_iterator& operator++(); 151 1.1 joerg constexpr reverse_iterator operator++(int); 152 1.1 joerg constexpr reverse_iterator& operator--(); 153 1.1 joerg constexpr reverse_iterator operator--(int); 154 1.1 joerg constexpr reverse_iterator operator+ (difference_type n) const; 155 1.1 joerg constexpr reverse_iterator& operator+=(difference_type n); 156 1.1 joerg constexpr reverse_iterator operator- (difference_type n) const; 157 1.1 joerg constexpr reverse_iterator& operator-=(difference_type n); 158 1.1 joerg constexpr reference operator[](difference_type n) const; 159 1.1 joerg }; 160 1.1 joerg 161 1.1 joerg template <class Iterator1, class Iterator2> 162 1.1 joerg constexpr bool // constexpr in C++17 163 1.1 joerg operator==(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 164 1.1 joerg 165 1.1 joerg template <class Iterator1, class Iterator2> 166 1.1 joerg constexpr bool // constexpr in C++17 167 1.1 joerg operator<(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 168 1.1 joerg 169 1.1 joerg template <class Iterator1, class Iterator2> 170 1.1 joerg constexpr bool // constexpr in C++17 171 1.1 joerg operator!=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 172 1.1 joerg 173 1.1 joerg template <class Iterator1, class Iterator2> 174 1.1 joerg constexpr bool // constexpr in C++17 175 1.1 joerg operator>(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 176 1.1 joerg 177 1.1 joerg template <class Iterator1, class Iterator2> 178 1.1 joerg constexpr bool // constexpr in C++17 179 1.1 joerg operator>=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 180 1.1 joerg 181 1.1 joerg template <class Iterator1, class Iterator2> 182 1.1 joerg constexpr bool // constexpr in C++17 183 1.1 joerg operator<=(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y); 184 1.1 joerg 185 1.1 joerg template <class Iterator1, class Iterator2> 186 1.1 joerg constexpr auto 187 1.1 joerg operator-(const reverse_iterator<Iterator1>& x, const reverse_iterator<Iterator2>& y) 188 1.1 joerg -> decltype(__y.base() - __x.base()); // constexpr in C++17 189 1.1 joerg 190 1.1 joerg template <class Iterator> 191 1.1 joerg constexpr reverse_iterator<Iterator> 192 1.1 joerg operator+(typename reverse_iterator<Iterator>::difference_type n, 193 1.1 joerg const reverse_iterator<Iterator>& x); // constexpr in C++17 194 1.1 joerg 195 1.1 joerg template <class Iterator> 196 1.1 joerg constexpr reverse_iterator<Iterator> make_reverse_iterator(Iterator i); // C++14, constexpr in C++17 197 1.1 joerg 198 1.1 joerg template <class Container> 199 1.1 joerg class back_insert_iterator 200 1.1 joerg { 201 1.1 joerg protected: 202 1.1 joerg Container* container; 203 1.1 joerg public: 204 1.1 joerg typedef Container container_type; 205 1.1 joerg typedef void value_type; 206 1.1 joerg typedef void difference_type; 207 1.1 joerg typedef void reference; 208 1.1 joerg typedef void pointer; 209 1.1 joerg 210 1.1 joerg explicit back_insert_iterator(Container& x); // constexpr in C++20 211 1.1 joerg back_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 212 1.1 joerg back_insert_iterator& operator*(); // constexpr in C++20 213 1.1 joerg back_insert_iterator& operator++(); // constexpr in C++20 214 1.1 joerg back_insert_iterator operator++(int); // constexpr in C++20 215 1.1 joerg }; 216 1.1 joerg 217 1.1 joerg template <class Container> back_insert_iterator<Container> back_inserter(Container& x); // constexpr in C++20 218 1.1 joerg 219 1.1 joerg template <class Container> 220 1.1 joerg class front_insert_iterator 221 1.1 joerg { 222 1.1 joerg protected: 223 1.1 joerg Container* container; 224 1.1 joerg public: 225 1.1 joerg typedef Container container_type; 226 1.1 joerg typedef void value_type; 227 1.1 joerg typedef void difference_type; 228 1.1 joerg typedef void reference; 229 1.1 joerg typedef void pointer; 230 1.1 joerg 231 1.1 joerg explicit front_insert_iterator(Container& x); // constexpr in C++20 232 1.1 joerg front_insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 233 1.1 joerg front_insert_iterator& operator*(); // constexpr in C++20 234 1.1 joerg front_insert_iterator& operator++(); // constexpr in C++20 235 1.1 joerg front_insert_iterator operator++(int); // constexpr in C++20 236 1.1 joerg }; 237 1.1 joerg 238 1.1 joerg template <class Container> front_insert_iterator<Container> front_inserter(Container& x); // constexpr in C++20 239 1.1 joerg 240 1.1 joerg template <class Container> 241 1.1 joerg class insert_iterator 242 1.1 joerg { 243 1.1 joerg protected: 244 1.1 joerg Container* container; 245 1.1 joerg typename Container::iterator iter; 246 1.1 joerg public: 247 1.1 joerg typedef Container container_type; 248 1.1 joerg typedef void value_type; 249 1.1 joerg typedef void difference_type; 250 1.1 joerg typedef void reference; 251 1.1 joerg typedef void pointer; 252 1.1 joerg 253 1.1 joerg insert_iterator(Container& x, typename Container::iterator i); // constexpr in C++20 254 1.1 joerg insert_iterator& operator=(const typename Container::value_type& value); // constexpr in C++20 255 1.1 joerg insert_iterator& operator*(); // constexpr in C++20 256 1.1 joerg insert_iterator& operator++(); // constexpr in C++20 257 1.1 joerg insert_iterator& operator++(int); // constexpr in C++20 258 1.1 joerg }; 259 1.1 joerg 260 1.1 joerg template <class Container, class Iterator> 261 1.1 joerg insert_iterator<Container> inserter(Container& x, Iterator i); // constexpr in C++20 262 1.1 joerg 263 1.1 joerg template <class Iterator> 264 1.1 joerg class move_iterator { 265 1.1 joerg public: 266 1.1 joerg typedef Iterator iterator_type; 267 1.1 joerg typedef typename iterator_traits<Iterator>::difference_type difference_type; 268 1.1 joerg typedef Iterator pointer; 269 1.1 joerg typedef typename iterator_traits<Iterator>::value_type value_type; 270 1.1 joerg typedef typename iterator_traits<Iterator>::iterator_category iterator_category; 271 1.1 joerg typedef value_type&& reference; 272 1.1 joerg 273 1.1 joerg constexpr move_iterator(); // all the constexprs are in C++17 274 1.1 joerg constexpr explicit move_iterator(Iterator i); 275 1.1 joerg template <class U> 276 1.1 joerg constexpr move_iterator(const move_iterator<U>& u); 277 1.1 joerg template <class U> 278 1.1 joerg constexpr move_iterator& operator=(const move_iterator<U>& u); 279 1.1 joerg constexpr iterator_type base() const; 280 1.1 joerg constexpr reference operator*() const; 281 1.1 joerg constexpr pointer operator->() const; 282 1.1 joerg constexpr move_iterator& operator++(); 283 1.1 joerg constexpr move_iterator operator++(int); 284 1.1 joerg constexpr move_iterator& operator--(); 285 1.1 joerg constexpr move_iterator operator--(int); 286 1.1 joerg constexpr move_iterator operator+(difference_type n) const; 287 1.1 joerg constexpr move_iterator& operator+=(difference_type n); 288 1.1 joerg constexpr move_iterator operator-(difference_type n) const; 289 1.1 joerg constexpr move_iterator& operator-=(difference_type n); 290 1.1 joerg constexpr unspecified operator[](difference_type n) const; 291 1.1 joerg private: 292 1.1 joerg Iterator current; // exposition only 293 1.1 joerg }; 294 1.1 joerg 295 1.1 joerg template <class Iterator1, class Iterator2> 296 1.1 joerg constexpr bool // constexpr in C++17 297 1.1 joerg operator==(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 298 1.1 joerg 299 1.1 joerg template <class Iterator1, class Iterator2> 300 1.1 joerg constexpr bool // constexpr in C++17 301 1.1 joerg operator!=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 302 1.1 joerg 303 1.1 joerg template <class Iterator1, class Iterator2> 304 1.1 joerg constexpr bool // constexpr in C++17 305 1.1 joerg operator<(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 306 1.1 joerg 307 1.1 joerg template <class Iterator1, class Iterator2> 308 1.1 joerg constexpr bool // constexpr in C++17 309 1.1 joerg operator<=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 310 1.1 joerg 311 1.1 joerg template <class Iterator1, class Iterator2> 312 1.1 joerg constexpr bool // constexpr in C++17 313 1.1 joerg operator>(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 314 1.1 joerg 315 1.1 joerg template <class Iterator1, class Iterator2> 316 1.1 joerg constexpr bool // constexpr in C++17 317 1.1 joerg operator>=(const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y); 318 1.1 joerg 319 1.1 joerg template <class Iterator1, class Iterator2> 320 1.1 joerg constexpr auto // constexpr in C++17 321 1.1 joerg operator-(const move_iterator<Iterator1>& x, 322 1.1 joerg const move_iterator<Iterator2>& y) -> decltype(x.base() - y.base()); 323 1.1 joerg 324 1.1 joerg template <class Iterator> 325 1.1 joerg constexpr move_iterator<Iterator> operator+( // constexpr in C++17 326 1.1 joerg typename move_iterator<Iterator>::difference_type n, 327 1.1 joerg const move_iterator<Iterator>& x); 328 1.1 joerg 329 1.1 joerg template <class Iterator> // constexpr in C++17 330 1.1 joerg constexpr move_iterator<Iterator> make_move_iterator(const Iterator& i); 331 1.1 joerg 332 1.1 joerg 333 1.1 joerg template <class T, class charT = char, class traits = char_traits<charT>, class Distance = ptrdiff_t> 334 1.1 joerg class istream_iterator 335 1.1 joerg : public iterator<input_iterator_tag, T, Distance, const T*, const T&> 336 1.1 joerg { 337 1.1 joerg public: 338 1.1 joerg typedef charT char_type; 339 1.1 joerg typedef traits traits_type; 340 1.1 joerg typedef basic_istream<charT,traits> istream_type; 341 1.1 joerg 342 1.1 joerg constexpr istream_iterator(); 343 1.1 joerg istream_iterator(istream_type& s); 344 1.1 joerg istream_iterator(const istream_iterator& x); 345 1.1 joerg ~istream_iterator(); 346 1.1 joerg 347 1.1 joerg const T& operator*() const; 348 1.1 joerg const T* operator->() const; 349 1.1 joerg istream_iterator& operator++(); 350 1.1 joerg istream_iterator operator++(int); 351 1.1 joerg }; 352 1.1 joerg 353 1.1 joerg template <class T, class charT, class traits, class Distance> 354 1.1 joerg bool operator==(const istream_iterator<T,charT,traits,Distance>& x, 355 1.1 joerg const istream_iterator<T,charT,traits,Distance>& y); 356 1.1 joerg template <class T, class charT, class traits, class Distance> 357 1.1 joerg bool operator!=(const istream_iterator<T,charT,traits,Distance>& x, 358 1.1 joerg const istream_iterator<T,charT,traits,Distance>& y); 359 1.1 joerg 360 1.1 joerg template <class T, class charT = char, class traits = char_traits<charT> > 361 1.1 joerg class ostream_iterator 362 1.1 joerg : public iterator<output_iterator_tag, void, void, void ,void> 363 1.1 joerg { 364 1.1 joerg public: 365 1.1 joerg typedef charT char_type; 366 1.1 joerg typedef traits traits_type; 367 1.1 joerg typedef basic_ostream<charT,traits> ostream_type; 368 1.1 joerg 369 1.1 joerg ostream_iterator(ostream_type& s); 370 1.1 joerg ostream_iterator(ostream_type& s, const charT* delimiter); 371 1.1 joerg ostream_iterator(const ostream_iterator& x); 372 1.1 joerg ~ostream_iterator(); 373 1.1 joerg ostream_iterator& operator=(const T& value); 374 1.1 joerg 375 1.1 joerg ostream_iterator& operator*(); 376 1.1 joerg ostream_iterator& operator++(); 377 1.1 joerg ostream_iterator& operator++(int); 378 1.1 joerg }; 379 1.1 joerg 380 1.1 joerg template<class charT, class traits = char_traits<charT> > 381 1.1 joerg class istreambuf_iterator 382 1.1 joerg : public iterator<input_iterator_tag, charT, 383 1.1 joerg typename traits::off_type, unspecified, 384 1.1 joerg charT> 385 1.1 joerg { 386 1.1 joerg public: 387 1.1 joerg typedef charT char_type; 388 1.1 joerg typedef traits traits_type; 389 1.1 joerg typedef typename traits::int_type int_type; 390 1.1 joerg typedef basic_streambuf<charT,traits> streambuf_type; 391 1.1 joerg typedef basic_istream<charT,traits> istream_type; 392 1.1 joerg 393 1.1 joerg istreambuf_iterator() noexcept; 394 1.1 joerg istreambuf_iterator(istream_type& s) noexcept; 395 1.1 joerg istreambuf_iterator(streambuf_type* s) noexcept; 396 1.1 joerg istreambuf_iterator(a-private-type) noexcept; 397 1.1 joerg 398 1.1 joerg charT operator*() const; 399 1.1 joerg pointer operator->() const; 400 1.1 joerg istreambuf_iterator& operator++(); 401 1.1 joerg a-private-type operator++(int); 402 1.1 joerg 403 1.1 joerg bool equal(const istreambuf_iterator& b) const; 404 1.1 joerg }; 405 1.1 joerg 406 1.1 joerg template <class charT, class traits> 407 1.1 joerg bool operator==(const istreambuf_iterator<charT,traits>& a, 408 1.1 joerg const istreambuf_iterator<charT,traits>& b); 409 1.1 joerg template <class charT, class traits> 410 1.1 joerg bool operator!=(const istreambuf_iterator<charT,traits>& a, 411 1.1 joerg const istreambuf_iterator<charT,traits>& b); 412 1.1 joerg 413 1.1 joerg template <class charT, class traits = char_traits<charT> > 414 1.1 joerg class ostreambuf_iterator 415 1.1 joerg : public iterator<output_iterator_tag, void, void, void, void> 416 1.1 joerg { 417 1.1 joerg public: 418 1.1 joerg typedef charT char_type; 419 1.1 joerg typedef traits traits_type; 420 1.1 joerg typedef basic_streambuf<charT,traits> streambuf_type; 421 1.1 joerg typedef basic_ostream<charT,traits> ostream_type; 422 1.1 joerg 423 1.1 joerg ostreambuf_iterator(ostream_type& s) noexcept; 424 1.1 joerg ostreambuf_iterator(streambuf_type* s) noexcept; 425 1.1 joerg ostreambuf_iterator& operator=(charT c); 426 1.1 joerg ostreambuf_iterator& operator*(); 427 1.1 joerg ostreambuf_iterator& operator++(); 428 1.1 joerg ostreambuf_iterator& operator++(int); 429 1.1 joerg bool failed() const noexcept; 430 1.1 joerg }; 431 1.1 joerg 432 1.1 joerg template <class C> constexpr auto begin(C& c) -> decltype(c.begin()); 433 1.1 joerg template <class C> constexpr auto begin(const C& c) -> decltype(c.begin()); 434 1.1 joerg template <class C> constexpr auto end(C& c) -> decltype(c.end()); 435 1.1 joerg template <class C> constexpr auto end(const C& c) -> decltype(c.end()); 436 1.1 joerg template <class T, size_t N> constexpr T* begin(T (&array)[N]); 437 1.1 joerg template <class T, size_t N> constexpr T* end(T (&array)[N]); 438 1.1 joerg 439 1.1 joerg template <class C> auto constexpr cbegin(const C& c) -> decltype(std::begin(c)); // C++14 440 1.1 joerg template <class C> auto constexpr cend(const C& c) -> decltype(std::end(c)); // C++14 441 1.1 joerg template <class C> auto constexpr rbegin(C& c) -> decltype(c.rbegin()); // C++14 442 1.1 joerg template <class C> auto constexpr rbegin(const C& c) -> decltype(c.rbegin()); // C++14 443 1.1 joerg template <class C> auto constexpr rend(C& c) -> decltype(c.rend()); // C++14 444 1.1 joerg template <class C> constexpr auto rend(const C& c) -> decltype(c.rend()); // C++14 445 1.1 joerg template <class E> reverse_iterator<const E*> constexpr rbegin(initializer_list<E> il); // C++14 446 1.1 joerg template <class E> reverse_iterator<const E*> constexpr rend(initializer_list<E> il); // C++14 447 1.1 joerg template <class T, size_t N> reverse_iterator<T*> constexpr rbegin(T (&array)[N]); // C++14 448 1.1 joerg template <class T, size_t N> reverse_iterator<T*> constexpr rend(T (&array)[N]); // C++14 449 1.1 joerg template <class C> constexpr auto crbegin(const C& c) -> decltype(std::rbegin(c)); // C++14 450 1.1 joerg template <class C> constexpr auto crend(const C& c) -> decltype(std::rend(c)); // C++14 451 1.1 joerg 452 1.1 joerg // 24.8, container access: 453 1.1 joerg template <class C> constexpr auto size(const C& c) -> decltype(c.size()); // C++17 454 1.1 joerg template <class T, size_t N> constexpr size_t size(const T (&array)[N]) noexcept; // C++17 455 1.1 joerg 456 1.1 joerg template <class C> constexpr auto ssize(const C& c) 457 1.1 joerg -> common_type_t<ptrdiff_t, make_signed_t<decltype(c.size())>>; // C++20 458 1.1 joerg template <class T, ptrdiff_t> constexpr ptrdiff_t ssize(const T (&array)[N]) noexcept; // C++20 459 1.1 joerg 460 1.1 joerg template <class C> constexpr auto empty(const C& c) -> decltype(c.empty()); // C++17 461 1.1 joerg template <class T, size_t N> constexpr bool empty(const T (&array)[N]) noexcept; // C++17 462 1.1 joerg template <class E> constexpr bool empty(initializer_list<E> il) noexcept; // C++17 463 1.1 joerg template <class C> constexpr auto data(C& c) -> decltype(c.data()); // C++17 464 1.1 joerg template <class C> constexpr auto data(const C& c) -> decltype(c.data()); // C++17 465 1.1 joerg template <class T, size_t N> constexpr T* data(T (&array)[N]) noexcept; // C++17 466 1.1 joerg template <class E> constexpr const E* data(initializer_list<E> il) noexcept; // C++17 467 1.1 joerg 468 1.1 joerg } // std 469 1.1 joerg 470 1.1 joerg */ 471 1.1 joerg 472 1.1 joerg #include <__config> 473 1.1 joerg #include <__debug> 474 1.1 joerg #include <__functional_base> 475 1.1 joerg #include <__iterator/concepts.h> 476 1.1 joerg #include <__iterator/incrementable_traits.h> 477 1.1 joerg #include <__iterator/iter_move.h> 478 1.1 joerg #include <__iterator/iterator_traits.h> 479 1.1 joerg #include <__iterator/readable_traits.h> 480 1.1 joerg #include <__memory/addressof.h> 481 1.1 joerg #include <__memory/pointer_traits.h> 482 1.1 joerg #include <compare> 483 1.1 joerg #include <concepts> // Mandated by the Standard. 484 1.1 joerg #include <cstddef> 485 1.1 joerg #include <initializer_list> 486 1.1 joerg #include <iosfwd> // for forward declarations of vector and string 487 1.1 joerg #include <type_traits> 488 1.1 joerg #include <version> 489 1.1 joerg 490 1.1 joerg #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 491 1.1 joerg #pragma GCC system_header 492 1.1 joerg #endif 493 1.1 joerg 494 1.1 joerg _LIBCPP_BEGIN_NAMESPACE_STD 495 1.1 joerg 496 1.1 joerg template<class _Category, class _Tp, class _Distance = ptrdiff_t, 497 1.1 joerg class _Pointer = _Tp*, class _Reference = _Tp&> 498 1.1 joerg struct _LIBCPP_TEMPLATE_VIS iterator 499 1.1 joerg { 500 1.1 joerg typedef _Tp value_type; 501 1.1 joerg typedef _Distance difference_type; 502 1.1 joerg typedef _Pointer pointer; 503 1.1 joerg typedef _Reference reference; 504 1.1 joerg typedef _Category iterator_category; 505 1.1 joerg }; 506 1.1 joerg 507 1.1 joerg template <class _InputIter> 508 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 509 1.1 joerg void __advance(_InputIter& __i, 510 1.1 joerg typename iterator_traits<_InputIter>::difference_type __n, input_iterator_tag) 511 1.1 joerg { 512 1.1 joerg for (; __n > 0; --__n) 513 1.1 joerg ++__i; 514 1.1 joerg } 515 1.1 joerg 516 1.1 joerg template <class _BiDirIter> 517 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 518 1.1 joerg void __advance(_BiDirIter& __i, 519 1.1 joerg typename iterator_traits<_BiDirIter>::difference_type __n, bidirectional_iterator_tag) 520 1.1 joerg { 521 1.1 joerg if (__n >= 0) 522 1.1 joerg for (; __n > 0; --__n) 523 1.1 joerg ++__i; 524 1.1 joerg else 525 1.1 joerg for (; __n < 0; ++__n) 526 1.1 joerg --__i; 527 1.1 joerg } 528 1.1 joerg 529 1.1 joerg template <class _RandIter> 530 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 531 1.1 joerg void __advance(_RandIter& __i, 532 1.1 joerg typename iterator_traits<_RandIter>::difference_type __n, random_access_iterator_tag) 533 1.1 joerg { 534 1.1 joerg __i += __n; 535 1.1 joerg } 536 1.1 joerg 537 1.1 joerg template <class _InputIter, class _Distance> 538 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 539 1.1 joerg void advance(_InputIter& __i, _Distance __orig_n) 540 1.1 joerg { 541 1.1 joerg typedef decltype(_VSTD::__convert_to_integral(__orig_n)) _IntegralSize; 542 1.1 joerg _IntegralSize __n = __orig_n; 543 1.1 joerg _LIBCPP_ASSERT(__n >= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, 544 1.1 joerg "Attempt to advance(it, n) with negative n on a non-bidirectional iterator"); 545 1.1 joerg _VSTD::__advance(__i, __n, typename iterator_traits<_InputIter>::iterator_category()); 546 1.1 joerg } 547 1.1 joerg 548 1.1 joerg template <class _InputIter> 549 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 550 1.1 joerg typename iterator_traits<_InputIter>::difference_type 551 1.1 joerg __distance(_InputIter __first, _InputIter __last, input_iterator_tag) 552 1.1 joerg { 553 1.1 joerg typename iterator_traits<_InputIter>::difference_type __r(0); 554 1.1 joerg for (; __first != __last; ++__first) 555 1.1 joerg ++__r; 556 1.1 joerg return __r; 557 1.1 joerg } 558 1.1 joerg 559 1.1 joerg template <class _RandIter> 560 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 561 1.1 joerg typename iterator_traits<_RandIter>::difference_type 562 1.1 joerg __distance(_RandIter __first, _RandIter __last, random_access_iterator_tag) 563 1.1 joerg { 564 1.1 joerg return __last - __first; 565 1.1 joerg } 566 1.1 joerg 567 1.1 joerg template <class _InputIter> 568 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 569 1.1 joerg typename iterator_traits<_InputIter>::difference_type 570 1.1 joerg distance(_InputIter __first, _InputIter __last) 571 1.1 joerg { 572 1.1 joerg return _VSTD::__distance(__first, __last, typename iterator_traits<_InputIter>::iterator_category()); 573 1.1 joerg } 574 1.1 joerg 575 1.1 joerg template <class _InputIter> 576 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 577 1.1 joerg typename enable_if 578 1.1 joerg < 579 1.1 joerg __is_cpp17_input_iterator<_InputIter>::value, 580 1.1 joerg _InputIter 581 1.1 joerg >::type 582 1.1 joerg next(_InputIter __x, 583 1.1 joerg typename iterator_traits<_InputIter>::difference_type __n = 1) 584 1.1 joerg { 585 1.1 joerg _LIBCPP_ASSERT(__n >= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, 586 1.1 joerg "Attempt to next(it, n) with negative n on a non-bidirectional iterator"); 587 1.1 joerg 588 1.1 joerg _VSTD::advance(__x, __n); 589 1.1 joerg return __x; 590 1.1 joerg } 591 1.1 joerg 592 1.1 joerg template <class _InputIter> 593 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 594 1.1 joerg typename enable_if 595 1.1 joerg < 596 1.1 joerg __is_cpp17_input_iterator<_InputIter>::value, 597 1.1 joerg _InputIter 598 1.1 joerg >::type 599 1.1 joerg prev(_InputIter __x, 600 1.1 joerg typename iterator_traits<_InputIter>::difference_type __n = 1) 601 1.1 joerg { 602 1.1 joerg _LIBCPP_ASSERT(__n <= 0 || __is_cpp17_bidirectional_iterator<_InputIter>::value, 603 1.1 joerg "Attempt to prev(it, n) with a positive n on a non-bidirectional iterator"); 604 1.1 joerg _VSTD::advance(__x, -__n); 605 1.1 joerg return __x; 606 1.1 joerg } 607 1.1 joerg 608 1.1 joerg 609 1.1 joerg template <class _Tp, class = void> 610 1.1 joerg struct __is_stashing_iterator : false_type {}; 611 1.1 joerg 612 1.1 joerg template <class _Tp> 613 1.1 joerg struct __is_stashing_iterator<_Tp, typename __void_t<typename _Tp::__stashing_iterator_tag>::type> 614 1.1 joerg : true_type {}; 615 1.1 joerg 616 1.1 joerg template <class _Iter> 617 1.1 joerg class _LIBCPP_TEMPLATE_VIS reverse_iterator 618 1.1 joerg : public iterator<typename iterator_traits<_Iter>::iterator_category, 619 1.1 joerg typename iterator_traits<_Iter>::value_type, 620 1.1 joerg typename iterator_traits<_Iter>::difference_type, 621 1.1 joerg typename iterator_traits<_Iter>::pointer, 622 1.1 joerg typename iterator_traits<_Iter>::reference> 623 1.1 joerg { 624 1.1 joerg private: 625 1.1 joerg /*mutable*/ _Iter __t; // no longer used as of LWG #2360, not removed due to ABI break 626 1.1 joerg 627 1.1 joerg static_assert(!__is_stashing_iterator<_Iter>::value, 628 1.1 joerg "The specified iterator type cannot be used with reverse_iterator; " 629 1.1 joerg "Using stashing iterators with reverse_iterator causes undefined behavior"); 630 1.1 joerg 631 1.1 joerg protected: 632 1.1 joerg _Iter current; 633 1.1 joerg public: 634 1.1 joerg typedef _Iter iterator_type; 635 1.1 joerg typedef typename iterator_traits<_Iter>::difference_type difference_type; 636 1.1 joerg typedef typename iterator_traits<_Iter>::reference reference; 637 1.1 joerg typedef typename iterator_traits<_Iter>::pointer pointer; 638 1.1 joerg typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, 639 1.1 joerg random_access_iterator_tag, 640 1.1 joerg typename iterator_traits<_Iter>::iterator_category> iterator_category; 641 1.1 joerg #if _LIBCPP_STD_VER > 17 642 1.1 joerg typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, 643 1.1 joerg random_access_iterator_tag, 644 1.1 joerg bidirectional_iterator_tag> iterator_concept; 645 1.1 joerg #endif 646 1.1 joerg 647 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 648 1.1 joerg reverse_iterator() : __t(), current() {} 649 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 650 1.1 joerg explicit reverse_iterator(_Iter __x) : __t(__x), current(__x) {} 651 1.1 joerg template <class _Up> 652 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 653 1.1 joerg reverse_iterator(const reverse_iterator<_Up>& __u) : __t(__u.base()), current(__u.base()) {} 654 1.1 joerg template <class _Up> 655 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 656 1.1 joerg reverse_iterator& operator=(const reverse_iterator<_Up>& __u) 657 1.1 joerg { __t = current = __u.base(); return *this; } 658 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 659 1.1 joerg _Iter base() const {return current;} 660 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 661 1.1 joerg reference operator*() const {_Iter __tmp = current; return *--__tmp;} 662 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 663 1.1 joerg pointer operator->() const {return _VSTD::addressof(operator*());} 664 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 665 1.1 joerg reverse_iterator& operator++() {--current; return *this;} 666 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 667 1.1 joerg reverse_iterator operator++(int) {reverse_iterator __tmp(*this); --current; return __tmp;} 668 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 669 1.1 joerg reverse_iterator& operator--() {++current; return *this;} 670 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 671 1.1 joerg reverse_iterator operator--(int) {reverse_iterator __tmp(*this); ++current; return __tmp;} 672 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 673 1.1 joerg reverse_iterator operator+ (difference_type __n) const {return reverse_iterator(current - __n);} 674 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 675 1.1 joerg reverse_iterator& operator+=(difference_type __n) {current -= __n; return *this;} 676 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 677 1.1 joerg reverse_iterator operator- (difference_type __n) const {return reverse_iterator(current + __n);} 678 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 679 1.1 joerg reverse_iterator& operator-=(difference_type __n) {current += __n; return *this;} 680 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 681 1.1 joerg reference operator[](difference_type __n) const {return *(*this + __n);} 682 1.1 joerg }; 683 1.1 joerg 684 1.1 joerg template <class _Iter1, class _Iter2> 685 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 686 1.1 joerg bool 687 1.1 joerg operator==(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 688 1.1 joerg { 689 1.1 joerg return __x.base() == __y.base(); 690 1.1 joerg } 691 1.1 joerg 692 1.1 joerg template <class _Iter1, class _Iter2> 693 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 694 1.1 joerg bool 695 1.1 joerg operator<(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 696 1.1 joerg { 697 1.1 joerg return __x.base() > __y.base(); 698 1.1 joerg } 699 1.1 joerg 700 1.1 joerg template <class _Iter1, class _Iter2> 701 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 702 1.1 joerg bool 703 1.1 joerg operator!=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 704 1.1 joerg { 705 1.1 joerg return __x.base() != __y.base(); 706 1.1 joerg } 707 1.1 joerg 708 1.1 joerg template <class _Iter1, class _Iter2> 709 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 710 1.1 joerg bool 711 1.1 joerg operator>(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 712 1.1 joerg { 713 1.1 joerg return __x.base() < __y.base(); 714 1.1 joerg } 715 1.1 joerg 716 1.1 joerg template <class _Iter1, class _Iter2> 717 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 718 1.1 joerg bool 719 1.1 joerg operator>=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 720 1.1 joerg { 721 1.1 joerg return __x.base() <= __y.base(); 722 1.1 joerg } 723 1.1 joerg 724 1.1 joerg template <class _Iter1, class _Iter2> 725 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 726 1.1 joerg bool 727 1.1 joerg operator<=(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 728 1.1 joerg { 729 1.1 joerg return __x.base() >= __y.base(); 730 1.1 joerg } 731 1.1 joerg 732 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 733 1.1 joerg template <class _Iter1, class _Iter2> 734 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 735 1.1 joerg auto 736 1.1 joerg operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 737 1.1 joerg -> decltype(__y.base() - __x.base()) 738 1.1 joerg { 739 1.1 joerg return __y.base() - __x.base(); 740 1.1 joerg } 741 1.1 joerg #else 742 1.1 joerg template <class _Iter1, class _Iter2> 743 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 744 1.1 joerg typename reverse_iterator<_Iter1>::difference_type 745 1.1 joerg operator-(const reverse_iterator<_Iter1>& __x, const reverse_iterator<_Iter2>& __y) 746 1.1 joerg { 747 1.1 joerg return __y.base() - __x.base(); 748 1.1 joerg } 749 1.1 joerg #endif 750 1.1 joerg 751 1.1 joerg template <class _Iter> 752 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 753 1.1 joerg reverse_iterator<_Iter> 754 1.1 joerg operator+(typename reverse_iterator<_Iter>::difference_type __n, const reverse_iterator<_Iter>& __x) 755 1.1 joerg { 756 1.1 joerg return reverse_iterator<_Iter>(__x.base() - __n); 757 1.1 joerg } 758 1.1 joerg 759 1.1 joerg #if _LIBCPP_STD_VER > 11 760 1.1 joerg template <class _Iter> 761 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 762 1.1 joerg reverse_iterator<_Iter> make_reverse_iterator(_Iter __i) 763 1.1 joerg { 764 1.1 joerg return reverse_iterator<_Iter>(__i); 765 1.1 joerg } 766 1.1 joerg #endif 767 1.1 joerg 768 1.1 joerg template <class _Container> 769 1.1 joerg class _LIBCPP_TEMPLATE_VIS back_insert_iterator 770 1.1 joerg : public iterator<output_iterator_tag, 771 1.1 joerg void, 772 1.1 joerg void, 773 1.1 joerg void, 774 1.1 joerg void> 775 1.1 joerg { 776 1.1 joerg protected: 777 1.1 joerg _Container* container; 778 1.1 joerg public: 779 1.1 joerg typedef _Container container_type; 780 1.1 joerg 781 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit back_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} 782 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator=(const typename _Container::value_type& __value_) 783 1.1 joerg {container->push_back(__value_); return *this;} 784 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 785 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator=(typename _Container::value_type&& __value_) 786 1.1 joerg {container->push_back(_VSTD::move(__value_)); return *this;} 787 1.1 joerg #endif // _LIBCPP_CXX03_LANG 788 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator*() {return *this;} 789 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator& operator++() {return *this;} 790 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 back_insert_iterator operator++(int) {return *this;} 791 1.1 joerg }; 792 1.1 joerg 793 1.1 joerg template <class _Container> 794 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 795 1.1 joerg back_insert_iterator<_Container> 796 1.1 joerg back_inserter(_Container& __x) 797 1.1 joerg { 798 1.1 joerg return back_insert_iterator<_Container>(__x); 799 1.1 joerg } 800 1.1 joerg 801 1.1 joerg template <class _Container> 802 1.1 joerg class _LIBCPP_TEMPLATE_VIS front_insert_iterator 803 1.1 joerg : public iterator<output_iterator_tag, 804 1.1 joerg void, 805 1.1 joerg void, 806 1.1 joerg void, 807 1.1 joerg void> 808 1.1 joerg { 809 1.1 joerg protected: 810 1.1 joerg _Container* container; 811 1.1 joerg public: 812 1.1 joerg typedef _Container container_type; 813 1.1 joerg 814 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 explicit front_insert_iterator(_Container& __x) : container(_VSTD::addressof(__x)) {} 815 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator=(const typename _Container::value_type& __value_) 816 1.1 joerg {container->push_front(__value_); return *this;} 817 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 818 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator=(typename _Container::value_type&& __value_) 819 1.1 joerg {container->push_front(_VSTD::move(__value_)); return *this;} 820 1.1 joerg #endif // _LIBCPP_CXX03_LANG 821 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator*() {return *this;} 822 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator& operator++() {return *this;} 823 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 front_insert_iterator operator++(int) {return *this;} 824 1.1 joerg }; 825 1.1 joerg 826 1.1 joerg template <class _Container> 827 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 828 1.1 joerg front_insert_iterator<_Container> 829 1.1 joerg front_inserter(_Container& __x) 830 1.1 joerg { 831 1.1 joerg return front_insert_iterator<_Container>(__x); 832 1.1 joerg } 833 1.1 joerg 834 1.1 joerg template <class _Container> 835 1.1 joerg class _LIBCPP_TEMPLATE_VIS insert_iterator 836 1.1 joerg : public iterator<output_iterator_tag, 837 1.1 joerg void, 838 1.1 joerg void, 839 1.1 joerg void, 840 1.1 joerg void> 841 1.1 joerg { 842 1.1 joerg protected: 843 1.1 joerg _Container* container; 844 1.1 joerg typename _Container::iterator iter; 845 1.1 joerg public: 846 1.1 joerg typedef _Container container_type; 847 1.1 joerg 848 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator(_Container& __x, typename _Container::iterator __i) 849 1.1 joerg : container(_VSTD::addressof(__x)), iter(__i) {} 850 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator=(const typename _Container::value_type& __value_) 851 1.1 joerg {iter = container->insert(iter, __value_); ++iter; return *this;} 852 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 853 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator=(typename _Container::value_type&& __value_) 854 1.1 joerg {iter = container->insert(iter, _VSTD::move(__value_)); ++iter; return *this;} 855 1.1 joerg #endif // _LIBCPP_CXX03_LANG 856 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator*() {return *this;} 857 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator++() {return *this;} 858 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 insert_iterator& operator++(int) {return *this;} 859 1.1 joerg }; 860 1.1 joerg 861 1.1 joerg template <class _Container> 862 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 863 1.1 joerg insert_iterator<_Container> 864 1.1 joerg inserter(_Container& __x, typename _Container::iterator __i) 865 1.1 joerg { 866 1.1 joerg return insert_iterator<_Container>(__x, __i); 867 1.1 joerg } 868 1.1 joerg 869 1.1 joerg template <class _Tp, class _CharT = char, 870 1.1 joerg class _Traits = char_traits<_CharT>, class _Distance = ptrdiff_t> 871 1.1 joerg class _LIBCPP_TEMPLATE_VIS istream_iterator 872 1.1 joerg : public iterator<input_iterator_tag, _Tp, _Distance, const _Tp*, const _Tp&> 873 1.1 joerg { 874 1.1 joerg public: 875 1.1 joerg typedef _CharT char_type; 876 1.1 joerg typedef _Traits traits_type; 877 1.1 joerg typedef basic_istream<_CharT,_Traits> istream_type; 878 1.1 joerg private: 879 1.1 joerg istream_type* __in_stream_; 880 1.1 joerg _Tp __value_; 881 1.1 joerg public: 882 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istream_iterator() : __in_stream_(nullptr), __value_() {} 883 1.1 joerg _LIBCPP_INLINE_VISIBILITY istream_iterator(istream_type& __s) : __in_stream_(_VSTD::addressof(__s)) 884 1.1 joerg { 885 1.1 joerg if (!(*__in_stream_ >> __value_)) 886 1.1 joerg __in_stream_ = nullptr; 887 1.1 joerg } 888 1.1 joerg 889 1.1 joerg _LIBCPP_INLINE_VISIBILITY const _Tp& operator*() const {return __value_;} 890 1.1 joerg _LIBCPP_INLINE_VISIBILITY const _Tp* operator->() const {return _VSTD::addressof((operator*()));} 891 1.1 joerg _LIBCPP_INLINE_VISIBILITY istream_iterator& operator++() 892 1.1 joerg { 893 1.1 joerg if (!(*__in_stream_ >> __value_)) 894 1.1 joerg __in_stream_ = nullptr; 895 1.1 joerg return *this; 896 1.1 joerg } 897 1.1 joerg _LIBCPP_INLINE_VISIBILITY istream_iterator operator++(int) 898 1.1 joerg {istream_iterator __t(*this); ++(*this); return __t;} 899 1.1 joerg 900 1.1 joerg template <class _Up, class _CharU, class _TraitsU, class _DistanceU> 901 1.1 joerg friend _LIBCPP_INLINE_VISIBILITY 902 1.1 joerg bool 903 1.1 joerg operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x, 904 1.1 joerg const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y); 905 1.1 joerg 906 1.1 joerg template <class _Up, class _CharU, class _TraitsU, class _DistanceU> 907 1.1 joerg friend _LIBCPP_INLINE_VISIBILITY 908 1.1 joerg bool 909 1.1 joerg operator==(const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __x, 910 1.1 joerg const istream_iterator<_Up, _CharU, _TraitsU, _DistanceU>& __y); 911 1.1 joerg }; 912 1.1 joerg 913 1.1 joerg template <class _Tp, class _CharT, class _Traits, class _Distance> 914 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 915 1.1 joerg bool 916 1.1 joerg operator==(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, 917 1.1 joerg const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) 918 1.1 joerg { 919 1.1 joerg return __x.__in_stream_ == __y.__in_stream_; 920 1.1 joerg } 921 1.1 joerg 922 1.1 joerg template <class _Tp, class _CharT, class _Traits, class _Distance> 923 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 924 1.1 joerg bool 925 1.1 joerg operator!=(const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __x, 926 1.1 joerg const istream_iterator<_Tp, _CharT, _Traits, _Distance>& __y) 927 1.1 joerg { 928 1.1 joerg return !(__x == __y); 929 1.1 joerg } 930 1.1 joerg 931 1.1 joerg template <class _Tp, class _CharT = char, class _Traits = char_traits<_CharT> > 932 1.1 joerg class _LIBCPP_TEMPLATE_VIS ostream_iterator 933 1.1 joerg : public iterator<output_iterator_tag, void, void, void, void> 934 1.1 joerg { 935 1.1 joerg public: 936 1.1 joerg typedef output_iterator_tag iterator_category; 937 1.1 joerg typedef void value_type; 938 1.1 joerg #if _LIBCPP_STD_VER > 17 939 1.1 joerg typedef std::ptrdiff_t difference_type; 940 1.1 joerg #else 941 1.1 joerg typedef void difference_type; 942 1.1 joerg #endif 943 1.1 joerg typedef void pointer; 944 1.1 joerg typedef void reference; 945 1.1 joerg typedef _CharT char_type; 946 1.1 joerg typedef _Traits traits_type; 947 1.1 joerg typedef basic_ostream<_CharT, _Traits> ostream_type; 948 1.1 joerg 949 1.1 joerg private: 950 1.1 joerg ostream_type* __out_stream_; 951 1.1 joerg const char_type* __delim_; 952 1.1 joerg public: 953 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s) _NOEXCEPT 954 1.1 joerg : __out_stream_(_VSTD::addressof(__s)), __delim_(nullptr) {} 955 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator(ostream_type& __s, const _CharT* __delimiter) _NOEXCEPT 956 1.1 joerg : __out_stream_(_VSTD::addressof(__s)), __delim_(__delimiter) {} 957 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator=(const _Tp& __value_) 958 1.1 joerg { 959 1.1 joerg *__out_stream_ << __value_; 960 1.1 joerg if (__delim_) 961 1.1 joerg *__out_stream_ << __delim_; 962 1.1 joerg return *this; 963 1.1 joerg } 964 1.1 joerg 965 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator*() {return *this;} 966 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++() {return *this;} 967 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostream_iterator& operator++(int) {return *this;} 968 1.1 joerg }; 969 1.1 joerg 970 1.1 joerg template<class _CharT, class _Traits> 971 1.1 joerg class _LIBCPP_TEMPLATE_VIS istreambuf_iterator 972 1.1 joerg : public iterator<input_iterator_tag, _CharT, 973 1.1 joerg typename _Traits::off_type, _CharT*, 974 1.1 joerg _CharT> 975 1.1 joerg { 976 1.1 joerg public: 977 1.1 joerg typedef _CharT char_type; 978 1.1 joerg typedef _Traits traits_type; 979 1.1 joerg typedef typename _Traits::int_type int_type; 980 1.1 joerg typedef basic_streambuf<_CharT,_Traits> streambuf_type; 981 1.1 joerg typedef basic_istream<_CharT,_Traits> istream_type; 982 1.1 joerg private: 983 1.1 joerg mutable streambuf_type* __sbuf_; 984 1.1 joerg 985 1.1 joerg class __proxy 986 1.1 joerg { 987 1.1 joerg char_type __keep_; 988 1.1 joerg streambuf_type* __sbuf_; 989 1.1 joerg _LIBCPP_INLINE_VISIBILITY __proxy(char_type __c, streambuf_type* __s) 990 1.1 joerg : __keep_(__c), __sbuf_(__s) {} 991 1.1 joerg friend class istreambuf_iterator; 992 1.1 joerg public: 993 1.1 joerg _LIBCPP_INLINE_VISIBILITY char_type operator*() const {return __keep_;} 994 1.1 joerg }; 995 1.1 joerg 996 1.1 joerg _LIBCPP_INLINE_VISIBILITY 997 1.1 joerg bool __test_for_eof() const 998 1.1 joerg { 999 1.1 joerg if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sgetc(), traits_type::eof())) 1000 1.1 joerg __sbuf_ = nullptr; 1001 1.1 joerg return __sbuf_ == nullptr; 1002 1.1 joerg } 1003 1.1 joerg public: 1004 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR istreambuf_iterator() _NOEXCEPT : __sbuf_(nullptr) {} 1005 1.1 joerg _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(istream_type& __s) _NOEXCEPT 1006 1.1 joerg : __sbuf_(__s.rdbuf()) {} 1007 1.1 joerg _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(streambuf_type* __s) _NOEXCEPT 1008 1.1 joerg : __sbuf_(__s) {} 1009 1.1 joerg _LIBCPP_INLINE_VISIBILITY istreambuf_iterator(const __proxy& __p) _NOEXCEPT 1010 1.1 joerg : __sbuf_(__p.__sbuf_) {} 1011 1.1 joerg 1012 1.1 joerg _LIBCPP_INLINE_VISIBILITY char_type operator*() const 1013 1.1 joerg {return static_cast<char_type>(__sbuf_->sgetc());} 1014 1.1 joerg _LIBCPP_INLINE_VISIBILITY istreambuf_iterator& operator++() 1015 1.1 joerg { 1016 1.1 joerg __sbuf_->sbumpc(); 1017 1.1 joerg return *this; 1018 1.1 joerg } 1019 1.1 joerg _LIBCPP_INLINE_VISIBILITY __proxy operator++(int) 1020 1.1 joerg { 1021 1.1 joerg return __proxy(__sbuf_->sbumpc(), __sbuf_); 1022 1.1 joerg } 1023 1.1 joerg 1024 1.1 joerg _LIBCPP_INLINE_VISIBILITY bool equal(const istreambuf_iterator& __b) const 1025 1.1 joerg {return __test_for_eof() == __b.__test_for_eof();} 1026 1.1 joerg }; 1027 1.1 joerg 1028 1.1 joerg template <class _CharT, class _Traits> 1029 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 1030 1.1 joerg bool operator==(const istreambuf_iterator<_CharT,_Traits>& __a, 1031 1.1 joerg const istreambuf_iterator<_CharT,_Traits>& __b) 1032 1.1 joerg {return __a.equal(__b);} 1033 1.1 joerg 1034 1.1 joerg template <class _CharT, class _Traits> 1035 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 1036 1.1 joerg bool operator!=(const istreambuf_iterator<_CharT,_Traits>& __a, 1037 1.1 joerg const istreambuf_iterator<_CharT,_Traits>& __b) 1038 1.1 joerg {return !__a.equal(__b);} 1039 1.1 joerg 1040 1.1 joerg template <class _CharT, class _Traits> 1041 1.1 joerg class _LIBCPP_TEMPLATE_VIS ostreambuf_iterator 1042 1.1 joerg : public iterator<output_iterator_tag, void, void, void, void> 1043 1.1 joerg { 1044 1.1 joerg public: 1045 1.1 joerg typedef output_iterator_tag iterator_category; 1046 1.1 joerg typedef void value_type; 1047 1.1 joerg #if _LIBCPP_STD_VER > 17 1048 1.1 joerg typedef std::ptrdiff_t difference_type; 1049 1.1 joerg #else 1050 1.1 joerg typedef void difference_type; 1051 1.1 joerg #endif 1052 1.1 joerg typedef void pointer; 1053 1.1 joerg typedef void reference; 1054 1.1 joerg typedef _CharT char_type; 1055 1.1 joerg typedef _Traits traits_type; 1056 1.1 joerg typedef basic_streambuf<_CharT, _Traits> streambuf_type; 1057 1.1 joerg typedef basic_ostream<_CharT, _Traits> ostream_type; 1058 1.1 joerg 1059 1.1 joerg private: 1060 1.1 joerg streambuf_type* __sbuf_; 1061 1.1 joerg public: 1062 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(ostream_type& __s) _NOEXCEPT 1063 1.1 joerg : __sbuf_(__s.rdbuf()) {} 1064 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator(streambuf_type* __s) _NOEXCEPT 1065 1.1 joerg : __sbuf_(__s) {} 1066 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator=(_CharT __c) 1067 1.1 joerg { 1068 1.1 joerg if (__sbuf_ && traits_type::eq_int_type(__sbuf_->sputc(__c), traits_type::eof())) 1069 1.1 joerg __sbuf_ = nullptr; 1070 1.1 joerg return *this; 1071 1.1 joerg } 1072 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator*() {return *this;} 1073 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++() {return *this;} 1074 1.1 joerg _LIBCPP_INLINE_VISIBILITY ostreambuf_iterator& operator++(int) {return *this;} 1075 1.1 joerg _LIBCPP_INLINE_VISIBILITY bool failed() const _NOEXCEPT {return __sbuf_ == nullptr;} 1076 1.1 joerg 1077 1.1 joerg template <class _Ch, class _Tr> 1078 1.1 joerg friend 1079 1.1 joerg _LIBCPP_HIDDEN 1080 1.1 joerg ostreambuf_iterator<_Ch, _Tr> 1081 1.1 joerg __pad_and_output(ostreambuf_iterator<_Ch, _Tr> __s, 1082 1.1 joerg const _Ch* __ob, const _Ch* __op, const _Ch* __oe, 1083 1.1 joerg ios_base& __iob, _Ch __fl); 1084 1.1 joerg }; 1085 1.1 joerg 1086 1.1 joerg template <class _Iter> 1087 1.1 joerg class _LIBCPP_TEMPLATE_VIS move_iterator 1088 1.1 joerg { 1089 1.1 joerg private: 1090 1.1 joerg _Iter __i; 1091 1.1 joerg public: 1092 1.1 joerg typedef _Iter iterator_type; 1093 1.1 joerg typedef typename iterator_traits<iterator_type>::value_type value_type; 1094 1.1 joerg typedef typename iterator_traits<iterator_type>::difference_type difference_type; 1095 1.1 joerg typedef iterator_type pointer; 1096 1.1 joerg typedef _If<__is_cpp17_random_access_iterator<_Iter>::value, 1097 1.1 joerg random_access_iterator_tag, 1098 1.1 joerg typename iterator_traits<_Iter>::iterator_category> iterator_category; 1099 1.1 joerg #if _LIBCPP_STD_VER > 17 1100 1.1 joerg typedef input_iterator_tag iterator_concept; 1101 1.1 joerg #endif 1102 1.1 joerg 1103 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 1104 1.1 joerg typedef typename iterator_traits<iterator_type>::reference __reference; 1105 1.1 joerg typedef typename conditional< 1106 1.1 joerg is_reference<__reference>::value, 1107 1.1 joerg typename remove_reference<__reference>::type&&, 1108 1.1 joerg __reference 1109 1.1 joerg >::type reference; 1110 1.1 joerg #else 1111 1.1 joerg typedef typename iterator_traits<iterator_type>::reference reference; 1112 1.1 joerg #endif 1113 1.1 joerg 1114 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1115 1.1 joerg move_iterator() : __i() {} 1116 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1117 1.1 joerg explicit move_iterator(_Iter __x) : __i(__x) {} 1118 1.1 joerg template <class _Up> 1119 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1120 1.1 joerg move_iterator(const move_iterator<_Up>& __u) : __i(__u.base()) {} 1121 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 _Iter base() const {return __i;} 1122 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1123 1.1 joerg reference operator*() const { return static_cast<reference>(*__i); } 1124 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1125 1.1 joerg pointer operator->() const { return __i;} 1126 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1127 1.1 joerg move_iterator& operator++() {++__i; return *this;} 1128 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1129 1.1 joerg move_iterator operator++(int) {move_iterator __tmp(*this); ++__i; return __tmp;} 1130 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1131 1.1 joerg move_iterator& operator--() {--__i; return *this;} 1132 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1133 1.1 joerg move_iterator operator--(int) {move_iterator __tmp(*this); --__i; return __tmp;} 1134 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1135 1.1 joerg move_iterator operator+ (difference_type __n) const {return move_iterator(__i + __n);} 1136 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1137 1.1 joerg move_iterator& operator+=(difference_type __n) {__i += __n; return *this;} 1138 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1139 1.1 joerg move_iterator operator- (difference_type __n) const {return move_iterator(__i - __n);} 1140 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1141 1.1 joerg move_iterator& operator-=(difference_type __n) {__i -= __n; return *this;} 1142 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1143 1.1 joerg reference operator[](difference_type __n) const { return static_cast<reference>(__i[__n]); } 1144 1.1 joerg }; 1145 1.1 joerg 1146 1.1 joerg template <class _Iter1, class _Iter2> 1147 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1148 1.1 joerg bool 1149 1.1 joerg operator==(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1150 1.1 joerg { 1151 1.1 joerg return __x.base() == __y.base(); 1152 1.1 joerg } 1153 1.1 joerg 1154 1.1 joerg template <class _Iter1, class _Iter2> 1155 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1156 1.1 joerg bool 1157 1.1 joerg operator<(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1158 1.1 joerg { 1159 1.1 joerg return __x.base() < __y.base(); 1160 1.1 joerg } 1161 1.1 joerg 1162 1.1 joerg template <class _Iter1, class _Iter2> 1163 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1164 1.1 joerg bool 1165 1.1 joerg operator!=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1166 1.1 joerg { 1167 1.1 joerg return __x.base() != __y.base(); 1168 1.1 joerg } 1169 1.1 joerg 1170 1.1 joerg template <class _Iter1, class _Iter2> 1171 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1172 1.1 joerg bool 1173 1.1 joerg operator>(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1174 1.1 joerg { 1175 1.1 joerg return __x.base() > __y.base(); 1176 1.1 joerg } 1177 1.1 joerg 1178 1.1 joerg template <class _Iter1, class _Iter2> 1179 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1180 1.1 joerg bool 1181 1.1 joerg operator>=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1182 1.1 joerg { 1183 1.1 joerg return __x.base() >= __y.base(); 1184 1.1 joerg } 1185 1.1 joerg 1186 1.1 joerg template <class _Iter1, class _Iter2> 1187 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1188 1.1 joerg bool 1189 1.1 joerg operator<=(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1190 1.1 joerg { 1191 1.1 joerg return __x.base() <= __y.base(); 1192 1.1 joerg } 1193 1.1 joerg 1194 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 1195 1.1 joerg template <class _Iter1, class _Iter2> 1196 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1197 1.1 joerg auto 1198 1.1 joerg operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1199 1.1 joerg -> decltype(__x.base() - __y.base()) 1200 1.1 joerg { 1201 1.1 joerg return __x.base() - __y.base(); 1202 1.1 joerg } 1203 1.1 joerg #else 1204 1.1 joerg template <class _Iter1, class _Iter2> 1205 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY 1206 1.1 joerg typename move_iterator<_Iter1>::difference_type 1207 1.1 joerg operator-(const move_iterator<_Iter1>& __x, const move_iterator<_Iter2>& __y) 1208 1.1 joerg { 1209 1.1 joerg return __x.base() - __y.base(); 1210 1.1 joerg } 1211 1.1 joerg #endif 1212 1.1 joerg 1213 1.1 joerg template <class _Iter> 1214 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1215 1.1 joerg move_iterator<_Iter> 1216 1.1 joerg operator+(typename move_iterator<_Iter>::difference_type __n, const move_iterator<_Iter>& __x) 1217 1.1 joerg { 1218 1.1 joerg return move_iterator<_Iter>(__x.base() + __n); 1219 1.1 joerg } 1220 1.1 joerg 1221 1.1 joerg template <class _Iter> 1222 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1223 1.1 joerg move_iterator<_Iter> 1224 1.1 joerg make_move_iterator(_Iter __i) 1225 1.1 joerg { 1226 1.1 joerg return move_iterator<_Iter>(__i); 1227 1.1 joerg } 1228 1.1 joerg 1229 1.1 joerg // __wrap_iter 1230 1.1 joerg 1231 1.1 joerg template <class _Iter> class __wrap_iter; 1232 1.1 joerg 1233 1.1 joerg template <class _Iter1, class _Iter2> 1234 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1235 1.1 joerg bool 1236 1.1 joerg operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1237 1.1 joerg 1238 1.1 joerg template <class _Iter1, class _Iter2> 1239 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1240 1.1 joerg bool 1241 1.1 joerg operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1242 1.1 joerg 1243 1.1 joerg template <class _Iter1, class _Iter2> 1244 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1245 1.1 joerg bool 1246 1.1 joerg operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1247 1.1 joerg 1248 1.1 joerg template <class _Iter1, class _Iter2> 1249 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1250 1.1 joerg bool 1251 1.1 joerg operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1252 1.1 joerg 1253 1.1 joerg template <class _Iter1, class _Iter2> 1254 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1255 1.1 joerg bool 1256 1.1 joerg operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1257 1.1 joerg 1258 1.1 joerg template <class _Iter1, class _Iter2> 1259 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1260 1.1 joerg bool 1261 1.1 joerg operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1262 1.1 joerg 1263 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 1264 1.1 joerg template <class _Iter1, class _Iter2> 1265 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1266 1.1 joerg auto 1267 1.1 joerg operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1268 1.1 joerg -> decltype(__x.base() - __y.base()); 1269 1.1 joerg #else 1270 1.1 joerg template <class _Iter1, class _Iter2> 1271 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1272 1.1 joerg typename __wrap_iter<_Iter1>::difference_type 1273 1.1 joerg operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1274 1.1 joerg #endif 1275 1.1 joerg 1276 1.1 joerg template <class _Iter> 1277 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1278 1.1 joerg __wrap_iter<_Iter> 1279 1.1 joerg operator+(typename __wrap_iter<_Iter>::difference_type, __wrap_iter<_Iter>) _NOEXCEPT; 1280 1.1 joerg 1281 1.1 joerg template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 copy(_Ip, _Ip, _Op); 1282 1.1 joerg template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 copy_backward(_B1, _B1, _B2); 1283 1.1 joerg template <class _Ip, class _Op> _Op _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 move(_Ip, _Ip, _Op); 1284 1.1 joerg template <class _B1, class _B2> _B2 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17 move_backward(_B1, _B1, _B2); 1285 1.1 joerg 1286 1.1 joerg template <class _Iter> 1287 1.1 joerg class __wrap_iter 1288 1.1 joerg { 1289 1.1 joerg public: 1290 1.1 joerg typedef _Iter iterator_type; 1291 1.1 joerg typedef typename iterator_traits<iterator_type>::value_type value_type; 1292 1.1 joerg typedef typename iterator_traits<iterator_type>::difference_type difference_type; 1293 1.1 joerg typedef typename iterator_traits<iterator_type>::pointer pointer; 1294 1.1 joerg typedef typename iterator_traits<iterator_type>::reference reference; 1295 1.1 joerg typedef typename iterator_traits<iterator_type>::iterator_category iterator_category; 1296 1.1 joerg #if _LIBCPP_STD_VER > 17 1297 1.1 joerg typedef _If<__is_cpp17_contiguous_iterator<_Iter>::value, 1298 1.1 joerg contiguous_iterator_tag, iterator_category> iterator_concept; 1299 1.1 joerg #endif 1300 1.1 joerg 1301 1.1 joerg private: 1302 1.1 joerg iterator_type __i; 1303 1.1 joerg public: 1304 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter() _NOEXCEPT 1305 1.1 joerg #if _LIBCPP_STD_VER > 11 1306 1.1 joerg : __i{} 1307 1.1 joerg #endif 1308 1.1 joerg { 1309 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1310 1.1 joerg __get_db()->__insert_i(this); 1311 1.1 joerg #endif 1312 1.1 joerg } 1313 1.1 joerg template <class _Up> _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1314 1.1 joerg __wrap_iter(const __wrap_iter<_Up>& __u, 1315 1.1 joerg typename enable_if<is_convertible<_Up, iterator_type>::value>::type* = nullptr) _NOEXCEPT 1316 1.1 joerg : __i(__u.base()) 1317 1.1 joerg { 1318 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1319 1.1 joerg __get_db()->__iterator_copy(this, &__u); 1320 1.1 joerg #endif 1321 1.1 joerg } 1322 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1323 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1324 1.1 joerg __wrap_iter(const __wrap_iter& __x) 1325 1.1 joerg : __i(__x.base()) 1326 1.1 joerg { 1327 1.1 joerg __get_db()->__iterator_copy(this, &__x); 1328 1.1 joerg } 1329 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1330 1.1 joerg __wrap_iter& operator=(const __wrap_iter& __x) 1331 1.1 joerg { 1332 1.1 joerg if (this != &__x) 1333 1.1 joerg { 1334 1.1 joerg __get_db()->__iterator_copy(this, &__x); 1335 1.1 joerg __i = __x.__i; 1336 1.1 joerg } 1337 1.1 joerg return *this; 1338 1.1 joerg } 1339 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1340 1.1 joerg ~__wrap_iter() 1341 1.1 joerg { 1342 1.1 joerg __get_db()->__erase_i(this); 1343 1.1 joerg } 1344 1.1 joerg #endif 1345 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator*() const _NOEXCEPT 1346 1.1 joerg { 1347 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1348 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), 1349 1.1 joerg "Attempted to dereference a non-dereferenceable iterator"); 1350 1.1 joerg #endif 1351 1.1 joerg return *__i; 1352 1.1 joerg } 1353 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG pointer operator->() const _NOEXCEPT 1354 1.1 joerg { 1355 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1356 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), 1357 1.1 joerg "Attempted to dereference a non-dereferenceable iterator"); 1358 1.1 joerg #endif 1359 1.1 joerg return _VSTD::__to_address(__i); 1360 1.1 joerg } 1361 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator++() _NOEXCEPT 1362 1.1 joerg { 1363 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1364 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this), 1365 1.1 joerg "Attempted to increment a non-incrementable iterator"); 1366 1.1 joerg #endif 1367 1.1 joerg ++__i; 1368 1.1 joerg return *this; 1369 1.1 joerg } 1370 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator++(int) _NOEXCEPT 1371 1.1 joerg {__wrap_iter __tmp(*this); ++(*this); return __tmp;} 1372 1.1 joerg 1373 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator--() _NOEXCEPT 1374 1.1 joerg { 1375 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1376 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__decrementable(this), 1377 1.1 joerg "Attempted to decrement a non-decrementable iterator"); 1378 1.1 joerg #endif 1379 1.1 joerg --__i; 1380 1.1 joerg return *this; 1381 1.1 joerg } 1382 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator--(int) _NOEXCEPT 1383 1.1 joerg {__wrap_iter __tmp(*this); --(*this); return __tmp;} 1384 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator+ (difference_type __n) const _NOEXCEPT 1385 1.1 joerg {__wrap_iter __w(*this); __w += __n; return __w;} 1386 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator+=(difference_type __n) _NOEXCEPT 1387 1.1 joerg { 1388 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1389 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__addable(this, __n), 1390 1.1 joerg "Attempted to add/subtract an iterator outside its valid range"); 1391 1.1 joerg #endif 1392 1.1 joerg __i += __n; 1393 1.1 joerg return *this; 1394 1.1 joerg } 1395 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter operator- (difference_type __n) const _NOEXCEPT 1396 1.1 joerg {return *this + (-__n);} 1397 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter& operator-=(difference_type __n) _NOEXCEPT 1398 1.1 joerg {*this += -__n; return *this;} 1399 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG reference operator[](difference_type __n) const _NOEXCEPT 1400 1.1 joerg { 1401 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1402 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__subscriptable(this, __n), 1403 1.1 joerg "Attempted to subscript an iterator outside its valid range"); 1404 1.1 joerg #endif 1405 1.1 joerg return __i[__n]; 1406 1.1 joerg } 1407 1.1 joerg 1408 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG iterator_type base() const _NOEXCEPT {return __i;} 1409 1.1 joerg 1410 1.1 joerg private: 1411 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1412 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(const void* __p, iterator_type __x) : __i(__x) 1413 1.1 joerg { 1414 1.1 joerg __get_db()->__insert_ic(this, __p); 1415 1.1 joerg } 1416 1.1 joerg #else 1417 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG __wrap_iter(iterator_type __x) _NOEXCEPT : __i(__x) {} 1418 1.1 joerg #endif 1419 1.1 joerg 1420 1.1 joerg template <class _Up> friend class __wrap_iter; 1421 1.1 joerg template <class _CharT, class _Traits, class _Alloc> friend class basic_string; 1422 1.1 joerg template <class _Tp, class _Alloc> friend class _LIBCPP_TEMPLATE_VIS vector; 1423 1.1 joerg template <class _Tp, size_t> friend class _LIBCPP_TEMPLATE_VIS span; 1424 1.1 joerg 1425 1.1 joerg template <class _Iter1, class _Iter2> 1426 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1427 1.1 joerg bool 1428 1.1 joerg operator==(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1429 1.1 joerg 1430 1.1 joerg template <class _Iter1, class _Iter2> 1431 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1432 1.1 joerg bool 1433 1.1 joerg operator<(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1434 1.1 joerg 1435 1.1 joerg template <class _Iter1, class _Iter2> 1436 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1437 1.1 joerg bool 1438 1.1 joerg operator!=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1439 1.1 joerg 1440 1.1 joerg template <class _Iter1, class _Iter2> 1441 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1442 1.1 joerg bool 1443 1.1 joerg operator>(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1444 1.1 joerg 1445 1.1 joerg template <class _Iter1, class _Iter2> 1446 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1447 1.1 joerg bool 1448 1.1 joerg operator>=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1449 1.1 joerg 1450 1.1 joerg template <class _Iter1, class _Iter2> 1451 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1452 1.1 joerg bool 1453 1.1 joerg operator<=(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1454 1.1 joerg 1455 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 1456 1.1 joerg template <class _Iter1, class _Iter2> 1457 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1458 1.1 joerg auto 1459 1.1 joerg operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1460 1.1 joerg -> decltype(__x.base() - __y.base()); 1461 1.1 joerg #else 1462 1.1 joerg template <class _Iter1, class _Iter2> 1463 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1464 1.1 joerg typename __wrap_iter<_Iter1>::difference_type 1465 1.1 joerg operator-(const __wrap_iter<_Iter1>&, const __wrap_iter<_Iter2>&) _NOEXCEPT; 1466 1.1 joerg #endif 1467 1.1 joerg 1468 1.1 joerg template <class _Iter1> 1469 1.1 joerg _LIBCPP_CONSTEXPR_IF_NODEBUG friend 1470 1.1 joerg __wrap_iter<_Iter1> 1471 1.1 joerg operator+(typename __wrap_iter<_Iter1>::difference_type, __wrap_iter<_Iter1>) _NOEXCEPT; 1472 1.1 joerg }; 1473 1.1 joerg 1474 1.1 joerg #if _LIBCPP_STD_VER <= 17 1475 1.1 joerg template <class _It> 1476 1.1 joerg struct __is_cpp17_contiguous_iterator<__wrap_iter<_It> > : __is_cpp17_contiguous_iterator<_It> {}; 1477 1.1 joerg #endif 1478 1.1 joerg 1479 1.1 joerg template <class _Iter> 1480 1.1 joerg _LIBCPP_CONSTEXPR 1481 1.1 joerg _EnableIf<__is_cpp17_contiguous_iterator<_Iter>::value, decltype(_VSTD::__to_address(declval<_Iter>()))> 1482 1.1 joerg __to_address(__wrap_iter<_Iter> __w) _NOEXCEPT { 1483 1.1 joerg return _VSTD::__to_address(__w.base()); 1484 1.1 joerg } 1485 1.1 joerg 1486 1.1 joerg template <class _Iter1, class _Iter2> 1487 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1488 1.1 joerg bool 1489 1.1 joerg operator==(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1490 1.1 joerg { 1491 1.1 joerg return __x.base() == __y.base(); 1492 1.1 joerg } 1493 1.1 joerg 1494 1.1 joerg template <class _Iter1, class _Iter2> 1495 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1496 1.1 joerg bool 1497 1.1 joerg operator<(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1498 1.1 joerg { 1499 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1500 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y), 1501 1.1 joerg "Attempted to compare incomparable iterators"); 1502 1.1 joerg #endif 1503 1.1 joerg return __x.base() < __y.base(); 1504 1.1 joerg } 1505 1.1 joerg 1506 1.1 joerg template <class _Iter1, class _Iter2> 1507 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1508 1.1 joerg bool 1509 1.1 joerg operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1510 1.1 joerg { 1511 1.1 joerg return !(__x == __y); 1512 1.1 joerg } 1513 1.1 joerg 1514 1.1 joerg template <class _Iter1, class _Iter2> 1515 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1516 1.1 joerg bool 1517 1.1 joerg operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1518 1.1 joerg { 1519 1.1 joerg return __y < __x; 1520 1.1 joerg } 1521 1.1 joerg 1522 1.1 joerg template <class _Iter1, class _Iter2> 1523 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1524 1.1 joerg bool 1525 1.1 joerg operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1526 1.1 joerg { 1527 1.1 joerg return !(__x < __y); 1528 1.1 joerg } 1529 1.1 joerg 1530 1.1 joerg template <class _Iter1, class _Iter2> 1531 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1532 1.1 joerg bool 1533 1.1 joerg operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1534 1.1 joerg { 1535 1.1 joerg return !(__y < __x); 1536 1.1 joerg } 1537 1.1 joerg 1538 1.1 joerg template <class _Iter1> 1539 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1540 1.1 joerg bool 1541 1.1 joerg operator!=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT 1542 1.1 joerg { 1543 1.1 joerg return !(__x == __y); 1544 1.1 joerg } 1545 1.1 joerg 1546 1.1 joerg template <class _Iter1> 1547 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1548 1.1 joerg bool 1549 1.1 joerg operator>(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT 1550 1.1 joerg { 1551 1.1 joerg return __y < __x; 1552 1.1 joerg } 1553 1.1 joerg 1554 1.1 joerg template <class _Iter1> 1555 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1556 1.1 joerg bool 1557 1.1 joerg operator>=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT 1558 1.1 joerg { 1559 1.1 joerg return !(__x < __y); 1560 1.1 joerg } 1561 1.1 joerg 1562 1.1 joerg template <class _Iter1> 1563 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1564 1.1 joerg bool 1565 1.1 joerg operator<=(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter1>& __y) _NOEXCEPT 1566 1.1 joerg { 1567 1.1 joerg return !(__y < __x); 1568 1.1 joerg } 1569 1.1 joerg 1570 1.1 joerg #ifndef _LIBCPP_CXX03_LANG 1571 1.1 joerg template <class _Iter1, class _Iter2> 1572 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1573 1.1 joerg auto 1574 1.1 joerg operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1575 1.1 joerg -> decltype(__x.base() - __y.base()) 1576 1.1 joerg { 1577 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1578 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y), 1579 1.1 joerg "Attempted to subtract incompatible iterators"); 1580 1.1 joerg #endif 1581 1.1 joerg return __x.base() - __y.base(); 1582 1.1 joerg } 1583 1.1 joerg #else 1584 1.1 joerg template <class _Iter1, class _Iter2> 1585 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1586 1.1 joerg typename __wrap_iter<_Iter1>::difference_type 1587 1.1 joerg operator-(const __wrap_iter<_Iter1>& __x, const __wrap_iter<_Iter2>& __y) _NOEXCEPT 1588 1.1 joerg { 1589 1.1 joerg #if _LIBCPP_DEBUG_LEVEL == 2 1590 1.1 joerg _LIBCPP_ASSERT(__get_const_db()->__less_than_comparable(&__x, &__y), 1591 1.1 joerg "Attempted to subtract incompatible iterators"); 1592 1.1 joerg #endif 1593 1.1 joerg return __x.base() - __y.base(); 1594 1.1 joerg } 1595 1.1 joerg #endif 1596 1.1 joerg 1597 1.1 joerg template <class _Iter> 1598 1.1 joerg inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_IF_NODEBUG 1599 1.1 joerg __wrap_iter<_Iter> 1600 1.1 joerg operator+(typename __wrap_iter<_Iter>::difference_type __n, 1601 1.1 joerg __wrap_iter<_Iter> __x) _NOEXCEPT 1602 1.1 joerg { 1603 1.1 joerg __x += __n; 1604 1.1 joerg return __x; 1605 1.1 joerg } 1606 1.1 joerg 1607 1.1 joerg template <class _Tp, size_t _Np> 1608 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1609 1.1 joerg _Tp* 1610 1.1 joerg begin(_Tp (&__array)[_Np]) 1611 1.1 joerg { 1612 1.1 joerg return __array; 1613 1.1 joerg } 1614 1.1 joerg 1615 1.1 joerg template <class _Tp, size_t _Np> 1616 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1617 1.1 joerg _Tp* 1618 1.1 joerg end(_Tp (&__array)[_Np]) 1619 1.1 joerg { 1620 1.1 joerg return __array + _Np; 1621 1.1 joerg } 1622 1.1 joerg 1623 1.1 joerg #if !defined(_LIBCPP_CXX03_LANG) 1624 1.1 joerg 1625 1.1 joerg template <class _Cp> 1626 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1627 1.1 joerg auto 1628 1.1 joerg begin(_Cp& __c) -> decltype(__c.begin()) 1629 1.1 joerg { 1630 1.1 joerg return __c.begin(); 1631 1.1 joerg } 1632 1.1 joerg 1633 1.1 joerg template <class _Cp> 1634 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1635 1.1 joerg auto 1636 1.1 joerg begin(const _Cp& __c) -> decltype(__c.begin()) 1637 1.1 joerg { 1638 1.1 joerg return __c.begin(); 1639 1.1 joerg } 1640 1.1 joerg 1641 1.1 joerg template <class _Cp> 1642 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1643 1.1 joerg auto 1644 1.1 joerg end(_Cp& __c) -> decltype(__c.end()) 1645 1.1 joerg { 1646 1.1 joerg return __c.end(); 1647 1.1 joerg } 1648 1.1 joerg 1649 1.1 joerg template <class _Cp> 1650 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1651 1.1 joerg auto 1652 1.1 joerg end(const _Cp& __c) -> decltype(__c.end()) 1653 1.1 joerg { 1654 1.1 joerg return __c.end(); 1655 1.1 joerg } 1656 1.1 joerg 1657 1.1 joerg #if _LIBCPP_STD_VER > 11 1658 1.1 joerg 1659 1.1 joerg template <class _Tp, size_t _Np> 1660 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1661 1.1 joerg reverse_iterator<_Tp*> rbegin(_Tp (&__array)[_Np]) 1662 1.1 joerg { 1663 1.1 joerg return reverse_iterator<_Tp*>(__array + _Np); 1664 1.1 joerg } 1665 1.1 joerg 1666 1.1 joerg template <class _Tp, size_t _Np> 1667 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1668 1.1 joerg reverse_iterator<_Tp*> rend(_Tp (&__array)[_Np]) 1669 1.1 joerg { 1670 1.1 joerg return reverse_iterator<_Tp*>(__array); 1671 1.1 joerg } 1672 1.1 joerg 1673 1.1 joerg template <class _Ep> 1674 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1675 1.1 joerg reverse_iterator<const _Ep*> rbegin(initializer_list<_Ep> __il) 1676 1.1 joerg { 1677 1.1 joerg return reverse_iterator<const _Ep*>(__il.end()); 1678 1.1 joerg } 1679 1.1 joerg 1680 1.1 joerg template <class _Ep> 1681 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1682 1.1 joerg reverse_iterator<const _Ep*> rend(initializer_list<_Ep> __il) 1683 1.1 joerg { 1684 1.1 joerg return reverse_iterator<const _Ep*>(__il.begin()); 1685 1.1 joerg } 1686 1.1 joerg 1687 1.1 joerg template <class _Cp> 1688 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1689 1.1 joerg auto cbegin(const _Cp& __c) -> decltype(_VSTD::begin(__c)) 1690 1.1 joerg { 1691 1.1 joerg return _VSTD::begin(__c); 1692 1.1 joerg } 1693 1.1 joerg 1694 1.1 joerg template <class _Cp> 1695 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 1696 1.1 joerg auto cend(const _Cp& __c) -> decltype(_VSTD::end(__c)) 1697 1.1 joerg { 1698 1.1 joerg return _VSTD::end(__c); 1699 1.1 joerg } 1700 1.1 joerg 1701 1.1 joerg template <class _Cp> 1702 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1703 1.1 joerg auto rbegin(_Cp& __c) -> decltype(__c.rbegin()) 1704 1.1 joerg { 1705 1.1 joerg return __c.rbegin(); 1706 1.1 joerg } 1707 1.1 joerg 1708 1.1 joerg template <class _Cp> 1709 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1710 1.1 joerg auto rbegin(const _Cp& __c) -> decltype(__c.rbegin()) 1711 1.1 joerg { 1712 1.1 joerg return __c.rbegin(); 1713 1.1 joerg } 1714 1.1 joerg 1715 1.1 joerg template <class _Cp> 1716 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1717 1.1 joerg auto rend(_Cp& __c) -> decltype(__c.rend()) 1718 1.1 joerg { 1719 1.1 joerg return __c.rend(); 1720 1.1 joerg } 1721 1.1 joerg 1722 1.1 joerg template <class _Cp> 1723 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1724 1.1 joerg auto rend(const _Cp& __c) -> decltype(__c.rend()) 1725 1.1 joerg { 1726 1.1 joerg return __c.rend(); 1727 1.1 joerg } 1728 1.1 joerg 1729 1.1 joerg template <class _Cp> 1730 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1731 1.1 joerg auto crbegin(const _Cp& __c) -> decltype(_VSTD::rbegin(__c)) 1732 1.1 joerg { 1733 1.1 joerg return _VSTD::rbegin(__c); 1734 1.1 joerg } 1735 1.1 joerg 1736 1.1 joerg template <class _Cp> 1737 1.1 joerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX14 1738 1.1 joerg auto crend(const _Cp& __c) -> decltype(_VSTD::rend(__c)) 1739 1.1 joerg { 1740 1.1 joerg return _VSTD::rend(__c); 1741 1.1 joerg } 1742 1.1 joerg 1743 1.1 joerg #endif 1744 1.1 joerg 1745 1.1 joerg 1746 1.1 joerg #else // defined(_LIBCPP_CXX03_LANG) 1747 1.1 joerg 1748 1.1 joerg template <class _Cp> 1749 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1750 1.1 joerg typename _Cp::iterator 1751 1.1 joerg begin(_Cp& __c) 1752 1.1 joerg { 1753 1.1 joerg return __c.begin(); 1754 1.1 joerg } 1755 1.1 joerg 1756 1.1 joerg template <class _Cp> 1757 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1758 1.1 joerg typename _Cp::const_iterator 1759 1.1 joerg begin(const _Cp& __c) 1760 1.1 joerg { 1761 1.1 joerg return __c.begin(); 1762 1.1 joerg } 1763 1.1 joerg 1764 1.1 joerg template <class _Cp> 1765 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1766 1.1 joerg typename _Cp::iterator 1767 1.1 joerg end(_Cp& __c) 1768 1.1 joerg { 1769 1.1 joerg return __c.end(); 1770 1.1 joerg } 1771 1.1 joerg 1772 1.1 joerg template <class _Cp> 1773 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1774 1.1 joerg typename _Cp::const_iterator 1775 1.1 joerg end(const _Cp& __c) 1776 1.1 joerg { 1777 1.1 joerg return __c.end(); 1778 1.1 joerg } 1779 1.1 joerg 1780 1.1 joerg #endif // !defined(_LIBCPP_CXX03_LANG) 1781 1.1 joerg 1782 1.1 joerg #if _LIBCPP_STD_VER > 14 1783 1.1 joerg 1784 1.1 joerg // #if _LIBCPP_STD_VER > 11 1785 1.1 joerg // template <> 1786 1.1 joerg // struct _LIBCPP_TEMPLATE_VIS plus<void> 1787 1.1 joerg // { 1788 1.1 joerg // template <class _T1, class _T2> 1789 1.1 joerg // _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 1790 1.1 joerg // auto operator()(_T1&& __t, _T2&& __u) const 1791 1.1 joerg // _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u))) 1792 1.1 joerg // -> decltype (_VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u)) 1793 1.1 joerg // { return _VSTD::forward<_T1>(__t) + _VSTD::forward<_T2>(__u); } 1794 1.1 joerg // typedef void is_transparent; 1795 1.1 joerg // }; 1796 1.1 joerg // #endif 1797 1.1 joerg 1798 1.1 joerg template <class _Cont> 1799 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1800 1.1 joerg constexpr auto size(const _Cont& __c) 1801 1.1 joerg _NOEXCEPT_(noexcept(__c.size())) 1802 1.1 joerg -> decltype (__c.size()) 1803 1.1 joerg { return __c.size(); } 1804 1.1 joerg 1805 1.1 joerg template <class _Tp, size_t _Sz> 1806 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1807 1.1 joerg constexpr size_t size(const _Tp (&)[_Sz]) noexcept { return _Sz; } 1808 1.1 joerg 1809 1.1 joerg #if _LIBCPP_STD_VER > 17 1810 1.1 joerg template <class _Cont> 1811 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1812 1.1 joerg constexpr auto ssize(const _Cont& __c) 1813 1.1 joerg _NOEXCEPT_(noexcept(static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(__c.size())>>>(__c.size()))) 1814 1.1 joerg -> common_type_t<ptrdiff_t, make_signed_t<decltype(__c.size())>> 1815 1.1 joerg { return static_cast<common_type_t<ptrdiff_t, make_signed_t<decltype(__c.size())>>>(__c.size()); } 1816 1.1 joerg 1817 1.1 joerg template <class _Tp, ptrdiff_t _Sz> 1818 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1819 1.1 joerg constexpr ptrdiff_t ssize(const _Tp (&)[_Sz]) noexcept { return _Sz; } 1820 1.1 joerg #endif 1821 1.1 joerg 1822 1.1 joerg template <class _Cont> 1823 1.1 joerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1824 1.1 joerg constexpr auto empty(const _Cont& __c) 1825 1.1 joerg _NOEXCEPT_(noexcept(__c.empty())) 1826 1.1 joerg -> decltype (__c.empty()) 1827 1.1 joerg { return __c.empty(); } 1828 1.1 joerg 1829 1.1 joerg template <class _Tp, size_t _Sz> 1830 1.1 joerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1831 1.1 joerg constexpr bool empty(const _Tp (&)[_Sz]) noexcept { return false; } 1832 1.1 joerg 1833 1.1 joerg template <class _Ep> 1834 1.1 joerg _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 1835 1.1 joerg constexpr bool empty(initializer_list<_Ep> __il) noexcept { return __il.size() == 0; } 1836 1.1 joerg 1837 1.1 joerg template <class _Cont> constexpr 1838 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1839 1.1 joerg auto data(_Cont& __c) 1840 1.1 joerg _NOEXCEPT_(noexcept(__c.data())) 1841 1.1 joerg -> decltype (__c.data()) 1842 1.1 joerg { return __c.data(); } 1843 1.1 joerg 1844 1.1 joerg template <class _Cont> constexpr 1845 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1846 1.1 joerg auto data(const _Cont& __c) 1847 1.1 joerg _NOEXCEPT_(noexcept(__c.data())) 1848 1.1 joerg -> decltype (__c.data()) 1849 1.1 joerg { return __c.data(); } 1850 1.1 joerg 1851 1.1 joerg template <class _Tp, size_t _Sz> 1852 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1853 1.1 joerg constexpr _Tp* data(_Tp (&__array)[_Sz]) noexcept { return __array; } 1854 1.1 joerg 1855 1.1 joerg template <class _Ep> 1856 1.1 joerg _LIBCPP_INLINE_VISIBILITY 1857 1.1 joerg constexpr const _Ep* data(initializer_list<_Ep> __il) noexcept { return __il.begin(); } 1858 1.1 joerg #endif 1859 1.1 joerg 1860 1.1 joerg template <class _Container, class _Predicate> 1861 1.1 joerg typename _Container::size_type 1862 1.1 joerg __libcpp_erase_if_container(_Container& __c, _Predicate& __pred) { 1863 1.1 joerg typename _Container::size_type __old_size = __c.size(); 1864 1.1 joerg 1865 1.1 joerg const typename _Container::iterator __last = __c.end(); 1866 1.1 joerg for (typename _Container::iterator __iter = __c.begin(); __iter != __last;) { 1867 1.1 joerg if (__pred(*__iter)) 1868 1.1 joerg __iter = __c.erase(__iter); 1869 1.1 joerg else 1870 1.1 joerg ++__iter; 1871 1.1 joerg } 1872 1.1 joerg 1873 1.1 joerg return __old_size - __c.size(); 1874 1.1 joerg } 1875 1.1 joerg 1876 1.1 joerg _LIBCPP_END_NAMESPACE_STD 1877 1.1 joerg 1878 1.1 joerg #endif // _LIBCPP_ITERATOR 1879