Patchwork [v3] use alias-declaration to complete allocator and pointer traits

login
register
mail settings
Submitter Jonathan Wakely
Date Nov. 8, 2011, 12:34 a.m.
Message ID <CAH6eHdTNoozwg-m8AUoZNt3fu-4kYkprO6YPa27ovmJhrZWBSA@mail.gmail.com>
Download mbox | patch
Permalink /patch/124226/
State New
Headers show

Comments

Jonathan Wakely - Nov. 8, 2011, 12:34 a.m.
The new alias-declaration support in trunk allows the
std::pointer_traits and std::allocator_traits implementations to be
finished, by replacing the __rebind::__type workarounds with the
required alias-declarations.

        * include/bits/ptr_traits.h (__rebind): Replace with...
        (rebind): Implement using alias-declaration.
        * include/ext/pointer.h (__rebind): Replace with...
        (rebind): Implement using alias-declaration.
        * include/bits/alloc_traits.h (__rebind_alloc, __rebind_traits):
        Replace with...
        (rebind_alloc, rebind_traits): Implement using alias-declaration.
        * include/ext/alloc_traits.h (rebind): Use rebind_alloc instead of
        __rebind_alloc.
        * include/std/scoped_allocator (rebind): Likewise.

Tested x86_64-linux and x86_64-netbsd, committed to trunk.

Patch

Index: include/bits/ptr_traits.h
===================================================================
--- include/bits/ptr_traits.h	(revision 181128)
+++ include/bits/ptr_traits.h	(working copy)
@@ -86,46 +86,19 @@ 
       static const bool __value = _S_chk<_Ptr, _Up>(nullptr);
     };
 
-  // hack to use _Tp::__rebind<_Up>::__type instead if that exists
-  template<typename _Ptr, typename _Up>
-    class __ptrtr_rebind_helper2
-    {
-      template<typename _Ptr2, typename _Up2>
-	static constexpr bool
-       	_S_chk(typename _Ptr2::template __rebind<_Up2>::__type*)
-	{ return true; }
-
-      template<typename, typename>
-        static constexpr bool
-       	_S_chk(...)
-       	{ return false; }
-
-    public:
-      static const bool __value = _S_chk<_Ptr, _Up>(nullptr);
-    };
-
-  /* TODO: remove second bool when alias templates are supported */
   template<typename _Tp, typename _Up,
-           bool = __ptrtr_rebind_helper<_Tp, _Up>::__value,
-           bool = __ptrtr_rebind_helper2<_Tp, _Up>::__value>
+           bool = __ptrtr_rebind_helper<_Tp, _Up>::__value>
     struct __ptrtr_rebind;
 
-  template<typename _Tp, typename _Up, bool _B2>
-    struct __ptrtr_rebind<_Tp, _Up, true, _B2>
+  template<typename _Tp, typename _Up>
+    struct __ptrtr_rebind<_Tp, _Up, true>
     {
       typedef typename _Tp::template rebind<_Up> __type;
     };
 
-  /* TODO: remove this when alias templates are supported */
-  template<typename _Tp, typename _Up>
-    struct __ptrtr_rebind<_Tp, _Up, false, true>
-    {
-      typedef typename _Tp::template __rebind<_Up>::__type __type;
-    };
-
   template<template<typename, typename...> class _SomePtr, typename _Up,
             typename _Tp, typename... _Args>
-    struct __ptrtr_rebind<_SomePtr<_Tp, _Args...>, _Up, false, false>
+    struct __ptrtr_rebind<_SomePtr<_Tp, _Args...>, _Up, false>
     {
       typedef _SomePtr<_Up, _Args...> __type;
     };
@@ -168,14 +141,8 @@ 
       typedef typename __ptrtr_diff_type<_Ptr>::__type  difference_type;
 
     private:
-      /* TODO: replace __rebind<U> with alias template rebind<U> */
-      /*
       template<typename _Up>
-        using rebind<_Up> = typename __ptrtr_rebind<_Ptr, _Up>::__type;
-      */
-      template<typename _Up>
-       	struct __rebind
-        { typedef typename __ptrtr_rebind<_Ptr, _Up>::__type __type; };
+        using rebind = typename __ptrtr_rebind<_Ptr, _Up>::__type;
 
       // allocator_traits needs to use __rebind
       template<typename> friend struct allocator_traits;
@@ -197,13 +164,8 @@ 
       /// Type used to represent the difference between two pointers
       typedef ptrdiff_t difference_type;
 
