31 #define _PTR_TRAITS_H 1 33 #if __cplusplus >= 201103L 37 namespace std _GLIBCXX_VISIBILITY(default)
39 _GLIBCXX_BEGIN_NAMESPACE_VERSION
44 template<
typename _Tp>
45 struct __get_first_arg
46 {
using type = __undefined; };
48 template<
template<
typename,
typename...>
class _Template,
typename _Tp,
50 struct __get_first_arg<_Template<_Tp, _Types...>>
51 {
using type = _Tp; };
53 template<
typename _Tp>
54 using __get_first_arg_t =
typename __get_first_arg<_Tp>::type;
57 template<
typename _Tp,
typename _Up>
58 struct __replace_first_arg
59 {
using type = __undefined; };
61 template<
template<
typename,
typename...>
class _Template,
typename _Up,
62 typename _Tp,
typename... _Types>
63 struct __replace_first_arg<_Template<_Tp, _Types...>, _Up>
64 {
using type = _Template<_Up, _Types...>; };
66 template<
typename _Tp,
typename _Up>
67 using __replace_first_arg_t =
typename __replace_first_arg<_Tp, _Up>::type;
69 template<
typename _Tp>
71 =
typename conditional<is_void<_Tp>::value, __undefined, _Tp>::type;
77 template<
typename _Ptr>
81 template<
typename _Tp>
82 using __element_type =
typename _Tp::element_type;
84 template<
typename _Tp>
85 using __difference_type =
typename _Tp::difference_type;
87 template<
typename _Tp,
typename _Up>
88 using __rebind =
typename _Tp::template
rebind<_Up>;
96 = __detected_or_t_<__get_first_arg_t, __element_type, _Ptr>;
100 = __detected_or_t<ptrdiff_t, __difference_type, _Ptr>;
103 template<
typename _Up>
105 = __detected_or_t_<__replace_first_arg_t, __rebind, _Ptr, _Up>;
108 pointer_to(__make_not_void<element_type>& __e)
109 {
return _Ptr::pointer_to(__e); }
111 static_assert(!is_same<element_type, __undefined>::value,
112 "pointer type defines element_type or is like SomePointer<T, Args>");
114 "pointer type defines rebind<U> or is like SomePointer<T, Args>");
121 template<
typename _Tp>
131 template<
typename _Up>
145 template<
typename _Ptr,
typename _Tp>
148 _GLIBCXX_END_NAMESPACE_VERSION
typename pointer_traits< _Ptr >::template rebind< _Tp > __ptr_rebind
Convenience alias for rebinding pointers.
__detected_or_t_< __replace_first_arg_t, __rebind, _Ptr, _Up > rebind
A pointer to a different type.
_Tp element_type
The type pointed to.
_Tp * pointer
The pointer type.
__detected_or_t< ptrdiff_t, __difference_type, _Ptr > difference_type
The type used to represent the difference between two pointers.
Uniform interface to all pointer-like types.
_Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
_Ptr pointer
The pointer type.
ISO C++ entities toplevel namespace is std.
static pointer pointer_to(__make_not_void< element_type > &__r) noexcept
Obtain a pointer to an object.
__detected_or_t_< __get_first_arg_t, __element_type, _Ptr > element_type
The type pointed to.
ptrdiff_t difference_type
Type used to represent the difference between two pointers.