31 #define _PTR_TRAITS_H 1 33 #if __cplusplus >= 201103L 37 #if __cplusplus > 201703L 38 namespace __gnu_debug {
struct _Safe_iterator_base; }
41 namespace std _GLIBCXX_VISIBILITY(default)
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
typename _Tp>
49 struct __get_first_arg
50 {
using type = __undefined; };
52 template<
template<
typename,
typename...>
class _Template,
typename _Tp,
54 struct __get_first_arg<_Template<_Tp, _Types...>>
55 {
using type = _Tp; };
57 template<
typename _Tp>
58 using __get_first_arg_t =
typename __get_first_arg<_Tp>::type;
61 template<
typename _Tp,
typename _Up>
62 struct __replace_first_arg
65 template<
template<
typename,
typename...>
class _Template,
typename _Up,
66 typename _Tp,
typename... _Types>
67 struct __replace_first_arg<_Template<_Tp, _Types...>, _Up>
68 {
using type = _Template<_Up, _Types...>; };
70 template<
typename _Tp,
typename _Up>
71 using __replace_first_arg_t =
typename __replace_first_arg<_Tp, _Up>::type;
73 template<
typename _Tp>
75 =
typename conditional<is_void<_Tp>::value, __undefined, _Tp>::type;
81 template<
typename _Ptr>
85 template<
typename _Tp>
86 using __element_type =
typename _Tp::element_type;
88 template<
typename _Tp>
89 using __difference_type =
typename _Tp::difference_type;
91 template<
typename _Tp,
typename _Up,
typename =
void>
92 struct __rebind : __replace_first_arg<_Tp, _Up> { };
94 template<
typename _Tp,
typename _Up>
95 struct __rebind<_Tp, _Up, __void_t<typename _Tp::template
rebind<_Up>>>
96 {
using type =
typename _Tp::template
rebind<_Up>; };
104 = __detected_or_t<__get_first_arg_t<_Ptr>, __element_type, _Ptr>;
108 = __detected_or_t<ptrdiff_t, __difference_type, _Ptr>;
111 template<
typename _Up>
112 using rebind =
typename __rebind<_Ptr, _Up>::type;
115 pointer_to(__make_not_void<element_type>& __e)
116 {
return _Ptr::pointer_to(__e); }
119 "pointer type defines element_type or is like SomePointer<T, Args>");
126 template<
typename _Tp>
136 template<
typename _Up>
150 template<
typename _Ptr,
typename _Tp>
153 template<
typename _Tp>
155 __to_address(_Tp* __ptr) noexcept
161 #if __cplusplus <= 201703L 162 template<
typename _Ptr>
164 __to_address(
const _Ptr& __ptr)
165 {
return std::__to_address(__ptr.operator->()); }
167 template<
typename _Ptr>
169 __to_address(
const _Ptr& __ptr) noexcept
173 template<
typename _Ptr,
typename... _None>
175 __to_address(
const _Ptr& __ptr, _None...) noexcept
177 if constexpr (is_base_of_v<__gnu_debug::_Safe_iterator_base, _Ptr>)
178 return std::__to_address(__ptr.base().operator->());
180 return std::__to_address(__ptr.operator->());
189 template<
typename _Tp>
191 to_address(_Tp* __ptr) noexcept
192 {
return std::__to_address(__ptr); }
201 template<
typename _Ptr>
203 to_address(
const _Ptr& __ptr) noexcept
204 {
return std::__to_address(__ptr); }
207 _GLIBCXX_END_NAMESPACE_VERSION
GNU debug classes for public use.
Uniform interface to all pointer-like types.
ptrdiff_t difference_type
Type used to represent the difference between two pointers.
_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.
typename __rebind< _Ptr, _Up >::type rebind
A pointer to a different type.
_GLIBCXX17_CONSTEXPR _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
ISO C++ entities toplevel namespace is std.
static pointer pointer_to(__make_not_void< element_type > &__r) noexcept
Obtain a pointer to an object.
_Ptr pointer
The pointer type.
__detected_or_t< __get_first_arg_t< _Ptr >, __element_type, _Ptr > element_type
The type pointed to.
typename pointer_traits< _Ptr >::template rebind< _Tp > __ptr_rebind
Convenience alias for rebinding pointers.
_Tp element_type
The type pointed to.