-      /* TODO: replace __rebind<U> with alias template rebind<U> */
-      /*
       template<typename _Up>
-        using rebind<_Up> = U*;
-      */
-      template<typename U>
-       	struct __rebind { typedef U* __type; };
+        using rebind = _Up*;
 
       /**
        *  @brief  Obtain a pointer to an object
Index: include/bits/alloc_traits.h
===================================================================
--- include/bits/alloc_traits.h	(revision 181128)
+++ include/bits/alloc_traits.h	(working copy)
@@ -102,10 +102,8 @@ 
       */
       typedef __pointer pointer;
 
-// TODO: Use pointer_traits::rebind alias template.
-
 _GLIBCXX_ALLOC_TR_NESTED_TYPE(const_pointer,
-  typename pointer_traits<pointer>::template __rebind<const value_type>::__type)
+  typename pointer_traits<pointer>::template rebind<const value_type>)
 
       /**
        * @brief   The allocator's const pointer type.
@@ -116,7 +114,7 @@ 
       typedef __const_pointer const_pointer;
 
 _GLIBCXX_ALLOC_TR_NESTED_TYPE(void_pointer,
-  typename pointer_traits<pointer>::template __rebind<void>::__type)
+  typename pointer_traits<pointer>::template rebind<void>)
 
       /**
        * @brief   The allocator's void pointer type.
@@ -127,7 +125,7 @@ 
       typedef __void_pointer void_pointer;
 
 _GLIBCXX_ALLOC_TR_NESTED_TYPE(const_void_pointer,
-  typename pointer_traits<pointer>::template __rebind<const void>::__type)
+  typename pointer_traits<pointer>::template rebind<const void>)
 
       /**
        * @brief   The allocator's const void pointer type.
@@ -196,24 +194,11 @@ 
 
 #undef _GLIBCXX_ALLOC_TR_NESTED_TYPE
 
-      /* TODO: use template alias 
       template<typename _Tp>
-        using rebind_alloc = __alloctr_rebind<_Alloc, _Tp>::__type;
+        using rebind_alloc = typename __alloctr_rebind<_Alloc, _Tp>::__type;
       template<typename _Tp>
         using rebind_traits = allocator_traits<rebind_alloc<_Tp>>;
-      */
-      template<typename _Tp>
-        struct __rebind_alloc
-	{
-  	  typedef typename __alloctr_rebind<_Alloc, _Tp>::__type __type;
-       	};
 
-      template<typename _Tp>
-        struct __rebind_traits
-	{
-	  typedef allocator_traits<typename __rebind_alloc<_Tp>::__type> __type;
-	};
-
     private:
       template<typename _Alloc2>
 	struct __allocate_helper
Index: include/ext/alloc_traits.h
===================================================================
--- include/ext/alloc_traits.h	(revision 181128)
+++ include/ext/alloc_traits.h	(working copy)
@@ -161,7 +161,7 @@ 
 
     template<typename _Tp>
       struct rebind
-      { typedef typename _Base_type::template __rebind_alloc<_Tp>::__type other; };
+      { typedef typename _Base_type::template rebind_alloc<_Tp> other; };
 #else
 
     typedef typename _Alloc::pointer                pointer;
Index: include/std/scoped_allocator
===================================================================
--- include/std/scoped_allocator	(revision 181128)
+++ include/std/scoped_allocator	(working copy)
@@ -267,9 +267,8 @@ 
       template <class _Tp>
         struct rebind
         {
-          // TODO: use rebind_alloc<Tp> instead of __rebind_alloc<Tp>::__type
           typedef scoped_allocator_adaptor<
-            typename __traits::template __rebind_alloc<_Tp>::__type,
+            typename __traits::template rebind_alloc<_Tp>,
             _InnerAllocs...> other;
         };
 
Index: include/ext/pointer.h
===================================================================
--- include/ext/pointer.h	(revision 181128)
+++ include/ext/pointer.h	(working copy)
@@ -577,21 +577,9 @@ 
       /// Type used to represent the difference between two pointers
       typedef typename pointer::difference_type         difference_type;
 
-      /* TODO: replace __rebind<U> with alias template rebind<U> */
-      /*
       template<typename _Up>
-        using rebind<_Up> = typename __gnu_cxx::_Pointer_adapter<
+        using rebind = typename __gnu_cxx::_Pointer_adapter<
           typename pointer_traits<_Storage_policy>::rebind<_Up>>
-      */
-      template<typename _Up>
-        class __rebind
-        {
-          typedef pointer_traits<_Storage_policy> _Policy_traits;
-          typedef typename _Policy_traits::template __rebind<_Up>::__type
-            _Rebound_policy;
-        public:
-          typedef typename __gnu_cxx::_Pointer_adapter<_Rebound_policy> __type;
-        };
 
       static pointer pointer_to(typename pointer::reference __r) noexcept
       { return pointer(std::addressof(__r)); }