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