* [v3] use alias-declaration to complete allocator and pointer traits
@ 2011-11-08 0:52 Jonathan Wakely
0 siblings, 0 replies; only message in thread
From: Jonathan Wakely @ 2011-11-08 0:52 UTC (permalink / raw)
To: libstdc++, gcc-patches
[-- Attachment #1: Type: text/plain, Size: 836 bytes --]
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.
[-- Attachment #2: alias.patch --]
[-- Type: text/x-patch, Size: 7207 bytes --]
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)); }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2011-11-08 0:34 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-11-08 0:52 [v3] use alias-declaration to complete allocator and pointer traits Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).