1 // -*- C++ -*- 2 //===---------------------------- deque -----------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_DEQUE 12 #define _LIBCPP_DEQUE 13 14 /* 15 deque synopsis 16 17 namespace std 18 { 19 20 template <class T, class Allocator = allocator<T> > 21 class deque 22 { 23 public: 24 // types: 25 typedef T value_type; 26 typedef Allocator allocator_type; 27 28 typedef typename allocator_type::reference reference; 29 typedef typename allocator_type::const_reference const_reference; 30 typedef implementation-defined iterator; 31 typedef implementation-defined const_iterator; 32 typedef typename allocator_type::size_type size_type; 33 typedef typename allocator_type::difference_type difference_type; 34 35 typedef typename allocator_type::pointer pointer; 36 typedef typename allocator_type::const_pointer const_pointer; 37 typedef std::reverse_iterator<iterator> reverse_iterator; 38 typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 39 40 // construct/copy/destroy: 41 deque() noexcept(is_nothrow_default_constructible<allocator_type>::value); 42 explicit deque(const allocator_type& a); 43 explicit deque(size_type n); 44 explicit deque(size_type n, const allocator_type& a); // C++14 45 deque(size_type n, const value_type& v); 46 deque(size_type n, const value_type& v, const allocator_type& a); 47 template <class InputIterator> 48 deque(InputIterator f, InputIterator l); 49 template <class InputIterator> 50 deque(InputIterator f, InputIterator l, const allocator_type& a); 51 deque(const deque& c); 52 deque(deque&& c) 53 noexcept(is_nothrow_move_constructible<allocator_type>::value); 54 deque(initializer_list<value_type> il, const Allocator& a = allocator_type()); 55 deque(const deque& c, const allocator_type& a); 56 deque(deque&& c, const allocator_type& a); 57 ~deque(); 58 59 deque& operator=(const deque& c); 60 deque& operator=(deque&& c) 61 noexcept( 62 allocator_type::propagate_on_container_move_assignment::value && 63 is_nothrow_move_assignable<allocator_type>::value); 64 deque& operator=(initializer_list<value_type> il); 65 66 template <class InputIterator> 67 void assign(InputIterator f, InputIterator l); 68 void assign(size_type n, const value_type& v); 69 void assign(initializer_list<value_type> il); 70 71 allocator_type get_allocator() const noexcept; 72 73 // iterators: 74 75 iterator begin() noexcept; 76 const_iterator begin() const noexcept; 77 iterator end() noexcept; 78 const_iterator end() const noexcept; 79 80 reverse_iterator rbegin() noexcept; 81 const_reverse_iterator rbegin() const noexcept; 82 reverse_iterator rend() noexcept; 83 const_reverse_iterator rend() const noexcept; 84 85 const_iterator cbegin() const noexcept; 86 const_iterator cend() const noexcept; 87 const_reverse_iterator crbegin() const noexcept; 88 const_reverse_iterator crend() const noexcept; 89 90 // capacity: 91 size_type size() const noexcept; 92 size_type max_size() const noexcept; 93 void resize(size_type n); 94 void resize(size_type n, const value_type& v); 95 void shrink_to_fit(); 96 bool empty() const noexcept; 97 98 // element access: 99 reference operator[](size_type i); 100 const_reference operator[](size_type i) const; 101 reference at(size_type i); 102 const_reference at(size_type i) const; 103 reference front(); 104 const_reference front() const; 105 reference back(); 106 const_reference back() const; 107 108 // modifiers: 109 void push_front(const value_type& v); 110 void push_front(value_type&& v); 111 void push_back(const value_type& v); 112 void push_back(value_type&& v); 113 template <class... Args> void emplace_front(Args&&... args); 114 template <class... Args> void emplace_back(Args&&... args); 115 template <class... Args> iterator emplace(const_iterator p, Args&&... args); 116 iterator insert(const_iterator p, const value_type& v); 117 iterator insert(const_iterator p, value_type&& v); 118 iterator insert(const_iterator p, size_type n, const value_type& v); 119 template <class InputIterator> 120 iterator insert(const_iterator p, InputIterator f, InputIterator l); 121 iterator insert(const_iterator p, initializer_list<value_type> il); 122 void pop_front(); 123 void pop_back(); 124 iterator erase(const_iterator p); 125 iterator erase(const_iterator f, const_iterator l); 126 void swap(deque& c) 127 noexcept(!allocator_type::propagate_on_container_swap::value || 128 __is_nothrow_swappable<allocator_type>::value); 129 void clear() noexcept; 130 }; 131 132 template <class T, class Allocator> 133 bool operator==(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 134 template <class T, class Allocator> 135 bool operator< (const deque<T,Allocator>& x, const deque<T,Allocator>& y); 136 template <class T, class Allocator> 137 bool operator!=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 138 template <class T, class Allocator> 139 bool operator> (const deque<T,Allocator>& x, const deque<T,Allocator>& y); 140 template <class T, class Allocator> 141 bool operator>=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 142 template <class T, class Allocator> 143 bool operator<=(const deque<T,Allocator>& x, const deque<T,Allocator>& y); 144 145 // specialized algorithms: 146 template <class T, class Allocator> 147 void swap(deque<T,Allocator>& x, deque<T,Allocator>& y) 148 noexcept(noexcept(x.swap(y))); 149 150 } // std 151 152 */ 153 154 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 155 #pragma GCC system_header 156 #endif 157 158 #include <__config> 159 #include <__split_buffer> 160 #include <type_traits> 161 #include <initializer_list> 162 #include <iterator> 163 #include <algorithm> 164 #include <stdexcept> 165 166 #include <__undef_min_max> 167 168 _LIBCPP_BEGIN_NAMESPACE_STD 169 170 template <class _Tp, class _Allocator> class __deque_base; 171 template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY deque; 172 173 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer, 174 class _DiffType, _DiffType _BlockSize> 175 class _LIBCPP_TYPE_VIS_ONLY __deque_iterator; 176 177 template <class _RAIter, 178 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 179 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 180 copy(_RAIter __f, 181 _RAIter __l, 182 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 183 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); 184 185 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 186 class _OutputIterator> 187 _OutputIterator 188 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 189 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 190 _OutputIterator __r); 191 192 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 193 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 194 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 195 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 196 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 197 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 198 199 template <class _RAIter, 200 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 201 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 202 copy_backward(_RAIter __f, 203 _RAIter __l, 204 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 205 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); 206 207 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 208 class _OutputIterator> 209 _OutputIterator 210 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 211 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 212 _OutputIterator __r); 213 214 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 215 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 216 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 217 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 218 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 219 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 220 221 template <class _RAIter, 222 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 223 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 224 move(_RAIter __f, 225 _RAIter __l, 226 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 227 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); 228 229 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 230 class _OutputIterator> 231 _OutputIterator 232 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 233 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 234 _OutputIterator __r); 235 236 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 237 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 238 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 239 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 240 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 241 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 242 243 template <class _RAIter, 244 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 245 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 246 move_backward(_RAIter __f, 247 _RAIter __l, 248 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 249 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); 250 251 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 252 class _OutputIterator> 253 _OutputIterator 254 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 255 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 256 _OutputIterator __r); 257 258 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 259 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 260 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 261 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 262 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 263 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 264 265 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer, 266 class _DiffType, _DiffType _BlockSize> 267 class _LIBCPP_TYPE_VIS_ONLY __deque_iterator 268 { 269 typedef _MapPointer __map_iterator; 270 public: 271 typedef _Pointer pointer; 272 typedef _DiffType difference_type; 273 private: 274 __map_iterator __m_iter_; 275 pointer __ptr_; 276 277 static const difference_type __block_size = _BlockSize; 278 public: 279 typedef _ValueType value_type; 280 typedef random_access_iterator_tag iterator_category; 281 typedef _Reference reference; 282 283 _LIBCPP_INLINE_VISIBILITY __deque_iterator() _NOEXCEPT 284 #if _LIBCPP_STD_VER > 11 285 : __m_iter_(nullptr), __ptr_(nullptr) 286 #endif 287 {} 288 289 template <class _Pp, class _Rp, class _MP> 290 _LIBCPP_INLINE_VISIBILITY 291 __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, __block_size>& __it, 292 typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT 293 : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {} 294 295 _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;} 296 _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;} 297 298 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++() 299 { 300 if (++__ptr_ - *__m_iter_ == __block_size) 301 { 302 ++__m_iter_; 303 __ptr_ = *__m_iter_; 304 } 305 return *this; 306 } 307 308 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator++(int) 309 { 310 __deque_iterator __tmp = *this; 311 ++(*this); 312 return __tmp; 313 } 314 315 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator--() 316 { 317 if (__ptr_ == *__m_iter_) 318 { 319 --__m_iter_; 320 __ptr_ = *__m_iter_ + __block_size; 321 } 322 --__ptr_; 323 return *this; 324 } 325 326 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator--(int) 327 { 328 __deque_iterator __tmp = *this; 329 --(*this); 330 return __tmp; 331 } 332 333 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator+=(difference_type __n) 334 { 335 if (__n != 0) 336 { 337 __n += __ptr_ - *__m_iter_; 338 if (__n > 0) 339 { 340 __m_iter_ += __n / __block_size; 341 __ptr_ = *__m_iter_ + __n % __block_size; 342 } 343 else // (__n < 0) 344 { 345 difference_type __z = __block_size - 1 - __n; 346 __m_iter_ -= __z / __block_size; 347 __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size); 348 } 349 } 350 return *this; 351 } 352 353 _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator-=(difference_type __n) 354 { 355 return *this += -__n; 356 } 357 358 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator+(difference_type __n) const 359 { 360 __deque_iterator __t(*this); 361 __t += __n; 362 return __t; 363 } 364 365 _LIBCPP_INLINE_VISIBILITY __deque_iterator operator-(difference_type __n) const 366 { 367 __deque_iterator __t(*this); 368 __t -= __n; 369 return __t; 370 } 371 372 _LIBCPP_INLINE_VISIBILITY 373 friend __deque_iterator operator+(difference_type __n, const __deque_iterator& __it) 374 {return __it + __n;} 375 376 _LIBCPP_INLINE_VISIBILITY 377 friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y) 378 { 379 if (__x != __y) 380 return (__x.__m_iter_ - __y.__m_iter_) * __block_size 381 + (__x.__ptr_ - *__x.__m_iter_) 382 - (__y.__ptr_ - *__y.__m_iter_); 383 return 0; 384 } 385 386 _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const 387 {return *(*this + __n);} 388 389 _LIBCPP_INLINE_VISIBILITY friend 390 bool operator==(const __deque_iterator& __x, const __deque_iterator& __y) 391 {return __x.__ptr_ == __y.__ptr_;} 392 393 _LIBCPP_INLINE_VISIBILITY friend 394 bool operator!=(const __deque_iterator& __x, const __deque_iterator& __y) 395 {return !(__x == __y);} 396 397 _LIBCPP_INLINE_VISIBILITY friend 398 bool operator<(const __deque_iterator& __x, const __deque_iterator& __y) 399 {return __x.__m_iter_ < __y.__m_iter_ || 400 (__x.__m_iter_ == __y.__m_iter_ && __x.__ptr_ < __y.__ptr_);} 401 402 _LIBCPP_INLINE_VISIBILITY friend 403 bool operator>(const __deque_iterator& __x, const __deque_iterator& __y) 404 {return __y < __x;} 405 406 _LIBCPP_INLINE_VISIBILITY friend 407 bool operator<=(const __deque_iterator& __x, const __deque_iterator& __y) 408 {return !(__y < __x);} 409 410 _LIBCPP_INLINE_VISIBILITY friend 411 bool operator>=(const __deque_iterator& __x, const __deque_iterator& __y) 412 {return !(__x < __y);} 413 414 private: 415 _LIBCPP_INLINE_VISIBILITY __deque_iterator(__map_iterator __m, pointer __p) _NOEXCEPT 416 : __m_iter_(__m), __ptr_(__p) {} 417 418 template <class _Tp, class _Ap> friend class __deque_base; 419 template <class _Tp, class _Ap> friend class _LIBCPP_TYPE_VIS_ONLY deque; 420 template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp> 421 friend class _LIBCPP_TYPE_VIS_ONLY __deque_iterator; 422 423 template <class _RAIter, 424 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 425 friend 426 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 427 copy(_RAIter __f, 428 _RAIter __l, 429 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 430 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); 431 432 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 433 class _OutputIterator> 434 friend 435 _OutputIterator 436 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 437 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 438 _OutputIterator __r); 439 440 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 441 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 442 friend 443 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 444 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 445 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 446 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 447 448 template <class _RAIter, 449 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 450 friend 451 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 452 copy_backward(_RAIter __f, 453 _RAIter __l, 454 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 455 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); 456 457 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 458 class _OutputIterator> 459 friend 460 _OutputIterator 461 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 462 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 463 _OutputIterator __r); 464 465 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 466 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 467 friend 468 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 469 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 470 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 471 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 472 473 template <class _RAIter, 474 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 475 friend 476 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 477 move(_RAIter __f, 478 _RAIter __l, 479 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 480 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); 481 482 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 483 class _OutputIterator> 484 friend 485 _OutputIterator 486 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 487 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 488 _OutputIterator __r); 489 490 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 491 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 492 friend 493 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 494 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 495 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 496 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 497 498 template <class _RAIter, 499 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 500 friend 501 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 502 move_backward(_RAIter __f, 503 _RAIter __l, 504 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 505 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*); 506 507 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 508 class _OutputIterator> 509 friend 510 _OutputIterator 511 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 512 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 513 _OutputIterator __r); 514 515 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 516 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 517 friend 518 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 519 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 520 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 521 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r); 522 }; 523 524 // copy 525 526 template <class _RAIter, 527 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 528 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 529 copy(_RAIter __f, 530 _RAIter __l, 531 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 532 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) 533 { 534 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; 535 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; 536 while (__f != __l) 537 { 538 pointer __rb = __r.__ptr_; 539 pointer __re = *__r.__m_iter_ + _B2; 540 difference_type __bs = __re - __rb; 541 difference_type __n = __l - __f; 542 _RAIter __m = __l; 543 if (__n > __bs) 544 { 545 __n = __bs; 546 __m = __f + __n; 547 } 548 _VSTD::copy(__f, __m, __rb); 549 __f = __m; 550 __r += __n; 551 } 552 return __r; 553 } 554 555 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 556 class _OutputIterator> 557 _OutputIterator 558 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 559 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 560 _OutputIterator __r) 561 { 562 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 563 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 564 difference_type __n = __l - __f; 565 while (__n > 0) 566 { 567 pointer __fb = __f.__ptr_; 568 pointer __fe = *__f.__m_iter_ + _B1; 569 difference_type __bs = __fe - __fb; 570 if (__bs > __n) 571 { 572 __bs = __n; 573 __fe = __fb + __bs; 574 } 575 __r = _VSTD::copy(__fb, __fe, __r); 576 __n -= __bs; 577 __f += __bs; 578 } 579 return __r; 580 } 581 582 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 583 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 584 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 585 copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 586 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 587 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) 588 { 589 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 590 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 591 difference_type __n = __l - __f; 592 while (__n > 0) 593 { 594 pointer __fb = __f.__ptr_; 595 pointer __fe = *__f.__m_iter_ + _B1; 596 difference_type __bs = __fe - __fb; 597 if (__bs > __n) 598 { 599 __bs = __n; 600 __fe = __fb + __bs; 601 } 602 __r = _VSTD::copy(__fb, __fe, __r); 603 __n -= __bs; 604 __f += __bs; 605 } 606 return __r; 607 } 608 609 // copy_backward 610 611 template <class _RAIter, 612 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 613 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 614 copy_backward(_RAIter __f, 615 _RAIter __l, 616 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 617 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) 618 { 619 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; 620 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; 621 while (__f != __l) 622 { 623 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r); 624 pointer __rb = *__rp.__m_iter_; 625 pointer __re = __rp.__ptr_ + 1; 626 difference_type __bs = __re - __rb; 627 difference_type __n = __l - __f; 628 _RAIter __m = __f; 629 if (__n > __bs) 630 { 631 __n = __bs; 632 __m = __l - __n; 633 } 634 _VSTD::copy_backward(__m, __l, __re); 635 __l = __m; 636 __r -= __n; 637 } 638 return __r; 639 } 640 641 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 642 class _OutputIterator> 643 _OutputIterator 644 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 645 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 646 _OutputIterator __r) 647 { 648 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 649 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 650 difference_type __n = __l - __f; 651 while (__n > 0) 652 { 653 --__l; 654 pointer __lb = *__l.__m_iter_; 655 pointer __le = __l.__ptr_ + 1; 656 difference_type __bs = __le - __lb; 657 if (__bs > __n) 658 { 659 __bs = __n; 660 __lb = __le - __bs; 661 } 662 __r = _VSTD::copy_backward(__lb, __le, __r); 663 __n -= __bs; 664 __l -= __bs - 1; 665 } 666 return __r; 667 } 668 669 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 670 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 671 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 672 copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 673 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 674 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) 675 { 676 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 677 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 678 difference_type __n = __l - __f; 679 while (__n > 0) 680 { 681 --__l; 682 pointer __lb = *__l.__m_iter_; 683 pointer __le = __l.__ptr_ + 1; 684 difference_type __bs = __le - __lb; 685 if (__bs > __n) 686 { 687 __bs = __n; 688 __lb = __le - __bs; 689 } 690 __r = _VSTD::copy_backward(__lb, __le, __r); 691 __n -= __bs; 692 __l -= __bs - 1; 693 } 694 return __r; 695 } 696 697 // move 698 699 template <class _RAIter, 700 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 701 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 702 move(_RAIter __f, 703 _RAIter __l, 704 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 705 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) 706 { 707 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; 708 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; 709 while (__f != __l) 710 { 711 pointer __rb = __r.__ptr_; 712 pointer __re = *__r.__m_iter_ + _B2; 713 difference_type __bs = __re - __rb; 714 difference_type __n = __l - __f; 715 _RAIter __m = __l; 716 if (__n > __bs) 717 { 718 __n = __bs; 719 __m = __f + __n; 720 } 721 _VSTD::move(__f, __m, __rb); 722 __f = __m; 723 __r += __n; 724 } 725 return __r; 726 } 727 728 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 729 class _OutputIterator> 730 _OutputIterator 731 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 732 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 733 _OutputIterator __r) 734 { 735 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 736 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 737 difference_type __n = __l - __f; 738 while (__n > 0) 739 { 740 pointer __fb = __f.__ptr_; 741 pointer __fe = *__f.__m_iter_ + _B1; 742 difference_type __bs = __fe - __fb; 743 if (__bs > __n) 744 { 745 __bs = __n; 746 __fe = __fb + __bs; 747 } 748 __r = _VSTD::move(__fb, __fe, __r); 749 __n -= __bs; 750 __f += __bs; 751 } 752 return __r; 753 } 754 755 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 756 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 757 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 758 move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 759 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 760 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) 761 { 762 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 763 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 764 difference_type __n = __l - __f; 765 while (__n > 0) 766 { 767 pointer __fb = __f.__ptr_; 768 pointer __fe = *__f.__m_iter_ + _B1; 769 difference_type __bs = __fe - __fb; 770 if (__bs > __n) 771 { 772 __bs = __n; 773 __fe = __fb + __bs; 774 } 775 __r = _VSTD::move(__fb, __fe, __r); 776 __n -= __bs; 777 __f += __bs; 778 } 779 return __r; 780 } 781 782 // move_backward 783 784 template <class _RAIter, 785 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 786 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 787 move_backward(_RAIter __f, 788 _RAIter __l, 789 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r, 790 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) 791 { 792 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type; 793 typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer; 794 while (__f != __l) 795 { 796 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r); 797 pointer __rb = *__rp.__m_iter_; 798 pointer __re = __rp.__ptr_ + 1; 799 difference_type __bs = __re - __rb; 800 difference_type __n = __l - __f; 801 _RAIter __m = __f; 802 if (__n > __bs) 803 { 804 __n = __bs; 805 __m = __l - __n; 806 } 807 _VSTD::move_backward(__m, __l, __re); 808 __l = __m; 809 __r -= __n; 810 } 811 return __r; 812 } 813 814 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 815 class _OutputIterator> 816 _OutputIterator 817 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 818 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 819 _OutputIterator __r) 820 { 821 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 822 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 823 difference_type __n = __l - __f; 824 while (__n > 0) 825 { 826 --__l; 827 pointer __lb = *__l.__m_iter_; 828 pointer __le = __l.__ptr_ + 1; 829 difference_type __bs = __le - __lb; 830 if (__bs > __n) 831 { 832 __bs = __n; 833 __lb = __le - __bs; 834 } 835 __r = _VSTD::move_backward(__lb, __le, __r); 836 __n -= __bs; 837 __l -= __bs - 1; 838 } 839 return __r; 840 } 841 842 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1, 843 class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2> 844 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> 845 move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f, 846 __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l, 847 __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r) 848 { 849 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type; 850 typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer; 851 difference_type __n = __l - __f; 852 while (__n > 0) 853 { 854 --__l; 855 pointer __lb = *__l.__m_iter_; 856 pointer __le = __l.__ptr_ + 1; 857 difference_type __bs = __le - __lb; 858 if (__bs > __n) 859 { 860 __bs = __n; 861 __lb = __le - __bs; 862 } 863 __r = _VSTD::move_backward(__lb, __le, __r); 864 __n -= __bs; 865 __l -= __bs - 1; 866 } 867 return __r; 868 } 869 870 template <bool> 871 class __deque_base_common 872 { 873 protected: 874 void __throw_length_error() const; 875 void __throw_out_of_range() const; 876 }; 877 878 template <bool __b> 879 void 880 __deque_base_common<__b>::__throw_length_error() const 881 { 882 #ifndef _LIBCPP_NO_EXCEPTIONS 883 throw length_error("deque"); 884 #endif 885 } 886 887 template <bool __b> 888 void 889 __deque_base_common<__b>::__throw_out_of_range() const 890 { 891 #ifndef _LIBCPP_NO_EXCEPTIONS 892 throw out_of_range("deque"); 893 #endif 894 } 895 896 template <class _Tp, class _Allocator> 897 class __deque_base 898 : protected __deque_base_common<true> 899 { 900 __deque_base(const __deque_base& __c); 901 __deque_base& operator=(const __deque_base& __c); 902 protected: 903 typedef _Tp value_type; 904 typedef _Allocator allocator_type; 905 typedef allocator_traits<allocator_type> __alloc_traits; 906 typedef value_type& reference; 907 typedef const value_type& const_reference; 908 typedef typename __alloc_traits::size_type size_type; 909 typedef typename __alloc_traits::difference_type difference_type; 910 typedef typename __alloc_traits::pointer pointer; 911 typedef typename __alloc_traits::const_pointer const_pointer; 912 913 static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16; 914 915 typedef typename __alloc_traits::template 916 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 917 rebind_alloc<pointer> 918 #else 919 rebind_alloc<pointer>::other 920 #endif 921 __pointer_allocator; 922 typedef allocator_traits<__pointer_allocator> __map_traits; 923 typedef typename __map_traits::pointer __map_pointer; 924 typedef typename __alloc_traits::template 925 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES 926 rebind_alloc<const_pointer> 927 #else 928 rebind_alloc<const_pointer>::other 929 #endif 930 __const_pointer_allocator; 931 typedef typename allocator_traits<__const_pointer_allocator>::const_pointer __map_const_pointer; 932 typedef __split_buffer<pointer, __pointer_allocator> __map; 933 934 typedef __deque_iterator<value_type, pointer, reference, __map_pointer, 935 difference_type, __block_size> iterator; 936 typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer, 937 difference_type, __block_size> const_iterator; 938 939 __map __map_; 940 size_type __start_; 941 __compressed_pair<size_type, allocator_type> __size_; 942 943 iterator begin() _NOEXCEPT; 944 const_iterator begin() const _NOEXCEPT; 945 iterator end() _NOEXCEPT; 946 const_iterator end() const _NOEXCEPT; 947 948 _LIBCPP_INLINE_VISIBILITY size_type& size() {return __size_.first();} 949 _LIBCPP_INLINE_VISIBILITY 950 const size_type& size() const _NOEXCEPT {return __size_.first();} 951 _LIBCPP_INLINE_VISIBILITY allocator_type& __alloc() {return __size_.second();} 952 _LIBCPP_INLINE_VISIBILITY 953 const allocator_type& __alloc() const _NOEXCEPT {return __size_.second();} 954 955 __deque_base() 956 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 957 explicit __deque_base(const allocator_type& __a); 958 public: 959 ~__deque_base(); 960 961 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 962 963 __deque_base(__deque_base&& __c) 964 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 965 __deque_base(__deque_base&& __c, const allocator_type& __a); 966 967 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 968 void swap(__deque_base& __c) 969 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 970 __is_nothrow_swappable<allocator_type>::value); 971 protected: 972 void clear() _NOEXCEPT; 973 974 bool __invariants() const; 975 976 _LIBCPP_INLINE_VISIBILITY 977 void __move_assign(__deque_base& __c) 978 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 979 is_nothrow_move_assignable<allocator_type>::value) 980 { 981 __map_ = _VSTD::move(__c.__map_); 982 __start_ = __c.__start_; 983 size() = __c.size(); 984 __move_assign_alloc(__c); 985 __c.__start_ = __c.size() = 0; 986 } 987 988 _LIBCPP_INLINE_VISIBILITY 989 void __move_assign_alloc(__deque_base& __c) 990 _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value || 991 is_nothrow_move_assignable<allocator_type>::value) 992 {__move_assign_alloc(__c, integral_constant<bool, 993 __alloc_traits::propagate_on_container_move_assignment::value>());} 994 995 private: 996 _LIBCPP_INLINE_VISIBILITY 997 void __move_assign_alloc(__deque_base& __c, true_type) 998 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 999 { 1000 __alloc() = _VSTD::move(__c.__alloc()); 1001 } 1002 1003 _LIBCPP_INLINE_VISIBILITY 1004 void __move_assign_alloc(__deque_base&, false_type) _NOEXCEPT 1005 {} 1006 1007 _LIBCPP_INLINE_VISIBILITY 1008 static void __swap_alloc(allocator_type& __x, allocator_type& __y) 1009 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 1010 __is_nothrow_swappable<allocator_type>::value) 1011 {__swap_alloc(__x, __y, integral_constant<bool, 1012 __alloc_traits::propagate_on_container_swap::value>());} 1013 1014 _LIBCPP_INLINE_VISIBILITY 1015 static void __swap_alloc(allocator_type& __x, allocator_type& __y, true_type) 1016 _NOEXCEPT_(__is_nothrow_swappable<allocator_type>::value) 1017 { 1018 using _VSTD::swap; 1019 swap(__x, __y); 1020 } 1021 1022 _LIBCPP_INLINE_VISIBILITY 1023 static void __swap_alloc(allocator_type&, allocator_type&, false_type) 1024 _NOEXCEPT 1025 {} 1026 }; 1027 1028 template <class _Tp, class _Allocator> 1029 bool 1030 __deque_base<_Tp, _Allocator>::__invariants() const 1031 { 1032 if (!__map_.__invariants()) 1033 return false; 1034 if (__map_.size() >= size_type(-1) / __block_size) 1035 return false; 1036 for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end(); 1037 __i != __e; ++__i) 1038 if (*__i == nullptr) 1039 return false; 1040 if (__map_.size() != 0) 1041 { 1042 if (size() >= __map_.size() * __block_size) 1043 return false; 1044 if (__start_ >= __map_.size() * __block_size - size()) 1045 return false; 1046 } 1047 else 1048 { 1049 if (size() != 0) 1050 return false; 1051 if (__start_ != 0) 1052 return false; 1053 } 1054 return true; 1055 } 1056 1057 template <class _Tp, class _Allocator> 1058 typename __deque_base<_Tp, _Allocator>::iterator 1059 __deque_base<_Tp, _Allocator>::begin() _NOEXCEPT 1060 { 1061 __map_pointer __mp = __map_.begin() + __start_ / __block_size; 1062 return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); 1063 } 1064 1065 template <class _Tp, class _Allocator> 1066 typename __deque_base<_Tp, _Allocator>::const_iterator 1067 __deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT 1068 { 1069 __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size); 1070 return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size); 1071 } 1072 1073 template <class _Tp, class _Allocator> 1074 typename __deque_base<_Tp, _Allocator>::iterator 1075 __deque_base<_Tp, _Allocator>::end() _NOEXCEPT 1076 { 1077 size_type __p = size() + __start_; 1078 __map_pointer __mp = __map_.begin() + __p / __block_size; 1079 return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); 1080 } 1081 1082 template <class _Tp, class _Allocator> 1083 typename __deque_base<_Tp, _Allocator>::const_iterator 1084 __deque_base<_Tp, _Allocator>::end() const _NOEXCEPT 1085 { 1086 size_type __p = size() + __start_; 1087 __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size); 1088 return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size); 1089 } 1090 1091 template <class _Tp, class _Allocator> 1092 inline _LIBCPP_INLINE_VISIBILITY 1093 __deque_base<_Tp, _Allocator>::__deque_base() 1094 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 1095 : __start_(0), __size_(0) {} 1096 1097 template <class _Tp, class _Allocator> 1098 inline _LIBCPP_INLINE_VISIBILITY 1099 __deque_base<_Tp, _Allocator>::__deque_base(const allocator_type& __a) 1100 : __map_(__pointer_allocator(__a)), __start_(0), __size_(0, __a) {} 1101 1102 template <class _Tp, class _Allocator> 1103 __deque_base<_Tp, _Allocator>::~__deque_base() 1104 { 1105 clear(); 1106 typename __map::iterator __i = __map_.begin(); 1107 typename __map::iterator __e = __map_.end(); 1108 for (; __i != __e; ++__i) 1109 __alloc_traits::deallocate(__alloc(), *__i, __block_size); 1110 } 1111 1112 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1113 1114 template <class _Tp, class _Allocator> 1115 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c) 1116 _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 1117 : __map_(_VSTD::move(__c.__map_)), 1118 __start_(_VSTD::move(__c.__start_)), 1119 __size_(_VSTD::move(__c.__size_)) 1120 { 1121 __c.__start_ = 0; 1122 __c.size() = 0; 1123 } 1124 1125 template <class _Tp, class _Allocator> 1126 __deque_base<_Tp, _Allocator>::__deque_base(__deque_base&& __c, const allocator_type& __a) 1127 : __map_(_VSTD::move(__c.__map_), __pointer_allocator(__a)), 1128 __start_(_VSTD::move(__c.__start_)), 1129 __size_(_VSTD::move(__c.size()), __a) 1130 { 1131 if (__a == __c.__alloc()) 1132 { 1133 __c.__start_ = 0; 1134 __c.size() = 0; 1135 } 1136 else 1137 { 1138 __map_.clear(); 1139 __start_ = 0; 1140 size() = 0; 1141 } 1142 } 1143 1144 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1145 1146 template <class _Tp, class _Allocator> 1147 void 1148 __deque_base<_Tp, _Allocator>::swap(__deque_base& __c) 1149 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value|| 1150 __is_nothrow_swappable<allocator_type>::value) 1151 { 1152 __map_.swap(__c.__map_); 1153 _VSTD::swap(__start_, __c.__start_); 1154 _VSTD::swap(size(), __c.size()); 1155 __swap_alloc(__alloc(), __c.__alloc()); 1156 } 1157 1158 template <class _Tp, class _Allocator> 1159 void 1160 __deque_base<_Tp, _Allocator>::clear() _NOEXCEPT 1161 { 1162 allocator_type& __a = __alloc(); 1163 for (iterator __i = begin(), __e = end(); __i != __e; ++__i) 1164 __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 1165 size() = 0; 1166 while (__map_.size() > 2) 1167 { 1168 __alloc_traits::deallocate(__a, __map_.front(), __block_size); 1169 __map_.pop_front(); 1170 } 1171 switch (__map_.size()) 1172 { 1173 case 1: 1174 __start_ = __block_size / 2; 1175 break; 1176 case 2: 1177 __start_ = __block_size; 1178 break; 1179 } 1180 } 1181 1182 template <class _Tp, class _Allocator /*= allocator<_Tp>*/> 1183 class _LIBCPP_TYPE_VIS_ONLY deque 1184 : private __deque_base<_Tp, _Allocator> 1185 { 1186 public: 1187 // types: 1188 1189 typedef _Tp value_type; 1190 typedef _Allocator allocator_type; 1191 1192 typedef __deque_base<value_type, allocator_type> __base; 1193 1194 typedef typename __base::__alloc_traits __alloc_traits; 1195 typedef typename __base::reference reference; 1196 typedef typename __base::const_reference const_reference; 1197 typedef typename __base::iterator iterator; 1198 typedef typename __base::const_iterator const_iterator; 1199 typedef typename __base::size_type size_type; 1200 typedef typename __base::difference_type difference_type; 1201 1202 typedef typename __base::pointer pointer; 1203 typedef typename __base::const_pointer const_pointer; 1204 typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 1205 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 1206 1207 // construct/copy/destroy: 1208 _LIBCPP_INLINE_VISIBILITY 1209 deque() 1210 _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 1211 {} 1212 _LIBCPP_INLINE_VISIBILITY explicit deque(const allocator_type& __a) : __base(__a) {} 1213 explicit deque(size_type __n); 1214 #if _LIBCPP_STD_VER > 11 1215 explicit deque(size_type __n, const _Allocator& __a); 1216 #endif 1217 deque(size_type __n, const value_type& __v); 1218 deque(size_type __n, const value_type& __v, const allocator_type& __a); 1219 template <class _InputIter> 1220 deque(_InputIter __f, _InputIter __l, 1221 typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0); 1222 template <class _InputIter> 1223 deque(_InputIter __f, _InputIter __l, const allocator_type& __a, 1224 typename enable_if<__is_input_iterator<_InputIter>::value>::type* = 0); 1225 deque(const deque& __c); 1226 deque(const deque& __c, const allocator_type& __a); 1227 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1228 deque(initializer_list<value_type> __il); 1229 deque(initializer_list<value_type> __il, const allocator_type& __a); 1230 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1231 1232 deque& operator=(const deque& __c); 1233 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1234 _LIBCPP_INLINE_VISIBILITY 1235 deque& operator=(initializer_list<value_type> __il) {assign(__il); return *this;} 1236 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1237 1238 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1239 deque(deque&& __c) _NOEXCEPT_(is_nothrow_move_constructible<__base>::value); 1240 deque(deque&& __c, const allocator_type& __a); 1241 deque& operator=(deque&& __c) 1242 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 1243 is_nothrow_move_assignable<allocator_type>::value); 1244 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1245 1246 template <class _InputIter> 1247 void assign(_InputIter __f, _InputIter __l, 1248 typename enable_if<__is_input_iterator<_InputIter>::value && 1249 !__is_random_access_iterator<_InputIter>::value>::type* = 0); 1250 template <class _RAIter> 1251 void assign(_RAIter __f, _RAIter __l, 1252 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0); 1253 void assign(size_type __n, const value_type& __v); 1254 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1255 _LIBCPP_INLINE_VISIBILITY 1256 void assign(initializer_list<value_type> __il) {assign(__il.begin(), __il.end());} 1257 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1258 1259 allocator_type get_allocator() const _NOEXCEPT; 1260 1261 // iterators: 1262 1263 _LIBCPP_INLINE_VISIBILITY 1264 iterator begin() _NOEXCEPT {return __base::begin();} 1265 _LIBCPP_INLINE_VISIBILITY 1266 const_iterator begin() const _NOEXCEPT {return __base::begin();} 1267 _LIBCPP_INLINE_VISIBILITY 1268 iterator end() _NOEXCEPT {return __base::end();} 1269 _LIBCPP_INLINE_VISIBILITY 1270 const_iterator end() const _NOEXCEPT {return __base::end();} 1271 1272 _LIBCPP_INLINE_VISIBILITY 1273 reverse_iterator rbegin() _NOEXCEPT 1274 {return reverse_iterator(__base::end());} 1275 _LIBCPP_INLINE_VISIBILITY 1276 const_reverse_iterator rbegin() const _NOEXCEPT 1277 {return const_reverse_iterator(__base::end());} 1278 _LIBCPP_INLINE_VISIBILITY 1279 reverse_iterator rend() _NOEXCEPT 1280 {return reverse_iterator(__base::begin());} 1281 _LIBCPP_INLINE_VISIBILITY 1282 const_reverse_iterator rend() const _NOEXCEPT 1283 {return const_reverse_iterator(__base::begin());} 1284 1285 _LIBCPP_INLINE_VISIBILITY 1286 const_iterator cbegin() const _NOEXCEPT 1287 {return __base::begin();} 1288 _LIBCPP_INLINE_VISIBILITY 1289 const_iterator cend() const _NOEXCEPT 1290 {return __base::end();} 1291 _LIBCPP_INLINE_VISIBILITY 1292 const_reverse_iterator crbegin() const _NOEXCEPT 1293 {return const_reverse_iterator(__base::end());} 1294 _LIBCPP_INLINE_VISIBILITY 1295 const_reverse_iterator crend() const _NOEXCEPT 1296 {return const_reverse_iterator(__base::begin());} 1297 1298 // capacity: 1299 _LIBCPP_INLINE_VISIBILITY 1300 size_type size() const _NOEXCEPT {return __base::size();} 1301 _LIBCPP_INLINE_VISIBILITY 1302 size_type max_size() const _NOEXCEPT 1303 {return __alloc_traits::max_size(__base::__alloc());} 1304 void resize(size_type __n); 1305 void resize(size_type __n, const value_type& __v); 1306 void shrink_to_fit() _NOEXCEPT; 1307 _LIBCPP_INLINE_VISIBILITY 1308 bool empty() const _NOEXCEPT {return __base::size() == 0;} 1309 1310 // element access: 1311 reference operator[](size_type __i); 1312 const_reference operator[](size_type __i) const; 1313 reference at(size_type __i); 1314 const_reference at(size_type __i) const; 1315 reference front(); 1316 const_reference front() const; 1317 reference back(); 1318 const_reference back() const; 1319 1320 // 23.2.2.3 modifiers: 1321 void push_front(const value_type& __v); 1322 void push_back(const value_type& __v); 1323 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1324 #ifndef _LIBCPP_HAS_NO_VARIADICS 1325 template <class... _Args> void emplace_front(_Args&&... __args); 1326 template <class... _Args> void emplace_back(_Args&&... __args); 1327 template <class... _Args> iterator emplace(const_iterator __p, _Args&&... __args); 1328 #endif // _LIBCPP_HAS_NO_VARIADICS 1329 void push_front(value_type&& __v); 1330 void push_back(value_type&& __v); 1331 iterator insert(const_iterator __p, value_type&& __v); 1332 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1333 iterator insert(const_iterator __p, const value_type& __v); 1334 iterator insert(const_iterator __p, size_type __n, const value_type& __v); 1335 template <class _InputIter> 1336 iterator insert(const_iterator __p, _InputIter __f, _InputIter __l, 1337 typename enable_if<__is_input_iterator<_InputIter>::value 1338 &&!__is_forward_iterator<_InputIter>::value>::type* = 0); 1339 template <class _ForwardIterator> 1340 iterator insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l, 1341 typename enable_if<__is_forward_iterator<_ForwardIterator>::value 1342 &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type* = 0); 1343 template <class _BiIter> 1344 iterator insert(const_iterator __p, _BiIter __f, _BiIter __l, 1345 typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type* = 0); 1346 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1347 _LIBCPP_INLINE_VISIBILITY 1348 iterator insert(const_iterator __p, initializer_list<value_type> __il) 1349 {return insert(__p, __il.begin(), __il.end());} 1350 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1351 void pop_front(); 1352 void pop_back(); 1353 iterator erase(const_iterator __p); 1354 iterator erase(const_iterator __f, const_iterator __l); 1355 1356 void swap(deque& __c) 1357 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 1358 __is_nothrow_swappable<allocator_type>::value); 1359 void clear() _NOEXCEPT; 1360 1361 _LIBCPP_INLINE_VISIBILITY 1362 bool __invariants() const {return __base::__invariants();} 1363 private: 1364 typedef typename __base::__map_const_pointer __map_const_pointer; 1365 1366 _LIBCPP_INLINE_VISIBILITY 1367 static size_type __recommend_blocks(size_type __n) 1368 { 1369 return __n / __base::__block_size + (__n % __base::__block_size != 0); 1370 } 1371 _LIBCPP_INLINE_VISIBILITY 1372 size_type __capacity() const 1373 { 1374 return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1; 1375 } 1376 _LIBCPP_INLINE_VISIBILITY 1377 size_type __front_spare() const 1378 { 1379 return __base::__start_; 1380 } 1381 _LIBCPP_INLINE_VISIBILITY 1382 size_type __back_spare() const 1383 { 1384 return __capacity() - (__base::__start_ + __base::size()); 1385 } 1386 1387 template <class _InpIter> 1388 void __append(_InpIter __f, _InpIter __l, 1389 typename enable_if<__is_input_iterator<_InpIter>::value && 1390 !__is_forward_iterator<_InpIter>::value>::type* = 0); 1391 template <class _ForIter> 1392 void __append(_ForIter __f, _ForIter __l, 1393 typename enable_if<__is_forward_iterator<_ForIter>::value>::type* = 0); 1394 void __append(size_type __n); 1395 void __append(size_type __n, const value_type& __v); 1396 void __erase_to_end(const_iterator __f); 1397 void __add_front_capacity(); 1398 void __add_front_capacity(size_type __n); 1399 void __add_back_capacity(); 1400 void __add_back_capacity(size_type __n); 1401 iterator __move_and_check(iterator __f, iterator __l, iterator __r, 1402 const_pointer& __vt); 1403 iterator __move_backward_and_check(iterator __f, iterator __l, iterator __r, 1404 const_pointer& __vt); 1405 void __move_construct_and_check(iterator __f, iterator __l, 1406 iterator __r, const_pointer& __vt); 1407 void __move_construct_backward_and_check(iterator __f, iterator __l, 1408 iterator __r, const_pointer& __vt); 1409 1410 _LIBCPP_INLINE_VISIBILITY 1411 void __copy_assign_alloc(const deque& __c) 1412 {__copy_assign_alloc(__c, integral_constant<bool, 1413 __alloc_traits::propagate_on_container_copy_assignment::value>());} 1414 1415 _LIBCPP_INLINE_VISIBILITY 1416 void __copy_assign_alloc(const deque& __c, true_type) 1417 { 1418 if (__base::__alloc() != __c.__alloc()) 1419 { 1420 clear(); 1421 shrink_to_fit(); 1422 } 1423 __base::__alloc() = __c.__alloc(); 1424 __base::__map_.__alloc() = __c.__map_.__alloc(); 1425 } 1426 1427 _LIBCPP_INLINE_VISIBILITY 1428 void __copy_assign_alloc(const deque&, false_type) 1429 {} 1430 1431 void __move_assign(deque& __c, true_type) 1432 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 1433 void __move_assign(deque& __c, false_type); 1434 }; 1435 1436 template <class _Tp, class _Allocator> 1437 deque<_Tp, _Allocator>::deque(size_type __n) 1438 { 1439 if (__n > 0) 1440 __append(__n); 1441 } 1442 1443 #if _LIBCPP_STD_VER > 11 1444 template <class _Tp, class _Allocator> 1445 deque<_Tp, _Allocator>::deque(size_type __n, const _Allocator& __a) 1446 : __base(__a) 1447 { 1448 if (__n > 0) 1449 __append(__n); 1450 } 1451 #endif 1452 1453 template <class _Tp, class _Allocator> 1454 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v) 1455 { 1456 if (__n > 0) 1457 __append(__n, __v); 1458 } 1459 1460 template <class _Tp, class _Allocator> 1461 deque<_Tp, _Allocator>::deque(size_type __n, const value_type& __v, const allocator_type& __a) 1462 : __base(__a) 1463 { 1464 if (__n > 0) 1465 __append(__n, __v); 1466 } 1467 1468 template <class _Tp, class _Allocator> 1469 template <class _InputIter> 1470 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, 1471 typename enable_if<__is_input_iterator<_InputIter>::value>::type*) 1472 { 1473 __append(__f, __l); 1474 } 1475 1476 template <class _Tp, class _Allocator> 1477 template <class _InputIter> 1478 deque<_Tp, _Allocator>::deque(_InputIter __f, _InputIter __l, const allocator_type& __a, 1479 typename enable_if<__is_input_iterator<_InputIter>::value>::type*) 1480 : __base(__a) 1481 { 1482 __append(__f, __l); 1483 } 1484 1485 template <class _Tp, class _Allocator> 1486 deque<_Tp, _Allocator>::deque(const deque& __c) 1487 : __base(__alloc_traits::select_on_container_copy_construction(__c.__alloc())) 1488 { 1489 __append(__c.begin(), __c.end()); 1490 } 1491 1492 template <class _Tp, class _Allocator> 1493 deque<_Tp, _Allocator>::deque(const deque& __c, const allocator_type& __a) 1494 : __base(__a) 1495 { 1496 __append(__c.begin(), __c.end()); 1497 } 1498 1499 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1500 1501 template <class _Tp, class _Allocator> 1502 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il) 1503 { 1504 __append(__il.begin(), __il.end()); 1505 } 1506 1507 template <class _Tp, class _Allocator> 1508 deque<_Tp, _Allocator>::deque(initializer_list<value_type> __il, const allocator_type& __a) 1509 : __base(__a) 1510 { 1511 __append(__il.begin(), __il.end()); 1512 } 1513 1514 #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS 1515 1516 template <class _Tp, class _Allocator> 1517 deque<_Tp, _Allocator>& 1518 deque<_Tp, _Allocator>::operator=(const deque& __c) 1519 { 1520 if (this != &__c) 1521 { 1522 __copy_assign_alloc(__c); 1523 assign(__c.begin(), __c.end()); 1524 } 1525 return *this; 1526 } 1527 1528 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1529 1530 template <class _Tp, class _Allocator> 1531 inline _LIBCPP_INLINE_VISIBILITY 1532 deque<_Tp, _Allocator>::deque(deque&& __c) 1533 _NOEXCEPT_(is_nothrow_move_constructible<__base>::value) 1534 : __base(_VSTD::move(__c)) 1535 { 1536 } 1537 1538 template <class _Tp, class _Allocator> 1539 inline _LIBCPP_INLINE_VISIBILITY 1540 deque<_Tp, _Allocator>::deque(deque&& __c, const allocator_type& __a) 1541 : __base(_VSTD::move(__c), __a) 1542 { 1543 if (__a != __c.__alloc()) 1544 { 1545 typedef move_iterator<iterator> _Ip; 1546 assign(_Ip(__c.begin()), _Ip(__c.end())); 1547 } 1548 } 1549 1550 template <class _Tp, class _Allocator> 1551 inline _LIBCPP_INLINE_VISIBILITY 1552 deque<_Tp, _Allocator>& 1553 deque<_Tp, _Allocator>::operator=(deque&& __c) 1554 _NOEXCEPT_(__alloc_traits::propagate_on_container_move_assignment::value && 1555 is_nothrow_move_assignable<allocator_type>::value) 1556 { 1557 __move_assign(__c, integral_constant<bool, 1558 __alloc_traits::propagate_on_container_move_assignment::value>()); 1559 return *this; 1560 } 1561 1562 template <class _Tp, class _Allocator> 1563 void 1564 deque<_Tp, _Allocator>::__move_assign(deque& __c, false_type) 1565 { 1566 if (__base::__alloc() != __c.__alloc()) 1567 { 1568 typedef move_iterator<iterator> _Ip; 1569 assign(_Ip(__c.begin()), _Ip(__c.end())); 1570 } 1571 else 1572 __move_assign(__c, true_type()); 1573 } 1574 1575 template <class _Tp, class _Allocator> 1576 void 1577 deque<_Tp, _Allocator>::__move_assign(deque& __c, true_type) 1578 _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) 1579 { 1580 clear(); 1581 shrink_to_fit(); 1582 __base::__move_assign(__c); 1583 } 1584 1585 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1586 1587 template <class _Tp, class _Allocator> 1588 template <class _InputIter> 1589 void 1590 deque<_Tp, _Allocator>::assign(_InputIter __f, _InputIter __l, 1591 typename enable_if<__is_input_iterator<_InputIter>::value && 1592 !__is_random_access_iterator<_InputIter>::value>::type*) 1593 { 1594 iterator __i = __base::begin(); 1595 iterator __e = __base::end(); 1596 for (; __f != __l && __i != __e; ++__f, (void) ++__i) 1597 *__i = *__f; 1598 if (__f != __l) 1599 __append(__f, __l); 1600 else 1601 __erase_to_end(__i); 1602 } 1603 1604 template <class _Tp, class _Allocator> 1605 template <class _RAIter> 1606 void 1607 deque<_Tp, _Allocator>::assign(_RAIter __f, _RAIter __l, 1608 typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*) 1609 { 1610 if (static_cast<size_type>(__l - __f) > __base::size()) 1611 { 1612 _RAIter __m = __f + __base::size(); 1613 _VSTD::copy(__f, __m, __base::begin()); 1614 __append(__m, __l); 1615 } 1616 else 1617 __erase_to_end(_VSTD::copy(__f, __l, __base::begin())); 1618 } 1619 1620 template <class _Tp, class _Allocator> 1621 void 1622 deque<_Tp, _Allocator>::assign(size_type __n, const value_type& __v) 1623 { 1624 if (__n > __base::size()) 1625 { 1626 _VSTD::fill_n(__base::begin(), __base::size(), __v); 1627 __n -= __base::size(); 1628 __append(__n, __v); 1629 } 1630 else 1631 __erase_to_end(_VSTD::fill_n(__base::begin(), __n, __v)); 1632 } 1633 1634 template <class _Tp, class _Allocator> 1635 inline _LIBCPP_INLINE_VISIBILITY 1636 _Allocator 1637 deque<_Tp, _Allocator>::get_allocator() const _NOEXCEPT 1638 { 1639 return __base::__alloc(); 1640 } 1641 1642 template <class _Tp, class _Allocator> 1643 void 1644 deque<_Tp, _Allocator>::resize(size_type __n) 1645 { 1646 if (__n > __base::size()) 1647 __append(__n - __base::size()); 1648 else if (__n < __base::size()) 1649 __erase_to_end(__base::begin() + __n); 1650 } 1651 1652 template <class _Tp, class _Allocator> 1653 void 1654 deque<_Tp, _Allocator>::resize(size_type __n, const value_type& __v) 1655 { 1656 if (__n > __base::size()) 1657 __append(__n - __base::size(), __v); 1658 else if (__n < __base::size()) 1659 __erase_to_end(__base::begin() + __n); 1660 } 1661 1662 template <class _Tp, class _Allocator> 1663 void 1664 deque<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT 1665 { 1666 allocator_type& __a = __base::__alloc(); 1667 if (empty()) 1668 { 1669 while (__base::__map_.size() > 0) 1670 { 1671 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 1672 __base::__map_.pop_back(); 1673 } 1674 __base::__start_ = 0; 1675 } 1676 else 1677 { 1678 if (__front_spare() >= __base::__block_size) 1679 { 1680 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); 1681 __base::__map_.pop_front(); 1682 __base::__start_ -= __base::__block_size; 1683 } 1684 if (__back_spare() >= __base::__block_size) 1685 { 1686 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 1687 __base::__map_.pop_back(); 1688 } 1689 } 1690 __base::__map_.shrink_to_fit(); 1691 } 1692 1693 template <class _Tp, class _Allocator> 1694 inline _LIBCPP_INLINE_VISIBILITY 1695 typename deque<_Tp, _Allocator>::reference 1696 deque<_Tp, _Allocator>::operator[](size_type __i) 1697 { 1698 size_type __p = __base::__start_ + __i; 1699 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1700 } 1701 1702 template <class _Tp, class _Allocator> 1703 inline _LIBCPP_INLINE_VISIBILITY 1704 typename deque<_Tp, _Allocator>::const_reference 1705 deque<_Tp, _Allocator>::operator[](size_type __i) const 1706 { 1707 size_type __p = __base::__start_ + __i; 1708 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1709 } 1710 1711 template <class _Tp, class _Allocator> 1712 inline _LIBCPP_INLINE_VISIBILITY 1713 typename deque<_Tp, _Allocator>::reference 1714 deque<_Tp, _Allocator>::at(size_type __i) 1715 { 1716 if (__i >= __base::size()) 1717 __base::__throw_out_of_range(); 1718 size_type __p = __base::__start_ + __i; 1719 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1720 } 1721 1722 template <class _Tp, class _Allocator> 1723 inline _LIBCPP_INLINE_VISIBILITY 1724 typename deque<_Tp, _Allocator>::const_reference 1725 deque<_Tp, _Allocator>::at(size_type __i) const 1726 { 1727 if (__i >= __base::size()) 1728 __base::__throw_out_of_range(); 1729 size_type __p = __base::__start_ + __i; 1730 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1731 } 1732 1733 template <class _Tp, class _Allocator> 1734 inline _LIBCPP_INLINE_VISIBILITY 1735 typename deque<_Tp, _Allocator>::reference 1736 deque<_Tp, _Allocator>::front() 1737 { 1738 return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size) 1739 + __base::__start_ % __base::__block_size); 1740 } 1741 1742 template <class _Tp, class _Allocator> 1743 inline _LIBCPP_INLINE_VISIBILITY 1744 typename deque<_Tp, _Allocator>::const_reference 1745 deque<_Tp, _Allocator>::front() const 1746 { 1747 return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size) 1748 + __base::__start_ % __base::__block_size); 1749 } 1750 1751 template <class _Tp, class _Allocator> 1752 inline _LIBCPP_INLINE_VISIBILITY 1753 typename deque<_Tp, _Allocator>::reference 1754 deque<_Tp, _Allocator>::back() 1755 { 1756 size_type __p = __base::size() + __base::__start_ - 1; 1757 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1758 } 1759 1760 template <class _Tp, class _Allocator> 1761 inline _LIBCPP_INLINE_VISIBILITY 1762 typename deque<_Tp, _Allocator>::const_reference 1763 deque<_Tp, _Allocator>::back() const 1764 { 1765 size_type __p = __base::size() + __base::__start_ - 1; 1766 return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size); 1767 } 1768 1769 template <class _Tp, class _Allocator> 1770 void 1771 deque<_Tp, _Allocator>::push_back(const value_type& __v) 1772 { 1773 allocator_type& __a = __base::__alloc(); 1774 if (__back_spare() == 0) 1775 __add_back_capacity(); 1776 // __back_spare() >= 1 1777 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v); 1778 ++__base::size(); 1779 } 1780 1781 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1782 1783 template <class _Tp, class _Allocator> 1784 void 1785 deque<_Tp, _Allocator>::push_back(value_type&& __v) 1786 { 1787 allocator_type& __a = __base::__alloc(); 1788 if (__back_spare() == 0) 1789 __add_back_capacity(); 1790 // __back_spare() >= 1 1791 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v)); 1792 ++__base::size(); 1793 } 1794 1795 #ifndef _LIBCPP_HAS_NO_VARIADICS 1796 1797 template <class _Tp, class _Allocator> 1798 template <class... _Args> 1799 void 1800 deque<_Tp, _Allocator>::emplace_back(_Args&&... __args) 1801 { 1802 allocator_type& __a = __base::__alloc(); 1803 if (__back_spare() == 0) 1804 __add_back_capacity(); 1805 // __back_spare() >= 1 1806 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...); 1807 ++__base::size(); 1808 } 1809 1810 #endif // _LIBCPP_HAS_NO_VARIADICS 1811 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1812 1813 template <class _Tp, class _Allocator> 1814 void 1815 deque<_Tp, _Allocator>::push_front(const value_type& __v) 1816 { 1817 allocator_type& __a = __base::__alloc(); 1818 if (__front_spare() == 0) 1819 __add_front_capacity(); 1820 // __front_spare() >= 1 1821 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v); 1822 --__base::__start_; 1823 ++__base::size(); 1824 } 1825 1826 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1827 1828 template <class _Tp, class _Allocator> 1829 void 1830 deque<_Tp, _Allocator>::push_front(value_type&& __v) 1831 { 1832 allocator_type& __a = __base::__alloc(); 1833 if (__front_spare() == 0) 1834 __add_front_capacity(); 1835 // __front_spare() >= 1 1836 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v)); 1837 --__base::__start_; 1838 ++__base::size(); 1839 } 1840 1841 #ifndef _LIBCPP_HAS_NO_VARIADICS 1842 1843 template <class _Tp, class _Allocator> 1844 template <class... _Args> 1845 void 1846 deque<_Tp, _Allocator>::emplace_front(_Args&&... __args) 1847 { 1848 allocator_type& __a = __base::__alloc(); 1849 if (__front_spare() == 0) 1850 __add_front_capacity(); 1851 // __front_spare() >= 1 1852 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...); 1853 --__base::__start_; 1854 ++__base::size(); 1855 } 1856 1857 #endif // _LIBCPP_HAS_NO_VARIADICS 1858 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 1859 1860 template <class _Tp, class _Allocator> 1861 typename deque<_Tp, _Allocator>::iterator 1862 deque<_Tp, _Allocator>::insert(const_iterator __p, const value_type& __v) 1863 { 1864 size_type __pos = __p - __base::begin(); 1865 size_type __to_end = __base::size() - __pos; 1866 allocator_type& __a = __base::__alloc(); 1867 if (__pos < __to_end) 1868 { // insert by shifting things backward 1869 if (__front_spare() == 0) 1870 __add_front_capacity(); 1871 // __front_spare() >= 1 1872 if (__pos == 0) 1873 { 1874 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), __v); 1875 --__base::__start_; 1876 ++__base::size(); 1877 } 1878 else 1879 { 1880 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 1881 iterator __b = __base::begin(); 1882 iterator __bm1 = _VSTD::prev(__b); 1883 if (__vt == pointer_traits<const_pointer>::pointer_to(*__b)) 1884 __vt = pointer_traits<const_pointer>::pointer_to(*__bm1); 1885 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 1886 --__base::__start_; 1887 ++__base::size(); 1888 if (__pos > 1) 1889 __b = __move_and_check(_VSTD::next(__b), __b + __pos, __b, __vt); 1890 *__b = *__vt; 1891 } 1892 } 1893 else 1894 { // insert by shifting things forward 1895 if (__back_spare() == 0) 1896 __add_back_capacity(); 1897 // __back_capacity >= 1 1898 size_type __de = __base::size() - __pos; 1899 if (__de == 0) 1900 { 1901 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), __v); 1902 ++__base::size(); 1903 } 1904 else 1905 { 1906 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 1907 iterator __e = __base::end(); 1908 iterator __em1 = _VSTD::prev(__e); 1909 if (__vt == pointer_traits<const_pointer>::pointer_to(*__em1)) 1910 __vt = pointer_traits<const_pointer>::pointer_to(*__e); 1911 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 1912 ++__base::size(); 1913 if (__de > 1) 1914 __e = __move_backward_and_check(__e - __de, __em1, __e, __vt); 1915 *--__e = *__vt; 1916 } 1917 } 1918 return __base::begin() + __pos; 1919 } 1920 1921 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 1922 1923 template <class _Tp, class _Allocator> 1924 typename deque<_Tp, _Allocator>::iterator 1925 deque<_Tp, _Allocator>::insert(const_iterator __p, value_type&& __v) 1926 { 1927 size_type __pos = __p - __base::begin(); 1928 size_type __to_end = __base::size() - __pos; 1929 allocator_type& __a = __base::__alloc(); 1930 if (__pos < __to_end) 1931 { // insert by shifting things backward 1932 if (__front_spare() == 0) 1933 __add_front_capacity(); 1934 // __front_spare() >= 1 1935 if (__pos == 0) 1936 { 1937 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::move(__v)); 1938 --__base::__start_; 1939 ++__base::size(); 1940 } 1941 else 1942 { 1943 iterator __b = __base::begin(); 1944 iterator __bm1 = _VSTD::prev(__b); 1945 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 1946 --__base::__start_; 1947 ++__base::size(); 1948 if (__pos > 1) 1949 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); 1950 *__b = _VSTD::move(__v); 1951 } 1952 } 1953 else 1954 { // insert by shifting things forward 1955 if (__back_spare() == 0) 1956 __add_back_capacity(); 1957 // __back_capacity >= 1 1958 size_type __de = __base::size() - __pos; 1959 if (__de == 0) 1960 { 1961 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::move(__v)); 1962 ++__base::size(); 1963 } 1964 else 1965 { 1966 iterator __e = __base::end(); 1967 iterator __em1 = _VSTD::prev(__e); 1968 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 1969 ++__base::size(); 1970 if (__de > 1) 1971 __e = _VSTD::move_backward(__e - __de, __em1, __e); 1972 *--__e = _VSTD::move(__v); 1973 } 1974 } 1975 return __base::begin() + __pos; 1976 } 1977 1978 #ifndef _LIBCPP_HAS_NO_VARIADICS 1979 1980 template <class _Tp, class _Allocator> 1981 template <class... _Args> 1982 typename deque<_Tp, _Allocator>::iterator 1983 deque<_Tp, _Allocator>::emplace(const_iterator __p, _Args&&... __args) 1984 { 1985 size_type __pos = __p - __base::begin(); 1986 size_type __to_end = __base::size() - __pos; 1987 allocator_type& __a = __base::__alloc(); 1988 if (__pos < __to_end) 1989 { // insert by shifting things backward 1990 if (__front_spare() == 0) 1991 __add_front_capacity(); 1992 // __front_spare() >= 1 1993 if (__pos == 0) 1994 { 1995 __alloc_traits::construct(__a, _VSTD::addressof(*--__base::begin()), _VSTD::forward<_Args>(__args)...); 1996 --__base::__start_; 1997 ++__base::size(); 1998 } 1999 else 2000 { 2001 value_type __tmp(_VSTD::forward<_Args>(__args)...); 2002 iterator __b = __base::begin(); 2003 iterator __bm1 = _VSTD::prev(__b); 2004 __alloc_traits::construct(__a, _VSTD::addressof(*__bm1), _VSTD::move(*__b)); 2005 --__base::__start_; 2006 ++__base::size(); 2007 if (__pos > 1) 2008 __b = _VSTD::move(_VSTD::next(__b), __b + __pos, __b); 2009 *__b = _VSTD::move(__tmp); 2010 } 2011 } 2012 else 2013 { // insert by shifting things forward 2014 if (__back_spare() == 0) 2015 __add_back_capacity(); 2016 // __back_capacity >= 1 2017 size_type __de = __base::size() - __pos; 2018 if (__de == 0) 2019 { 2020 __alloc_traits::construct(__a, _VSTD::addressof(*__base::end()), _VSTD::forward<_Args>(__args)...); 2021 ++__base::size(); 2022 } 2023 else 2024 { 2025 value_type __tmp(_VSTD::forward<_Args>(__args)...); 2026 iterator __e = __base::end(); 2027 iterator __em1 = _VSTD::prev(__e); 2028 __alloc_traits::construct(__a, _VSTD::addressof(*__e), _VSTD::move(*__em1)); 2029 ++__base::size(); 2030 if (__de > 1) 2031 __e = _VSTD::move_backward(__e - __de, __em1, __e); 2032 *--__e = _VSTD::move(__tmp); 2033 } 2034 } 2035 return __base::begin() + __pos; 2036 } 2037 2038 #endif // _LIBCPP_HAS_NO_VARIADICS 2039 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 2040 2041 template <class _Tp, class _Allocator> 2042 typename deque<_Tp, _Allocator>::iterator 2043 deque<_Tp, _Allocator>::insert(const_iterator __p, size_type __n, const value_type& __v) 2044 { 2045 size_type __pos = __p - __base::begin(); 2046 size_type __to_end = __base::size() - __pos; 2047 allocator_type& __a = __base::__alloc(); 2048 if (__pos < __to_end) 2049 { // insert by shifting things backward 2050 if (__n > __front_spare()) 2051 __add_front_capacity(__n - __front_spare()); 2052 // __n <= __front_spare() 2053 size_type __old_n = __n; 2054 iterator __old_begin = __base::begin(); 2055 iterator __i = __old_begin; 2056 if (__n > __pos) 2057 { 2058 for (size_type __m = __n - __pos; __m; --__m, --__base::__start_, ++__base::size()) 2059 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), __v); 2060 __n = __pos; 2061 } 2062 if (__n > 0) 2063 { 2064 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 2065 iterator __obn = __old_begin + __n; 2066 __move_construct_backward_and_check(__old_begin, __obn, __i, __vt); 2067 if (__n < __pos) 2068 __old_begin = __move_and_check(__obn, __old_begin + __pos, __old_begin, __vt); 2069 _VSTD::fill_n(__old_begin, __n, *__vt); 2070 } 2071 } 2072 else 2073 { // insert by shifting things forward 2074 size_type __back_capacity = __back_spare(); 2075 if (__n > __back_capacity) 2076 __add_back_capacity(__n - __back_capacity); 2077 // __n <= __back_capacity 2078 size_type __old_n = __n; 2079 iterator __old_end = __base::end(); 2080 iterator __i = __old_end; 2081 size_type __de = __base::size() - __pos; 2082 if (__n > __de) 2083 { 2084 for (size_type __m = __n - __de; __m; --__m, ++__i, ++__base::size()) 2085 __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v); 2086 __n = __de; 2087 } 2088 if (__n > 0) 2089 { 2090 const_pointer __vt = pointer_traits<const_pointer>::pointer_to(__v); 2091 iterator __oen = __old_end - __n; 2092 __move_construct_and_check(__oen, __old_end, __i, __vt); 2093 if (__n < __de) 2094 __old_end = __move_backward_and_check(__old_end - __de, __oen, __old_end, __vt); 2095 _VSTD::fill_n(__old_end - __n, __n, *__vt); 2096 } 2097 } 2098 return __base::begin() + __pos; 2099 } 2100 2101 template <class _Tp, class _Allocator> 2102 template <class _InputIter> 2103 typename deque<_Tp, _Allocator>::iterator 2104 deque<_Tp, _Allocator>::insert(const_iterator __p, _InputIter __f, _InputIter __l, 2105 typename enable_if<__is_input_iterator<_InputIter>::value 2106 &&!__is_forward_iterator<_InputIter>::value>::type*) 2107 { 2108 __split_buffer<value_type, allocator_type&> __buf(__base::__alloc()); 2109 __buf.__construct_at_end(__f, __l); 2110 typedef typename __split_buffer<value_type, allocator_type&>::iterator __bi; 2111 return insert(__p, move_iterator<__bi>(__buf.begin()), move_iterator<__bi>(__buf.end())); 2112 } 2113 2114 template <class _Tp, class _Allocator> 2115 template <class _ForwardIterator> 2116 typename deque<_Tp, _Allocator>::iterator 2117 deque<_Tp, _Allocator>::insert(const_iterator __p, _ForwardIterator __f, _ForwardIterator __l, 2118 typename enable_if<__is_forward_iterator<_ForwardIterator>::value 2119 &&!__is_bidirectional_iterator<_ForwardIterator>::value>::type*) 2120 { 2121 size_type __n = _VSTD::distance(__f, __l); 2122 __split_buffer<value_type, allocator_type&> __buf(__n, 0, __base::__alloc()); 2123 __buf.__construct_at_end(__f, __l); 2124 typedef typename __split_buffer<value_type, allocator_type&>::iterator __fwd; 2125 return insert(__p, move_iterator<__fwd>(__buf.begin()), move_iterator<__fwd>(__buf.end())); 2126 } 2127 2128 template <class _Tp, class _Allocator> 2129 template <class _BiIter> 2130 typename deque<_Tp, _Allocator>::iterator 2131 deque<_Tp, _Allocator>::insert(const_iterator __p, _BiIter __f, _BiIter __l, 2132 typename enable_if<__is_bidirectional_iterator<_BiIter>::value>::type*) 2133 { 2134 size_type __n = _VSTD::distance(__f, __l); 2135 size_type __pos = __p - __base::begin(); 2136 size_type __to_end = __base::size() - __pos; 2137 allocator_type& __a = __base::__alloc(); 2138 if (__pos < __to_end) 2139 { // insert by shifting things backward 2140 if (__n > __front_spare()) 2141 __add_front_capacity(__n - __front_spare()); 2142 // __n <= __front_spare() 2143 size_type __old_n = __n; 2144 iterator __old_begin = __base::begin(); 2145 iterator __i = __old_begin; 2146 _BiIter __m = __f; 2147 if (__n > __pos) 2148 { 2149 __m = __pos < __n / 2 ? _VSTD::prev(__l, __pos) : _VSTD::next(__f, __n - __pos); 2150 for (_BiIter __j = __m; __j != __f; --__base::__start_, ++__base::size()) 2151 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), *--__j); 2152 __n = __pos; 2153 } 2154 if (__n > 0) 2155 { 2156 iterator __obn = __old_begin + __n; 2157 for (iterator __j = __obn; __j != __old_begin;) 2158 { 2159 __alloc_traits::construct(__a, _VSTD::addressof(*--__i), _VSTD::move(*--__j)); 2160 --__base::__start_; 2161 ++__base::size(); 2162 } 2163 if (__n < __pos) 2164 __old_begin = _VSTD::move(__obn, __old_begin + __pos, __old_begin); 2165 _VSTD::copy(__m, __l, __old_begin); 2166 } 2167 } 2168 else 2169 { // insert by shifting things forward 2170 size_type __back_capacity = __back_spare(); 2171 if (__n > __back_capacity) 2172 __add_back_capacity(__n - __back_capacity); 2173 // __n <= __back_capacity 2174 size_type __old_n = __n; 2175 iterator __old_end = __base::end(); 2176 iterator __i = __old_end; 2177 _BiIter __m = __l; 2178 size_type __de = __base::size() - __pos; 2179 if (__n > __de) 2180 { 2181 __m = __de < __n / 2 ? _VSTD::next(__f, __de) : _VSTD::prev(__l, __n - __de); 2182 for (_BiIter __j = __m; __j != __l; ++__i, (void) ++__j, ++__base::size()) 2183 __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__j); 2184 __n = __de; 2185 } 2186 if (__n > 0) 2187 { 2188 iterator __oen = __old_end - __n; 2189 for (iterator __j = __oen; __j != __old_end; ++__i, ++__j, ++__base::size()) 2190 __alloc_traits::construct(__a, _VSTD::addressof(*__i), _VSTD::move(*__j)); 2191 if (__n < __de) 2192 __old_end = _VSTD::move_backward(__old_end - __de, __oen, __old_end); 2193 _VSTD::copy_backward(__f, __m, __old_end); 2194 } 2195 } 2196 return __base::begin() + __pos; 2197 } 2198 2199 template <class _Tp, class _Allocator> 2200 template <class _InpIter> 2201 void 2202 deque<_Tp, _Allocator>::__append(_InpIter __f, _InpIter __l, 2203 typename enable_if<__is_input_iterator<_InpIter>::value && 2204 !__is_forward_iterator<_InpIter>::value>::type*) 2205 { 2206 for (; __f != __l; ++__f) 2207 push_back(*__f); 2208 } 2209 2210 template <class _Tp, class _Allocator> 2211 template <class _ForIter> 2212 void 2213 deque<_Tp, _Allocator>::__append(_ForIter __f, _ForIter __l, 2214 typename enable_if<__is_forward_iterator<_ForIter>::value>::type*) 2215 { 2216 size_type __n = _VSTD::distance(__f, __l); 2217 allocator_type& __a = __base::__alloc(); 2218 size_type __back_capacity = __back_spare(); 2219 if (__n > __back_capacity) 2220 __add_back_capacity(__n - __back_capacity); 2221 // __n <= __back_capacity 2222 for (iterator __i = __base::end(); __f != __l; ++__i, (void) ++__f, ++__base::size()) 2223 __alloc_traits::construct(__a, _VSTD::addressof(*__i), *__f); 2224 } 2225 2226 template <class _Tp, class _Allocator> 2227 void 2228 deque<_Tp, _Allocator>::__append(size_type __n) 2229 { 2230 allocator_type& __a = __base::__alloc(); 2231 size_type __back_capacity = __back_spare(); 2232 if (__n > __back_capacity) 2233 __add_back_capacity(__n - __back_capacity); 2234 // __n <= __back_capacity 2235 for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size()) 2236 __alloc_traits::construct(__a, _VSTD::addressof(*__i)); 2237 } 2238 2239 template <class _Tp, class _Allocator> 2240 void 2241 deque<_Tp, _Allocator>::__append(size_type __n, const value_type& __v) 2242 { 2243 allocator_type& __a = __base::__alloc(); 2244 size_type __back_capacity = __back_spare(); 2245 if (__n > __back_capacity) 2246 __add_back_capacity(__n - __back_capacity); 2247 // __n <= __back_capacity 2248 for (iterator __i = __base::end(); __n; --__n, ++__i, ++__base::size()) 2249 __alloc_traits::construct(__a, _VSTD::addressof(*__i), __v); 2250 } 2251 2252 // Create front capacity for one block of elements. 2253 // Strong guarantee. Either do it or don't touch anything. 2254 template <class _Tp, class _Allocator> 2255 void 2256 deque<_Tp, _Allocator>::__add_front_capacity() 2257 { 2258 allocator_type& __a = __base::__alloc(); 2259 if (__back_spare() >= __base::__block_size) 2260 { 2261 __base::__start_ += __base::__block_size; 2262 pointer __pt = __base::__map_.back(); 2263 __base::__map_.pop_back(); 2264 __base::__map_.push_front(__pt); 2265 } 2266 // Else if __base::__map_.size() < __base::__map_.capacity() then we need to allocate 1 buffer 2267 else if (__base::__map_.size() < __base::__map_.capacity()) 2268 { // we can put the new buffer into the map, but don't shift things around 2269 // until all buffers are allocated. If we throw, we don't need to fix 2270 // anything up (any added buffers are undetectible) 2271 if (__base::__map_.__front_spare() > 0) 2272 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); 2273 else 2274 { 2275 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2276 // Done allocating, reorder capacity 2277 pointer __pt = __base::__map_.back(); 2278 __base::__map_.pop_back(); 2279 __base::__map_.push_front(__pt); 2280 } 2281 __base::__start_ = __base::__map_.size() == 1 ? 2282 __base::__block_size / 2 : 2283 __base::__start_ + __base::__block_size; 2284 } 2285 // Else need to allocate 1 buffer, *and* we need to reallocate __map_. 2286 else 2287 { 2288 __split_buffer<pointer, typename __base::__pointer_allocator&> 2289 __buf(max<size_type>(2 * __base::__map_.capacity(), 1), 2290 0, __base::__map_.__alloc()); 2291 #ifndef _LIBCPP_NO_EXCEPTIONS 2292 try 2293 { 2294 #endif // _LIBCPP_NO_EXCEPTIONS 2295 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2296 #ifndef _LIBCPP_NO_EXCEPTIONS 2297 } 2298 catch (...) 2299 { 2300 __alloc_traits::deallocate(__a, __buf.front(), __base::__block_size); 2301 throw; 2302 } 2303 #endif // _LIBCPP_NO_EXCEPTIONS 2304 for (typename __base::__map_pointer __i = __base::__map_.begin(); 2305 __i != __base::__map_.end(); ++__i) 2306 __buf.push_back(*__i); 2307 _VSTD::swap(__base::__map_.__first_, __buf.__first_); 2308 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); 2309 _VSTD::swap(__base::__map_.__end_, __buf.__end_); 2310 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); 2311 __base::__start_ = __base::__map_.size() == 1 ? 2312 __base::__block_size / 2 : 2313 __base::__start_ + __base::__block_size; 2314 } 2315 } 2316 2317 // Create front capacity for __n elements. 2318 // Strong guarantee. Either do it or don't touch anything. 2319 template <class _Tp, class _Allocator> 2320 void 2321 deque<_Tp, _Allocator>::__add_front_capacity(size_type __n) 2322 { 2323 allocator_type& __a = __base::__alloc(); 2324 size_type __nb = __recommend_blocks(__n + __base::__map_.empty()); 2325 // Number of unused blocks at back: 2326 size_type __back_capacity = __back_spare() / __base::__block_size; 2327 __back_capacity = _VSTD::min(__back_capacity, __nb); // don't take more than you need 2328 __nb -= __back_capacity; // number of blocks need to allocate 2329 // If __nb == 0, then we have sufficient capacity. 2330 if (__nb == 0) 2331 { 2332 __base::__start_ += __base::__block_size * __back_capacity; 2333 for (; __back_capacity > 0; --__back_capacity) 2334 { 2335 pointer __pt = __base::__map_.back(); 2336 __base::__map_.pop_back(); 2337 __base::__map_.push_front(__pt); 2338 } 2339 } 2340 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 2341 else if (__nb <= __base::__map_.capacity() - __base::__map_.size()) 2342 { // we can put the new buffers into the map, but don't shift things around 2343 // until all buffers are allocated. If we throw, we don't need to fix 2344 // anything up (any added buffers are undetectible) 2345 for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1)) 2346 { 2347 if (__base::__map_.__front_spare() == 0) 2348 break; 2349 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); 2350 } 2351 for (; __nb > 0; --__nb, ++__back_capacity) 2352 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2353 // Done allocating, reorder capacity 2354 __base::__start_ += __back_capacity * __base::__block_size; 2355 for (; __back_capacity > 0; --__back_capacity) 2356 { 2357 pointer __pt = __base::__map_.back(); 2358 __base::__map_.pop_back(); 2359 __base::__map_.push_front(__pt); 2360 } 2361 } 2362 // Else need to allocate __nb buffers, *and* we need to reallocate __map_. 2363 else 2364 { 2365 size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty(); 2366 __split_buffer<pointer, typename __base::__pointer_allocator&> 2367 __buf(max<size_type>(2* __base::__map_.capacity(), 2368 __nb + __base::__map_.size()), 2369 0, __base::__map_.__alloc()); 2370 #ifndef _LIBCPP_NO_EXCEPTIONS 2371 try 2372 { 2373 #endif // _LIBCPP_NO_EXCEPTIONS 2374 for (; __nb > 0; --__nb) 2375 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2376 #ifndef _LIBCPP_NO_EXCEPTIONS 2377 } 2378 catch (...) 2379 { 2380 for (typename __base::__map_pointer __i = __buf.begin(); 2381 __i != __buf.end(); ++__i) 2382 __alloc_traits::deallocate(__a, *__i, __base::__block_size); 2383 throw; 2384 } 2385 #endif // _LIBCPP_NO_EXCEPTIONS 2386 for (; __back_capacity > 0; --__back_capacity) 2387 { 2388 __buf.push_back(__base::__map_.back()); 2389 __base::__map_.pop_back(); 2390 } 2391 for (typename __base::__map_pointer __i = __base::__map_.begin(); 2392 __i != __base::__map_.end(); ++__i) 2393 __buf.push_back(*__i); 2394 _VSTD::swap(__base::__map_.__first_, __buf.__first_); 2395 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); 2396 _VSTD::swap(__base::__map_.__end_, __buf.__end_); 2397 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); 2398 __base::__start_ += __ds; 2399 } 2400 } 2401 2402 // Create back capacity for one block of elements. 2403 // Strong guarantee. Either do it or don't touch anything. 2404 template <class _Tp, class _Allocator> 2405 void 2406 deque<_Tp, _Allocator>::__add_back_capacity() 2407 { 2408 allocator_type& __a = __base::__alloc(); 2409 if (__front_spare() >= __base::__block_size) 2410 { 2411 __base::__start_ -= __base::__block_size; 2412 pointer __pt = __base::__map_.front(); 2413 __base::__map_.pop_front(); 2414 __base::__map_.push_back(__pt); 2415 } 2416 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 2417 else if (__base::__map_.size() < __base::__map_.capacity()) 2418 { // we can put the new buffer into the map, but don't shift things around 2419 // until it is allocated. If we throw, we don't need to fix 2420 // anything up (any added buffers are undetectible) 2421 if (__base::__map_.__back_spare() != 0) 2422 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2423 else 2424 { 2425 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); 2426 // Done allocating, reorder capacity 2427 pointer __pt = __base::__map_.front(); 2428 __base::__map_.pop_front(); 2429 __base::__map_.push_back(__pt); 2430 } 2431 } 2432 // Else need to allocate 1 buffer, *and* we need to reallocate __map_. 2433 else 2434 { 2435 __split_buffer<pointer, typename __base::__pointer_allocator&> 2436 __buf(max<size_type>(2* __base::__map_.capacity(), 1), 2437 __base::__map_.size(), 2438 __base::__map_.__alloc()); 2439 #ifndef _LIBCPP_NO_EXCEPTIONS 2440 try 2441 { 2442 #endif // _LIBCPP_NO_EXCEPTIONS 2443 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2444 #ifndef _LIBCPP_NO_EXCEPTIONS 2445 } 2446 catch (...) 2447 { 2448 __alloc_traits::deallocate(__a, __buf.back(), __base::__block_size); 2449 throw; 2450 } 2451 #endif // _LIBCPP_NO_EXCEPTIONS 2452 for (typename __base::__map_pointer __i = __base::__map_.end(); 2453 __i != __base::__map_.begin();) 2454 __buf.push_front(*--__i); 2455 _VSTD::swap(__base::__map_.__first_, __buf.__first_); 2456 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); 2457 _VSTD::swap(__base::__map_.__end_, __buf.__end_); 2458 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); 2459 } 2460 } 2461 2462 // Create back capacity for __n elements. 2463 // Strong guarantee. Either do it or don't touch anything. 2464 template <class _Tp, class _Allocator> 2465 void 2466 deque<_Tp, _Allocator>::__add_back_capacity(size_type __n) 2467 { 2468 allocator_type& __a = __base::__alloc(); 2469 size_type __nb = __recommend_blocks(__n + __base::__map_.empty()); 2470 // Number of unused blocks at front: 2471 size_type __front_capacity = __front_spare() / __base::__block_size; 2472 __front_capacity = _VSTD::min(__front_capacity, __nb); // don't take more than you need 2473 __nb -= __front_capacity; // number of blocks need to allocate 2474 // If __nb == 0, then we have sufficient capacity. 2475 if (__nb == 0) 2476 { 2477 __base::__start_ -= __base::__block_size * __front_capacity; 2478 for (; __front_capacity > 0; --__front_capacity) 2479 { 2480 pointer __pt = __base::__map_.front(); 2481 __base::__map_.pop_front(); 2482 __base::__map_.push_back(__pt); 2483 } 2484 } 2485 // Else if __nb <= __map_.capacity() - __map_.size() then we need to allocate __nb buffers 2486 else if (__nb <= __base::__map_.capacity() - __base::__map_.size()) 2487 { // we can put the new buffers into the map, but don't shift things around 2488 // until all buffers are allocated. If we throw, we don't need to fix 2489 // anything up (any added buffers are undetectible) 2490 for (; __nb > 0; --__nb) 2491 { 2492 if (__base::__map_.__back_spare() == 0) 2493 break; 2494 __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2495 } 2496 for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ += 2497 __base::__block_size - (__base::__map_.size() == 1)) 2498 __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size)); 2499 // Done allocating, reorder capacity 2500 __base::__start_ -= __base::__block_size * __front_capacity; 2501 for (; __front_capacity > 0; --__front_capacity) 2502 { 2503 pointer __pt = __base::__map_.front(); 2504 __base::__map_.pop_front(); 2505 __base::__map_.push_back(__pt); 2506 } 2507 } 2508 // Else need to allocate __nb buffers, *and* we need to reallocate __map_. 2509 else 2510 { 2511 size_type __ds = __front_capacity * __base::__block_size; 2512 __split_buffer<pointer, typename __base::__pointer_allocator&> 2513 __buf(max<size_type>(2* __base::__map_.capacity(), 2514 __nb + __base::__map_.size()), 2515 __base::__map_.size() - __front_capacity, 2516 __base::__map_.__alloc()); 2517 #ifndef _LIBCPP_NO_EXCEPTIONS 2518 try 2519 { 2520 #endif // _LIBCPP_NO_EXCEPTIONS 2521 for (; __nb > 0; --__nb) 2522 __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size)); 2523 #ifndef _LIBCPP_NO_EXCEPTIONS 2524 } 2525 catch (...) 2526 { 2527 for (typename __base::__map_pointer __i = __buf.begin(); 2528 __i != __buf.end(); ++__i) 2529 __alloc_traits::deallocate(__a, *__i, __base::__block_size); 2530 throw; 2531 } 2532 #endif // _LIBCPP_NO_EXCEPTIONS 2533 for (; __front_capacity > 0; --__front_capacity) 2534 { 2535 __buf.push_back(__base::__map_.front()); 2536 __base::__map_.pop_front(); 2537 } 2538 for (typename __base::__map_pointer __i = __base::__map_.end(); 2539 __i != __base::__map_.begin();) 2540 __buf.push_front(*--__i); 2541 _VSTD::swap(__base::__map_.__first_, __buf.__first_); 2542 _VSTD::swap(__base::__map_.__begin_, __buf.__begin_); 2543 _VSTD::swap(__base::__map_.__end_, __buf.__end_); 2544 _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap()); 2545 __base::__start_ -= __ds; 2546 } 2547 } 2548 2549 template <class _Tp, class _Allocator> 2550 void 2551 deque<_Tp, _Allocator>::pop_front() 2552 { 2553 allocator_type& __a = __base::__alloc(); 2554 __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() + 2555 __base::__start_ / __base::__block_size) + 2556 __base::__start_ % __base::__block_size)); 2557 --__base::size(); 2558 if (++__base::__start_ >= 2 * __base::__block_size) 2559 { 2560 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); 2561 __base::__map_.pop_front(); 2562 __base::__start_ -= __base::__block_size; 2563 } 2564 } 2565 2566 template <class _Tp, class _Allocator> 2567 void 2568 deque<_Tp, _Allocator>::pop_back() 2569 { 2570 allocator_type& __a = __base::__alloc(); 2571 size_type __p = __base::size() + __base::__start_ - 1; 2572 __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() + 2573 __p / __base::__block_size) + 2574 __p % __base::__block_size)); 2575 --__base::size(); 2576 if (__back_spare() >= 2 * __base::__block_size) 2577 { 2578 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 2579 __base::__map_.pop_back(); 2580 } 2581 } 2582 2583 // move assign [__f, __l) to [__r, __r + (__l-__f)). 2584 // If __vt points into [__f, __l), then subtract (__f - __r) from __vt. 2585 template <class _Tp, class _Allocator> 2586 typename deque<_Tp, _Allocator>::iterator 2587 deque<_Tp, _Allocator>::__move_and_check(iterator __f, iterator __l, iterator __r, 2588 const_pointer& __vt) 2589 { 2590 // as if 2591 // for (; __f != __l; ++__f, ++__r) 2592 // *__r = _VSTD::move(*__f); 2593 difference_type __n = __l - __f; 2594 while (__n > 0) 2595 { 2596 pointer __fb = __f.__ptr_; 2597 pointer __fe = *__f.__m_iter_ + __base::__block_size; 2598 difference_type __bs = __fe - __fb; 2599 if (__bs > __n) 2600 { 2601 __bs = __n; 2602 __fe = __fb + __bs; 2603 } 2604 if (__fb <= __vt && __vt < __fe) 2605 __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) -= __f - __r).__ptr_; 2606 __r = _VSTD::move(__fb, __fe, __r); 2607 __n -= __bs; 2608 __f += __bs; 2609 } 2610 return __r; 2611 } 2612 2613 // move assign [__f, __l) to [__r - (__l-__f), __r) backwards. 2614 // If __vt points into [__f, __l), then add (__r - __l) to __vt. 2615 template <class _Tp, class _Allocator> 2616 typename deque<_Tp, _Allocator>::iterator 2617 deque<_Tp, _Allocator>::__move_backward_and_check(iterator __f, iterator __l, iterator __r, 2618 const_pointer& __vt) 2619 { 2620 // as if 2621 // while (__f != __l) 2622 // *--__r = _VSTD::move(*--__l); 2623 difference_type __n = __l - __f; 2624 while (__n > 0) 2625 { 2626 --__l; 2627 pointer __lb = *__l.__m_iter_; 2628 pointer __le = __l.__ptr_ + 1; 2629 difference_type __bs = __le - __lb; 2630 if (__bs > __n) 2631 { 2632 __bs = __n; 2633 __lb = __le - __bs; 2634 } 2635 if (__lb <= __vt && __vt < __le) 2636 __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) += __r - __l - 1).__ptr_; 2637 __r = _VSTD::move_backward(__lb, __le, __r); 2638 __n -= __bs; 2639 __l -= __bs - 1; 2640 } 2641 return __r; 2642 } 2643 2644 // move construct [__f, __l) to [__r, __r + (__l-__f)). 2645 // If __vt points into [__f, __l), then add (__r - __f) to __vt. 2646 template <class _Tp, class _Allocator> 2647 void 2648 deque<_Tp, _Allocator>::__move_construct_and_check(iterator __f, iterator __l, 2649 iterator __r, const_pointer& __vt) 2650 { 2651 allocator_type& __a = __base::__alloc(); 2652 // as if 2653 // for (; __f != __l; ++__r, ++__f, ++__base::size()) 2654 // __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__f)); 2655 difference_type __n = __l - __f; 2656 while (__n > 0) 2657 { 2658 pointer __fb = __f.__ptr_; 2659 pointer __fe = *__f.__m_iter_ + __base::__block_size; 2660 difference_type __bs = __fe - __fb; 2661 if (__bs > __n) 2662 { 2663 __bs = __n; 2664 __fe = __fb + __bs; 2665 } 2666 if (__fb <= __vt && __vt < __fe) 2667 __vt = (const_iterator(static_cast<__map_const_pointer>(__f.__m_iter_), __vt) += __r - __f).__ptr_; 2668 for (; __fb != __fe; ++__fb, ++__r, ++__base::size()) 2669 __alloc_traits::construct(__a, _VSTD::addressof(*__r), _VSTD::move(*__fb)); 2670 __n -= __bs; 2671 __f += __bs; 2672 } 2673 } 2674 2675 // move construct [__f, __l) to [__r - (__l-__f), __r) backwards. 2676 // If __vt points into [__f, __l), then subtract (__l - __r) from __vt. 2677 template <class _Tp, class _Allocator> 2678 void 2679 deque<_Tp, _Allocator>::__move_construct_backward_and_check(iterator __f, iterator __l, 2680 iterator __r, const_pointer& __vt) 2681 { 2682 allocator_type& __a = __base::__alloc(); 2683 // as if 2684 // for (iterator __j = __l; __j != __f;) 2685 // { 2686 // __alloc_traitsconstruct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__j)); 2687 // --__base::__start_; 2688 // ++__base::size(); 2689 // } 2690 difference_type __n = __l - __f; 2691 while (__n > 0) 2692 { 2693 --__l; 2694 pointer __lb = *__l.__m_iter_; 2695 pointer __le = __l.__ptr_ + 1; 2696 difference_type __bs = __le - __lb; 2697 if (__bs > __n) 2698 { 2699 __bs = __n; 2700 __lb = __le - __bs; 2701 } 2702 if (__lb <= __vt && __vt < __le) 2703 __vt = (const_iterator(static_cast<__map_const_pointer>(__l.__m_iter_), __vt) -= __l - __r + 1).__ptr_; 2704 while (__le != __lb) 2705 { 2706 __alloc_traits::construct(__a, _VSTD::addressof(*--__r), _VSTD::move(*--__le)); 2707 --__base::__start_; 2708 ++__base::size(); 2709 } 2710 __n -= __bs; 2711 __l -= __bs - 1; 2712 } 2713 } 2714 2715 template <class _Tp, class _Allocator> 2716 typename deque<_Tp, _Allocator>::iterator 2717 deque<_Tp, _Allocator>::erase(const_iterator __f) 2718 { 2719 difference_type __n = 1; 2720 iterator __b = __base::begin(); 2721 difference_type __pos = __f - __b; 2722 iterator __p = __b + __pos; 2723 allocator_type& __a = __base::__alloc(); 2724 if (__pos < (__base::size() - 1) / 2) 2725 { // erase from front 2726 _VSTD::move_backward(__b, __p, _VSTD::next(__p)); 2727 __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); 2728 --__base::size(); 2729 ++__base::__start_; 2730 if (__front_spare() >= 2 * __base::__block_size) 2731 { 2732 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); 2733 __base::__map_.pop_front(); 2734 __base::__start_ -= __base::__block_size; 2735 } 2736 } 2737 else 2738 { // erase from back 2739 iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p); 2740 __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 2741 --__base::size(); 2742 if (__back_spare() >= 2 * __base::__block_size) 2743 { 2744 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 2745 __base::__map_.pop_back(); 2746 } 2747 } 2748 return __base::begin() + __pos; 2749 } 2750 2751 template <class _Tp, class _Allocator> 2752 typename deque<_Tp, _Allocator>::iterator 2753 deque<_Tp, _Allocator>::erase(const_iterator __f, const_iterator __l) 2754 { 2755 difference_type __n = __l - __f; 2756 iterator __b = __base::begin(); 2757 difference_type __pos = __f - __b; 2758 iterator __p = __b + __pos; 2759 if (__n > 0) 2760 { 2761 allocator_type& __a = __base::__alloc(); 2762 if (__pos < (__base::size() - __n) / 2) 2763 { // erase from front 2764 iterator __i = _VSTD::move_backward(__b, __p, __p + __n); 2765 for (; __b != __i; ++__b) 2766 __alloc_traits::destroy(__a, _VSTD::addressof(*__b)); 2767 __base::size() -= __n; 2768 __base::__start_ += __n; 2769 while (__front_spare() >= 2 * __base::__block_size) 2770 { 2771 __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size); 2772 __base::__map_.pop_front(); 2773 __base::__start_ -= __base::__block_size; 2774 } 2775 } 2776 else 2777 { // erase from back 2778 iterator __i = _VSTD::move(__p + __n, __base::end(), __p); 2779 for (iterator __e = __base::end(); __i != __e; ++__i) 2780 __alloc_traits::destroy(__a, _VSTD::addressof(*__i)); 2781 __base::size() -= __n; 2782 while (__back_spare() >= 2 * __base::__block_size) 2783 { 2784 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 2785 __base::__map_.pop_back(); 2786 } 2787 } 2788 } 2789 return __base::begin() + __pos; 2790 } 2791 2792 template <class _Tp, class _Allocator> 2793 void 2794 deque<_Tp, _Allocator>::__erase_to_end(const_iterator __f) 2795 { 2796 iterator __e = __base::end(); 2797 difference_type __n = __e - __f; 2798 if (__n > 0) 2799 { 2800 allocator_type& __a = __base::__alloc(); 2801 iterator __b = __base::begin(); 2802 difference_type __pos = __f - __b; 2803 for (iterator __p = __b + __pos; __p != __e; ++__p) 2804 __alloc_traits::destroy(__a, _VSTD::addressof(*__p)); 2805 __base::size() -= __n; 2806 while (__back_spare() >= 2 * __base::__block_size) 2807 { 2808 __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size); 2809 __base::__map_.pop_back(); 2810 } 2811 } 2812 } 2813 2814 template <class _Tp, class _Allocator> 2815 inline _LIBCPP_INLINE_VISIBILITY 2816 void 2817 deque<_Tp, _Allocator>::swap(deque& __c) 2818 _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 2819 __is_nothrow_swappable<allocator_type>::value) 2820 { 2821 __base::swap(__c); 2822 } 2823 2824 template <class _Tp, class _Allocator> 2825 inline _LIBCPP_INLINE_VISIBILITY 2826 void 2827 deque<_Tp, _Allocator>::clear() _NOEXCEPT 2828 { 2829 __base::clear(); 2830 } 2831 2832 template <class _Tp, class _Allocator> 2833 inline _LIBCPP_INLINE_VISIBILITY 2834 bool 2835 operator==(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2836 { 2837 const typename deque<_Tp, _Allocator>::size_type __sz = __x.size(); 2838 return __sz == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 2839 } 2840 2841 template <class _Tp, class _Allocator> 2842 inline _LIBCPP_INLINE_VISIBILITY 2843 bool 2844 operator!=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2845 { 2846 return !(__x == __y); 2847 } 2848 2849 template <class _Tp, class _Allocator> 2850 inline _LIBCPP_INLINE_VISIBILITY 2851 bool 2852 operator< (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2853 { 2854 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 2855 } 2856 2857 template <class _Tp, class _Allocator> 2858 inline _LIBCPP_INLINE_VISIBILITY 2859 bool 2860 operator> (const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2861 { 2862 return __y < __x; 2863 } 2864 2865 template <class _Tp, class _Allocator> 2866 inline _LIBCPP_INLINE_VISIBILITY 2867 bool 2868 operator>=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2869 { 2870 return !(__x < __y); 2871 } 2872 2873 template <class _Tp, class _Allocator> 2874 inline _LIBCPP_INLINE_VISIBILITY 2875 bool 2876 operator<=(const deque<_Tp, _Allocator>& __x, const deque<_Tp, _Allocator>& __y) 2877 { 2878 return !(__y < __x); 2879 } 2880 2881 template <class _Tp, class _Allocator> 2882 inline _LIBCPP_INLINE_VISIBILITY 2883 void 2884 swap(deque<_Tp, _Allocator>& __x, deque<_Tp, _Allocator>& __y) 2885 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 2886 { 2887 __x.swap(__y); 2888 } 2889 2890 _LIBCPP_END_NAMESPACE_STD 2891 2892 #endif // _LIBCPP_DEQUE 2893