REPOSITORY
  rL LLVM

http://reviews.llvm.org/D9090

Files:
  include/deque
  test/std/containers/sequences/deque/deque.cons/incomplete.pass.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: include/deque
===================================================================
--- include/deque
+++ include/deque
@@ -170,100 +170,105 @@
 template <class _Tp, class _Allocator> class __deque_base;
 template <class _Tp, class _Allocator = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY deque;
 
+template<class value_type, class difference_type>
+struct __calculate_block_size {
+  static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
+};
+
 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
-          class _DiffType, _DiffType _BlockSize>
+          class _DiffType>
 class _LIBCPP_TYPE_VIS_ONLY __deque_iterator;
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 copy(_RAIter __f,
      _RAIter __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
      _OutputIterator __r);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 copy_backward(_RAIter __f,
               _RAIter __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
               _OutputIterator __r);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 move(_RAIter __f,
      _RAIter __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
      _OutputIterator __r);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 move_backward(_RAIter __f,
               _RAIter __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type* = 0);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
               _OutputIterator __r);
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
 template <class _ValueType, class _Pointer, class _Reference, class _MapPointer,
-          class _DiffType, _DiffType _BlockSize>
+          class _DiffType>
 class _LIBCPP_TYPE_VIS_ONLY __deque_iterator
 {
     typedef _MapPointer __map_iterator;
@@ -273,8 +278,7 @@
 private:
     __map_iterator __m_iter_;
     pointer        __ptr_;
-
-    static const difference_type __block_size = _BlockSize;
+    typedef __calculate_block_size<_ValueType, difference_type> __value_traits;
 public:
     typedef _ValueType                  value_type;
     typedef random_access_iterator_tag  iterator_category;
@@ -288,16 +292,16 @@
 
     template <class _Pp, class _Rp, class _MP>
     _LIBCPP_INLINE_VISIBILITY
-    __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type, __block_size>& __it,
+    __deque_iterator(const __deque_iterator<value_type, _Pp, _Rp, _MP, difference_type>& __it,
                 typename enable_if<is_convertible<_Pp, pointer>::value>::type* = 0) _NOEXCEPT
         : __m_iter_(__it.__m_iter_), __ptr_(__it.__ptr_) {}
 
     _LIBCPP_INLINE_VISIBILITY reference operator*() const {return *__ptr_;}
     _LIBCPP_INLINE_VISIBILITY pointer operator->() const {return __ptr_;}
 
     _LIBCPP_INLINE_VISIBILITY __deque_iterator& operator++()
     {
-        if (++__ptr_ - *__m_iter_ == __block_size)
+        if (++__ptr_ - *__m_iter_ == __value_traits::__block_size)
         {
             ++__m_iter_;
             __ptr_ = *__m_iter_;
@@ -317,7 +321,7 @@
         if (__ptr_ == *__m_iter_)
         {
             --__m_iter_;
-            __ptr_ = *__m_iter_ + __block_size;
+            __ptr_ = *__m_iter_ + __value_traits::__block_size;
         }
         --__ptr_;
         return *this;
@@ -337,14 +341,14 @@
             __n += __ptr_ - *__m_iter_;
             if (__n > 0)
             {
-                __m_iter_ += __n / __block_size;
-                __ptr_ = *__m_iter_ + __n % __block_size;
+                __m_iter_ += __n / __value_traits::__block_size;
+                __ptr_ = *__m_iter_ + __n % __value_traits::__block_size;
             }
             else // (__n < 0)
             {
-                difference_type __z = __block_size - 1 - __n;
-                __m_iter_ -= __z / __block_size;
-                __ptr_ = *__m_iter_ + (__block_size - 1 - __z % __block_size);
+                difference_type __z = __value_traits::__block_size - 1 - __n;
+                __m_iter_ -= __z / __value_traits::__block_size;
+                __ptr_ = *__m_iter_ + (__value_traits::__block_size - 1 - __z % __value_traits::__block_size);
             }
         }
         return *this;
@@ -377,7 +381,7 @@
     friend difference_type operator-(const __deque_iterator& __x, const __deque_iterator& __y)
     {
         if (__x != __y)
-            return (__x.__m_iter_ - __y.__m_iter_) * __block_size
+            return (__x.__m_iter_ - __y.__m_iter_) * __value_traits::__block_size
                  + (__x.__ptr_ - *__x.__m_iter_)
                  - (__y.__ptr_ - *__y.__m_iter_);
         return 0;
@@ -417,122 +421,122 @@
 
     template <class _Tp, class _Ap> friend class __deque_base;
     template <class _Tp, class _Ap> friend class _LIBCPP_TYPE_VIS_ONLY deque;
-    template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp, _Dp>
+    template <class _Vp, class _Pp, class _Rp, class _MP, class _Dp>
         friend class _LIBCPP_TYPE_VIS_ONLY __deque_iterator;
 
     template <class _RAIter,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
     copy(_RAIter __f,
          _RAIter __l,
-         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+         __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
          typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _OutputIterator>
     friend
     _OutputIterator
-    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+         __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
          _OutputIterator __r);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
+    copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+         __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+         __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
     template <class _RAIter,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
     copy_backward(_RAIter __f,
                   _RAIter __l,
-                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+                  __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
                   typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _OutputIterator>
     friend
     _OutputIterator
-    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+                  __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
                   _OutputIterator __r);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
+    copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+                  __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+                  __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
     template <class _RAIter,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
     move(_RAIter __f,
          _RAIter __l,
-         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+         __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
          typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _OutputIterator>
     friend
     _OutputIterator
-    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+         __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
          _OutputIterator __r);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-         __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-         __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
+    move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+         __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+         __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 
     template <class _RAIter,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
     move_backward(_RAIter __f,
                   _RAIter __l,
-                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+                  __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
                   typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _OutputIterator>
     friend
     _OutputIterator
-    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+                  __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
                   _OutputIterator __r);
 
     template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
               class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
     friend
-    __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-                  __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-                  __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r);
+    __deque_iterator<_V2, _P2, _R2, _M2, _D2>
+    move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+                  __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+                  __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r);
 };
 
 // copy
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 copy(_RAIter __f,
      _RAIter __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
 {
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::difference_type difference_type;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::pointer pointer;
     while (__f != __l)
     {
         pointer __rb = __r.__ptr_;
@@ -555,12 +559,12 @@
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
      _OutputIterator __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -581,13 +585,13 @@
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+copy(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -610,17 +614,17 @@
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 copy_backward(_RAIter __f,
               _RAIter __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
 {
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::difference_type difference_type;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::pointer pointer;
     while (__f != __l)
     {
-        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
+        __deque_iterator<_V2, _P2, _R2, _M2, _D2> __rp = _VSTD::prev(__r);
         pointer __rb = *__rp.__m_iter_;
         pointer __re = __rp.__ptr_ + 1;
         difference_type __bs = __re - __rb;
@@ -641,12 +645,12 @@
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
               _OutputIterator __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -668,13 +672,13 @@
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+copy_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -698,14 +702,14 @@
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 move(_RAIter __f,
      _RAIter __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
      typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
 {
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::difference_type difference_type;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::pointer pointer;
     while (__f != __l)
     {
         pointer __rb = __r.__ptr_;
@@ -728,12 +732,12 @@
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
      _OutputIterator __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -754,13 +758,13 @@
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-     __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-     __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+move(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+     __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+     __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -783,17 +787,17 @@
 
 template <class _RAIter,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
 move_backward(_RAIter __f,
               _RAIter __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r,
               typename enable_if<__is_random_access_iterator<_RAIter>::value>::type*)
 {
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::difference_type difference_type;
-    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>::pointer pointer;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::difference_type difference_type;
+    typedef typename __deque_iterator<_V2, _P2, _R2, _M2, _D2>::pointer pointer;
     while (__f != __l)
     {
-        __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __rp = _VSTD::prev(__r);
+        __deque_iterator<_V2, _P2, _R2, _M2, _D2> __rp = _VSTD::prev(__r);
         pointer __rb = *__rp.__m_iter_;
         pointer __re = __rp.__ptr_ + 1;
         difference_type __bs = __re - __rb;
@@ -814,12 +818,12 @@
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _OutputIterator>
 _OutputIterator
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
+move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
               _OutputIterator __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -841,13 +845,13 @@
 
 template <class _V1, class _P1, class _R1, class _M1, class _D1, _D1 _B1,
           class _V2, class _P2, class _R2, class _M2, class _D2, _D2 _B2>
-__deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2>
-move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __f,
-              __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1> __l,
-              __deque_iterator<_V2, _P2, _R2, _M2, _D2, _B2> __r)
+__deque_iterator<_V2, _P2, _R2, _M2, _D2>
+move_backward(__deque_iterator<_V1, _P1, _R1, _M1, _D1> __f,
+              __deque_iterator<_V1, _P1, _R1, _M1, _D1> __l,
+              __deque_iterator<_V2, _P2, _R2, _M2, _D2> __r)
 {
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::difference_type difference_type;
-    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1, _B1>::pointer pointer;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::difference_type difference_type;
+    typedef typename __deque_iterator<_V1, _P1, _R1, _M1, _D1>::pointer pointer;
     difference_type __n = __l - __f;
     while (__n > 0)
     {
@@ -909,8 +913,7 @@
     typedef typename __alloc_traits::difference_type difference_type;
     typedef typename __alloc_traits::pointer         pointer;
     typedef typename __alloc_traits::const_pointer   const_pointer;
-
-    static const difference_type __block_size = sizeof(value_type) < 256 ? 4096 / sizeof(value_type) : 16;
+    typedef __calculate_block_size<value_type, difference_type> __value_traits;
 
     typedef typename __rebind_alloc_helper<__alloc_traits, pointer>::type __pointer_allocator;
     typedef allocator_traits<__pointer_allocator>        __map_traits;
@@ -920,9 +923,9 @@
     typedef __split_buffer<pointer, __pointer_allocator> __map;
 
     typedef __deque_iterator<value_type, pointer, reference, __map_pointer,
-                             difference_type, __block_size>    iterator;
+                             difference_type>    iterator;
     typedef __deque_iterator<value_type, const_pointer, const_reference, __map_const_pointer,
-                             difference_type, __block_size>    const_iterator;
+                             difference_type>    const_iterator;
 
     __map __map_;
     size_type __start_;
@@ -1019,17 +1022,17 @@
 {
     if (!__map_.__invariants())
         return false;
-    if (__map_.size() >= size_type(-1) / __block_size)
+    if (__map_.size() >= size_type(-1) / __value_traits::__block_size)
         return false;
     for (typename __map::const_iterator __i = __map_.begin(), __e = __map_.end();
          __i != __e; ++__i)
         if (*__i == nullptr)
             return false;
     if (__map_.size() != 0)
     {
-        if (size() >= __map_.size() * __block_size)
+        if (size() >= __map_.size() * __value_traits::__block_size)
             return false;
-        if (__start_ >= __map_.size() * __block_size - size())
+        if (__start_ >= __map_.size() * __value_traits::__block_size - size())
             return false;
     }
     else
@@ -1046,34 +1049,34 @@
 typename __deque_base<_Tp, _Allocator>::iterator
 __deque_base<_Tp, _Allocator>::begin() _NOEXCEPT
 {
-    __map_pointer __mp = __map_.begin() + __start_ / __block_size;
-    return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
+    __map_pointer __mp = __map_.begin() + __start_ / __value_traits::__block_size;
+    return iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 typename __deque_base<_Tp, _Allocator>::const_iterator
 __deque_base<_Tp, _Allocator>::begin() const _NOEXCEPT
 {
-    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __block_size);
-    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __block_size);
+    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __start_ / __value_traits::__block_size);
+    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __start_ % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 typename __deque_base<_Tp, _Allocator>::iterator
 __deque_base<_Tp, _Allocator>::end() _NOEXCEPT
 {
     size_type __p = size() + __start_;
-    __map_pointer __mp = __map_.begin() + __p / __block_size;
-    return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
+    __map_pointer __mp = __map_.begin() + __p / __value_traits::__block_size;
+    return iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 typename __deque_base<_Tp, _Allocator>::const_iterator
 __deque_base<_Tp, _Allocator>::end() const _NOEXCEPT
 {
     size_type __p = size() + __start_;
-    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __block_size);
-    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __block_size);
+    __map_const_pointer __mp = static_cast<__map_const_pointer>(__map_.begin() + __p / __value_traits::__block_size);
+    return const_iterator(__mp, __map_.empty() ? 0 : *__mp + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
@@ -1094,7 +1097,7 @@
     typename __map::iterator __i = __map_.begin();
     typename __map::iterator __e = __map_.end();
     for (; __i != __e; ++__i)
-        __alloc_traits::deallocate(__alloc(), *__i, __block_size);
+        __alloc_traits::deallocate(__alloc(), *__i, __value_traits::__block_size);
 }
 
 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
@@ -1153,16 +1156,16 @@
     size() = 0;
     while (__map_.size() > 2)
     {
-        __alloc_traits::deallocate(__a, __map_.front(), __block_size);
+        __alloc_traits::deallocate(__a, __map_.front(), __value_traits::__block_size);
         __map_.pop_front();
     }
     switch (__map_.size())
     {
     case 1:
-        __start_ = __block_size / 2;
+        __start_ = __value_traits::__block_size / 2;
         break;
     case 2:
-        __start_ = __block_size;
+        __start_ = __value_traits::__block_size;
         break;
     }
 }
@@ -1192,6 +1195,10 @@
     typedef _VSTD::reverse_iterator<iterator>       reverse_iterator;
     typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
 
+private:
+  typedef __calculate_block_size<value_type, difference_type> __value_traits;
+public:
+
     // construct/copy/destroy:
     _LIBCPP_INLINE_VISIBILITY
     deque()
@@ -1354,12 +1361,12 @@
     _LIBCPP_INLINE_VISIBILITY
     static size_type __recommend_blocks(size_type __n)
     {
-        return __n / __base::__block_size + (__n % __base::__block_size != 0);
+        return __n / __value_traits::__block_size + (__n % __value_traits::__block_size != 0);
     }
     _LIBCPP_INLINE_VISIBILITY
     size_type __capacity() const
     {
-        return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __base::__block_size - 1;
+        return __base::__map_.size() == 0 ? 0 : __base::__map_.size() * __value_traits::__block_size - 1;
     }
     _LIBCPP_INLINE_VISIBILITY
     size_type __front_spare() const
@@ -1656,22 +1663,22 @@
     {
         while (__base::__map_.size() > 0)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
             __base::__map_.pop_back();
         }
         __base::__start_ = 0;
     }
     else
     {
-        if (__front_spare() >= __base::__block_size)
+        if (__front_spare() >= __value_traits::__block_size)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.front(), __value_traits::__block_size);
             __base::__map_.pop_front();
-            __base::__start_ -= __base::__block_size;
+            __base::__start_ -= __value_traits::__block_size;
         }
-        if (__back_spare() >= __base::__block_size)
+        if (__back_spare() >= __value_traits::__block_size)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
             __base::__map_.pop_back();
         }
     }
@@ -1684,16 +1691,16 @@
 deque<_Tp, _Allocator>::operator[](size_type __i)
 {
     size_type __p = __base::__start_ + __i;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 inline _LIBCPP_INLINE_VISIBILITY
 typename deque<_Tp, _Allocator>::const_reference
 deque<_Tp, _Allocator>::operator[](size_type __i) const
 {
     size_type __p = __base::__start_ + __i;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
@@ -1704,7 +1711,7 @@
     if (__i >= __base::size())
         __base::__throw_out_of_range();
     size_type __p = __base::__start_ + __i;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
@@ -1715,43 +1722,43 @@
     if (__i >= __base::size())
         __base::__throw_out_of_range();
     size_type __p = __base::__start_ + __i;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 inline _LIBCPP_INLINE_VISIBILITY
 typename deque<_Tp, _Allocator>::reference
 deque<_Tp, _Allocator>::front()
 {
-    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
-                                      + __base::__start_ % __base::__block_size);
+    return *(*(__base::__map_.begin() + __base::__start_ / __value_traits::__block_size)
+                                      + __base::__start_ % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 inline _LIBCPP_INLINE_VISIBILITY
 typename deque<_Tp, _Allocator>::const_reference
 deque<_Tp, _Allocator>::front() const
 {
-    return *(*(__base::__map_.begin() + __base::__start_ / __base::__block_size)
-                                      + __base::__start_ % __base::__block_size);
+    return *(*(__base::__map_.begin() + __base::__start_ / __value_traits::__block_size)
+                                      + __base::__start_ % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 inline _LIBCPP_INLINE_VISIBILITY
 typename deque<_Tp, _Allocator>::reference
 deque<_Tp, _Allocator>::back()
 {
     size_type __p = __base::size() + __base::__start_ - 1;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
 inline _LIBCPP_INLINE_VISIBILITY
 typename deque<_Tp, _Allocator>::const_reference
 deque<_Tp, _Allocator>::back() const
 {
     size_type __p = __base::size() + __base::__start_ - 1;
-    return *(*(__base::__map_.begin() + __p / __base::__block_size) + __p % __base::__block_size);
+    return *(*(__base::__map_.begin() + __p / __value_traits::__block_size) + __p % __value_traits::__block_size);
 }
 
 template <class _Tp, class _Allocator>
@@ -2244,9 +2251,9 @@
 deque<_Tp, _Allocator>::__add_front_capacity()
 {
     allocator_type& __a = __base::__alloc();
-    if (__back_spare() >= __base::__block_size)
+    if (__back_spare() >= __value_traits::__block_size)
     {
-        __base::__start_ += __base::__block_size;
+        __base::__start_ += __value_traits::__block_size;
         pointer __pt = __base::__map_.back();
         __base::__map_.pop_back();
         __base::__map_.push_front(__pt);
@@ -2257,18 +2264,18 @@
         // until all buffers are allocated.  If we throw, we don't need to fix
         // anything up (any added buffers are undetectible)
         if (__base::__map_.__front_spare() > 0)
-            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_front(__alloc_traits::allocate(__a, __value_traits::__block_size));
         else
         {
-            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
             // Done allocating, reorder capacity
             pointer __pt = __base::__map_.back();
             __base::__map_.pop_back();
             __base::__map_.push_front(__pt);
         }
         __base::__start_ = __base::__map_.size() == 1 ?
-                               __base::__block_size / 2 :
-                               __base::__start_ + __base::__block_size;
+                               __value_traits::__block_size / 2 :
+                               __base::__start_ + __value_traits::__block_size;
     }
     // Else need to allocate 1 buffer, *and* we need to reallocate __map_.
     else
@@ -2279,8 +2286,8 @@
 
 		typedef __allocator_destructor<_Allocator> _Dp;
 		unique_ptr<pointer, _Dp> __hold(
-			__alloc_traits::allocate(__a, __base::__block_size),
-				_Dp(__a, __base::__block_size));
+			__alloc_traits::allocate(__a, __value_traits::__block_size),
+				_Dp(__a, __value_traits::__block_size));
 		__buf.push_back(__hold.get());
 		__hold.release();
 	
@@ -2292,8 +2299,8 @@
         _VSTD::swap(__base::__map_.__end_, __buf.__end_);
         _VSTD::swap(__base::__map_.__end_cap(), __buf.__end_cap());
         __base::__start_ = __base::__map_.size() == 1 ?
-                               __base::__block_size / 2 :
-                               __base::__start_ + __base::__block_size;
+                               __value_traits::__block_size / 2 :
+                               __base::__start_ + __value_traits::__block_size;
     }
 }
 
@@ -2306,13 +2313,13 @@
     allocator_type& __a = __base::__alloc();
     size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
     // Number of unused blocks at back:
-    size_type __back_capacity = __back_spare() / __base::__block_size;
+    size_type __back_capacity = __back_spare() / __value_traits::__block_size;
     __back_capacity = _VSTD::min(__back_capacity, __nb);  // don't take more than you need
     __nb -= __back_capacity;  // number of blocks need to allocate
     // If __nb == 0, then we have sufficient capacity.
     if (__nb == 0)
     {
-        __base::__start_ += __base::__block_size * __back_capacity;
+        __base::__start_ += __value_traits::__block_size * __back_capacity;
         for (; __back_capacity > 0; --__back_capacity)
         {
             pointer __pt = __base::__map_.back();
@@ -2325,16 +2332,16 @@
     {   // we can put the new buffers into the map, but don't shift things around
         // until all buffers are allocated.  If we throw, we don't need to fix
         // anything up (any added buffers are undetectible)
-        for (; __nb > 0; --__nb, __base::__start_ += __base::__block_size - (__base::__map_.size() == 1))
+        for (; __nb > 0; --__nb, __base::__start_ += __value_traits::__block_size - (__base::__map_.size() == 1))
         {
             if (__base::__map_.__front_spare() == 0)
                 break;
-            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_front(__alloc_traits::allocate(__a, __value_traits::__block_size));
         }
         for (; __nb > 0; --__nb, ++__back_capacity)
-            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
         // Done allocating, reorder capacity
-        __base::__start_ += __back_capacity * __base::__block_size;
+        __base::__start_ += __back_capacity * __value_traits::__block_size;
         for (; __back_capacity > 0; --__back_capacity)
         {
             pointer __pt = __base::__map_.back();
@@ -2345,7 +2352,7 @@
     // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
     else
     {
-        size_type __ds = (__nb + __back_capacity) * __base::__block_size - __base::__map_.empty();
+        size_type __ds = (__nb + __back_capacity) * __value_traits::__block_size - __base::__map_.empty();
         __split_buffer<pointer, typename __base::__pointer_allocator&>
             __buf(max<size_type>(2* __base::__map_.capacity(),
                                  __nb + __base::__map_.size()),
@@ -2355,14 +2362,14 @@
         {
 #endif  // _LIBCPP_NO_EXCEPTIONS
             for (; __nb > 0; --__nb)
-                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+                __buf.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
 #ifndef _LIBCPP_NO_EXCEPTIONS
         }
         catch (...)
         {
             for (typename __base::__map_pointer __i = __buf.begin();
                     __i != __buf.end(); ++__i)
-                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
+                __alloc_traits::deallocate(__a, *__i, __value_traits::__block_size);
             throw;
         }
 #endif  // _LIBCPP_NO_EXCEPTIONS
@@ -2389,9 +2396,9 @@
 deque<_Tp, _Allocator>::__add_back_capacity()
 {
     allocator_type& __a = __base::__alloc();
-    if (__front_spare() >= __base::__block_size)
+    if (__front_spare() >= __value_traits::__block_size)
     {
-        __base::__start_ -= __base::__block_size;
+        __base::__start_ -= __value_traits::__block_size;
         pointer __pt = __base::__map_.front();
         __base::__map_.pop_front();
         __base::__map_.push_back(__pt);
@@ -2402,10 +2409,10 @@
         // until it is allocated.  If we throw, we don't need to fix
         // anything up (any added buffers are undetectible)
         if (__base::__map_.__back_spare() != 0)
-            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
         else
         {
-            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_front(__alloc_traits::allocate(__a, __value_traits::__block_size));
             // Done allocating, reorder capacity
             pointer __pt = __base::__map_.front();
             __base::__map_.pop_front();
@@ -2422,8 +2429,8 @@
 
 		typedef __allocator_destructor<_Allocator> _Dp;
 		unique_ptr<pointer, _Dp> __hold(
-			__alloc_traits::allocate(__a, __base::__block_size),
-				_Dp(__a, __base::__block_size));
+			__alloc_traits::allocate(__a, __value_traits::__block_size),
+				_Dp(__a, __value_traits::__block_size));
 		__buf.push_back(__hold.get());
 		__hold.release();
 
@@ -2446,13 +2453,13 @@
     allocator_type& __a = __base::__alloc();
     size_type __nb = __recommend_blocks(__n + __base::__map_.empty());
     // Number of unused blocks at front:
-    size_type __front_capacity = __front_spare() / __base::__block_size;
+    size_type __front_capacity = __front_spare() / __value_traits::__block_size;
     __front_capacity = _VSTD::min(__front_capacity, __nb);  // don't take more than you need
     __nb -= __front_capacity;  // number of blocks need to allocate
     // If __nb == 0, then we have sufficient capacity.
     if (__nb == 0)
     {
-        __base::__start_ -= __base::__block_size * __front_capacity;
+        __base::__start_ -= __value_traits::__block_size * __front_capacity;
         for (; __front_capacity > 0; --__front_capacity)
         {
             pointer __pt = __base::__map_.front();
@@ -2469,13 +2476,13 @@
         {
             if (__base::__map_.__back_spare() == 0)
                 break;
-            __base::__map_.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+            __base::__map_.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
         }
         for (; __nb > 0; --__nb, ++__front_capacity, __base::__start_ +=
-                                 __base::__block_size - (__base::__map_.size() == 1))
-            __base::__map_.push_front(__alloc_traits::allocate(__a, __base::__block_size));
+                                 __value_traits::__block_size - (__base::__map_.size() == 1))
+            __base::__map_.push_front(__alloc_traits::allocate(__a, __value_traits::__block_size));
         // Done allocating, reorder capacity
-        __base::__start_ -= __base::__block_size * __front_capacity;
+        __base::__start_ -= __value_traits::__block_size * __front_capacity;
         for (; __front_capacity > 0; --__front_capacity)
         {
             pointer __pt = __base::__map_.front();
@@ -2486,7 +2493,7 @@
     // Else need to allocate __nb buffers, *and* we need to reallocate __map_.
     else
     {
-        size_type __ds = __front_capacity * __base::__block_size;
+        size_type __ds = __front_capacity * __value_traits::__block_size;
         __split_buffer<pointer, typename __base::__pointer_allocator&>
             __buf(max<size_type>(2* __base::__map_.capacity(),
                                  __nb + __base::__map_.size()),
@@ -2497,14 +2504,14 @@
         {
 #endif  // _LIBCPP_NO_EXCEPTIONS
             for (; __nb > 0; --__nb)
-                __buf.push_back(__alloc_traits::allocate(__a, __base::__block_size));
+                __buf.push_back(__alloc_traits::allocate(__a, __value_traits::__block_size));
 #ifndef _LIBCPP_NO_EXCEPTIONS
         }
         catch (...)
         {
             for (typename __base::__map_pointer __i = __buf.begin();
                     __i != __buf.end(); ++__i)
-                __alloc_traits::deallocate(__a, *__i, __base::__block_size);
+                __alloc_traits::deallocate(__a, *__i, __value_traits::__block_size);
             throw;
         }
 #endif  // _LIBCPP_NO_EXCEPTIONS
@@ -2530,14 +2537,14 @@
 {
     allocator_type& __a = __base::__alloc();
     __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
-                                                    __base::__start_ / __base::__block_size) +
-                                                    __base::__start_ % __base::__block_size));
+                                                    __base::__start_ / __value_traits::__block_size) +
+                                                    __base::__start_ % __value_traits::__block_size));
     --__base::size();
-    if (++__base::__start_ >= 2 * __base::__block_size)
+    if (++__base::__start_ >= 2 * __value_traits::__block_size)
     {
-        __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
+        __alloc_traits::deallocate(__a, __base::__map_.front(), __value_traits::__block_size);
         __base::__map_.pop_front();
-        __base::__start_ -= __base::__block_size;
+        __base::__start_ -= __value_traits::__block_size;
     }
 }
 
@@ -2548,12 +2555,12 @@
     allocator_type& __a = __base::__alloc();
     size_type __p = __base::size() + __base::__start_ - 1;
     __alloc_traits::destroy(__a, __to_raw_pointer(*(__base::__map_.begin() +
-                                                    __p / __base::__block_size) +
-                                                    __p % __base::__block_size));
+                                                    __p / __value_traits::__block_size) +
+                                                    __p % __value_traits::__block_size));
     --__base::size();
-    if (__back_spare() >= 2 * __base::__block_size)
+    if (__back_spare() >= 2 * __value_traits::__block_size)
     {
-        __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+        __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
         __base::__map_.pop_back();
     }
 }
@@ -2572,7 +2579,7 @@
     while (__n > 0)
     {
         pointer __fb = __f.__ptr_;
-        pointer __fe = *__f.__m_iter_ + __base::__block_size;
+        pointer __fe = *__f.__m_iter_ + __value_traits::__block_size;
         difference_type __bs = __fe - __fb;
         if (__bs > __n)
         {
@@ -2634,7 +2641,7 @@
     while (__n > 0)
     {
         pointer __fb = __f.__ptr_;
-        pointer __fe = *__f.__m_iter_ + __base::__block_size;
+        pointer __fe = *__f.__m_iter_ + __value_traits::__block_size;
         difference_type __bs = __fe - __fb;
         if (__bs > __n)
         {
@@ -2705,21 +2712,21 @@
         __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
         --__base::size();
         ++__base::__start_;
-        if (__front_spare() >= 2 * __base::__block_size)
+        if (__front_spare() >= 2 * __value_traits::__block_size)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.front(), __value_traits::__block_size);
             __base::__map_.pop_front();
-            __base::__start_ -= __base::__block_size;
+            __base::__start_ -= __value_traits::__block_size;
         }
     }
     else
     {   // erase from back
         iterator __i = _VSTD::move(_VSTD::next(__p), __base::end(), __p);
         __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
         --__base::size();
-        if (__back_spare() >= 2 * __base::__block_size)
+        if (__back_spare() >= 2 * __value_traits::__block_size)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
             __base::__map_.pop_back();
         }
     }
@@ -2744,22 +2751,22 @@
                 __alloc_traits::destroy(__a, _VSTD::addressof(*__b));
             __base::size() -= __n;
             __base::__start_ += __n;
-            while (__front_spare() >= 2 * __base::__block_size)
+            while (__front_spare() >= 2 * __value_traits::__block_size)
             {
-                __alloc_traits::deallocate(__a, __base::__map_.front(), __base::__block_size);
+                __alloc_traits::deallocate(__a, __base::__map_.front(), __value_traits::__block_size);
                 __base::__map_.pop_front();
-                __base::__start_ -= __base::__block_size;
+                __base::__start_ -= __value_traits::__block_size;
             }
         }
         else
         {   // erase from back
             iterator __i = _VSTD::move(__p + __n, __base::end(), __p);
             for (iterator __e = __base::end(); __i != __e; ++__i)
                 __alloc_traits::destroy(__a, _VSTD::addressof(*__i));
             __base::size() -= __n;
-            while (__back_spare() >= 2 * __base::__block_size)
+            while (__back_spare() >= 2 * __value_traits::__block_size)
             {
-                __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+                __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
                 __base::__map_.pop_back();
             }
         }
@@ -2781,9 +2788,9 @@
         for (iterator __p = __b + __pos; __p != __e; ++__p)
             __alloc_traits::destroy(__a, _VSTD::addressof(*__p));
         __base::size() -= __n;
-        while (__back_spare() >= 2 * __base::__block_size)
+        while (__back_spare() >= 2 * __value_traits::__block_size)
         {
-            __alloc_traits::deallocate(__a, __base::__map_.back(), __base::__block_size);
+            __alloc_traits::deallocate(__a, __base::__map_.back(), __value_traits::__block_size);
             __base::__map_.pop_back();
         }
     }
Index: test/std/containers/sequences/deque/deque.cons/incomplete.pass.cpp
===================================================================
--- test/std/containers/sequences/deque/deque.cons/incomplete.pass.cpp
+++ test/std/containers/sequences/deque/deque.cons/incomplete.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <deque>
+
+// deque()
+// deque::iterator()
+
+#include <deque>
+#include <cassert>
+
+struct A {
+  std::deque<A> d;
+  std::deque<A>::iterator it;
+  std::deque<A>::reverse_iterator it2;
+};
+
+int main()
+{
+  A a;
+  assert(a.d.size() == 0);
+  a.it = a.d.begin();
+  a.it2 = a.d.rend();
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to