5 #ifndef VCCC_MEMORY_POINTER_TRAITS_HPP
6 #define VCCC_MEMORY_POINTER_TRAITS_HPP
21 struct pointer_traits_element_type {};
23 template<
typename Ptr>
24 struct pointer_traits_element_type<Ptr, true> {
25 using type =
typename Ptr::element_type;
28 template<
template<
typename,
typename...>
class Ptr,
typename T,
typename... Args>
29 struct pointer_traits_element_type<Ptr<T, Args...>, false> {
34 struct pointer_traits_difference_type {
35 using type =
typename Ptr::difference_type;
38 template<
typename Ptr>
39 struct pointer_traits_difference_type<Ptr, false> {
40 using type = std::ptrdiff_t;
43 template<
typename T,
typename U,
typename =
void>
44 struct has_rebind : std::false_type {};
45 template<
typename T,
typename U>
46 struct has_rebind<T, U,
void_t<typename T::template rebind<U>>> : std::true_type {};
49 struct pointer_traits_rebind;
51 template<
typename Ptr,
typename U>
52 struct pointer_traits_rebind<Ptr, U, true> {
53 using type =
typename Ptr::template rebind<U>;
56 template<
template<
typename,
typename...>
class Ptr,
typename U,
typename T,
typename... Args>
57 struct pointer_traits_rebind<Ptr<T, Args...>, U, false> {
58 using type = Ptr<U, Args...>;
61 template<
typename Ptr,
bool = has_
typename_type<po
inter_traits_element_type<Ptr>>::value >
62 struct pointer_traits_impl {
64 using element_type =
typename pointer_traits_element_type<Ptr>::type;
65 using difference_type =
typename pointer_traits_difference_type<Ptr>::type;
68 using rebind =
typename pointer_traits_rebind<Ptr, U>::type;
70 static pointer pointer_to(element_type& r) {
71 return Ptr::pointer_to(r);
75 template<
typename Ptr>
76 struct pointer_traits_impl<Ptr, false> {};
83 template<
typename Ptr>
85 : detail::pointer_traits_impl<Ptr> {};
#define VCCC_CONSTEXPR_AFTER_CXX17
Definition: constexpr.hpp:20
std::enable_if_t< std::is_object< T >::value, T * > addressof(T &t) noexcept
Definition: addressof.hpp:33
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35
static VCCC_CONSTEXPR_AFTER_CXX17 pointer pointer_to(element_type &r) noexcept
Definition: pointer_traits.hpp:96
U * rebind
Definition: pointer_traits.hpp:94
T * pointer
Definition: pointer_traits.hpp:89
T element_type
Definition: pointer_traits.hpp:90
std::ptrdiff_t difference_type
Definition: pointer_traits.hpp:91
Definition: pointer_traits.hpp:85