// Pointer Traits -*- C++ -*- // Copyright (C) 2011-2017 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // <http://www.gnu.org/licenses/>. /** @file bits/ptr_traits.h * This is an internal header file, included by other library headers. * Do not attempt to use it directly. @headername{memory} */ #ifndef _PTR_TRAITS_H #define _PTR_TRAITS_H 1 #if __cplusplus >= 201103L #include <bits/move.h> namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION class __undefined; // Given Template<T, ...> return T, otherwise invalid. template<typename _Tp> struct __get_first_arg { using type = __undefined; }; template<template<typename, typename...> class _Template, typename _Tp, typename... _Types> struct __get_first_arg<_Template<_Tp, _Types...>> { using type = _Tp; }; template<typename _Tp> using __get_first_arg_t = typename __get_first_arg<_Tp>::type; // Given Template<T, ...> and U return Template<U, ...>, otherwise invalid. template<typename _Tp, typename _Up> struct __replace_first_arg { }; template<template<typename, typename...> class _Template, typename _Up, typename _Tp, typename... _Types> struct __replace_first_arg<_Template<_Tp, _Types...>, _Up> { using type = _Template<_Up, _Types...>; }; template<typename _Tp, typename _Up> using __replace_first_arg_t = typename __replace_first_arg<_Tp, _Up>::type; template<typename _Tp> using __make_not_void = typename conditional<is_void<_Tp>::value, __undefined, _Tp>::type; /** * @brief Uniform interface to all pointer-like types * @ingroup pointer_abstractions */ template<typename _Ptr> struct pointer_traits { private: template<typename _Tp> using __element_type = typename _Tp::element_type; template<typename _Tp> using __difference_type = typename _Tp::difference_type; template<typename _Tp, typename _Up, typename = void> struct __rebind : __replace_first_arg<_Tp, _Up> { }; template<typename _Tp, typename _Up> struct __rebind<_Tp, _Up, __void_t<typename _Tp::template rebind<_Up>>> { using type = typename _Tp::template rebind<_Up>; }; public: /// The pointer type. using pointer = _Ptr; /// The type pointed to. using element_type = __detected_or_t<__get_first_arg_t<_Ptr>, __element_type, _Ptr>; /// The type used to represent the difference between two pointers. using difference_type = __detected_or_t<ptrdiff_t, __difference_type, _Ptr>; /// A pointer to a different type. template<typename _Up> using rebind = typename __rebind<_Ptr, _Up>::type; static _Ptr pointer_to(__make_not_void<element_type>& __e) { return _Ptr::pointer_to(__e); } static_assert(!is_same<element_type, __undefined>::value, "pointer type defines element_type or is like SomePointer<T, Args>"); }; /** * @brief Partial specialization for built-in pointers. * @ingroup pointer_abstractions */ template<typename _Tp> struct pointer_traits<_Tp*> { /// The pointer type typedef _Tp* pointer; /// The type pointed to typedef _Tp element_type; /// Type used to represent the difference between two pointers typedef ptrdiff_t difference_type; template<typename _Up> using rebind = _Up*; /** * @brief Obtain a pointer to an object * @param __r A reference to an object of type @c element_type * @return @c addressof(__r) */ static pointer pointer_to(__make_not_void<element_type>& __r) noexcept { return std::addressof(__r); } }; /// Convenience alias for rebinding pointers. template<typename _Ptr, typename _Tp> using __ptr_rebind = typename pointer_traits<_Ptr>::template rebind<_Tp>; _GLIBCXX_END_NAMESPACE_VERSION } // namespace std #endif #endif
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
algorithmfwd.h | File | 21.23 KB | 0644 |
|
alloc_traits.h | File | 19.13 KB | 0644 |
|
allocated_ptr.h | File | 3.43 KB | 0644 |
|
allocator.h | File | 6.73 KB | 0644 |
|
atomic_base.h | File | 23.28 KB | 0644 |
|
atomic_futex.h | File | 9.35 KB | 0644 |
|
atomic_lockfree_defines.h | File | 2.2 KB | 0644 |
|
basic_ios.h | File | 15.7 KB | 0644 |
|
basic_ios.tcc | File | 5.94 KB | 0644 |
|
basic_string.h | File | 235.15 KB | 0644 |
|
basic_string.tcc | File | 52.5 KB | 0644 |
|
boost_concept_check.h | File | 26.41 KB | 0644 |
|
c++0x_warning.h | File | 1.44 KB | 0644 |
|
char_traits.h | File | 20.26 KB | 0644 |
|
codecvt.h | File | 20.8 KB | 0644 |
|
concept_check.h | File | 3.34 KB | 0644 |
|
cpp_type_traits.h | File | 9.37 KB | 0644 |
|
cxxabi_forced.h | File | 1.77 KB | 0644 |
|
cxxabi_init_exception.h | File | 2.17 KB | 0644 |
|
deque.tcc | File | 33.26 KB | 0644 |
|
enable_special_members.h | File | 12.1 KB | 0644 |
|
exception.h | File | 2.23 KB | 0644 |
|
exception_defines.h | File | 1.61 KB | 0644 |
|
exception_ptr.h | File | 6.31 KB | 0644 |
|
forward_list.h | File | 47.5 KB | 0644 |
|
forward_list.tcc | File | 14.68 KB | 0644 |
|
fstream.tcc | File | 32.14 KB | 0644 |
|
functexcept.h | File | 3.18 KB | 0644 |
|
functional_hash.h | File | 8 KB | 0644 |
|
gslice.h | File | 5.39 KB | 0644 |
|
gslice_array.h | File | 7.59 KB | 0644 |
|
hash_bytes.h | File | 2.1 KB | 0644 |
|
hashtable.h | File | 71.56 KB | 0644 |
|
hashtable_policy.h | File | 65.47 KB | 0644 |
|
indirect_array.h | File | 7.68 KB | 0644 |
|
invoke.h | File | 3.57 KB | 0644 |
|
ios_base.h | File | 30.22 KB | 0644 |
|
istream.tcc | File | 30.36 KB | 0644 |
|
list.tcc | File | 15.54 KB | 0644 |
|
locale_classes.h | File | 24.31 KB | 0644 |
|
locale_classes.tcc | File | 8.18 KB | 0644 |
|
locale_conv.h | File | 15.7 KB | 0644 |
|
locale_facets.h | File | 89.98 KB | 0644 |
|
locale_facets.tcc | File | 38.64 KB | 0644 |
|
locale_facets_nonio.h | File | 67.33 KB | 0644 |
|
locale_facets_nonio.tcc | File | 44.46 KB | 0644 |
|
localefwd.h | File | 5.51 KB | 0644 |
|
mask_array.h | File | 7.42 KB | 0644 |
|
memoryfwd.h | File | 2.36 KB | 0644 |
|
move.h | File | 6.5 KB | 0644 |
|
nested_exception.h | File | 4.66 KB | 0644 |
|
node_handle.h | File | 7.97 KB | 0644 |
|
ostream.tcc | File | 12.03 KB | 0644 |
|
ostream_insert.h | File | 3.91 KB | 0644 |
|
parse_numbers.h | File | 7.84 KB | 0644 |
|
postypes.h | File | 8.02 KB | 0644 |
|
predefined_ops.h | File | 8.87 KB | 0644 |
|
ptr_traits.h | File | 4.75 KB | 0644 |
|
quoted_string.h | File | 4.47 KB | 0644 |
|
random.h | File | 171.19 KB | 0644 |
|
random.tcc | File | 103.08 KB | 0644 |
|
range_access.h | File | 9.75 KB | 0644 |
|
refwrap.h | File | 13.48 KB | 0644 |
|
regex.h | File | 95.9 KB | 0644 |
|
regex.tcc | File | 16.1 KB | 0644 |
|
regex_automaton.h | File | 10.47 KB | 0644 |
|
regex_automaton.tcc | File | 7.65 KB | 0644 |
|
regex_compiler.h | File | 16.79 KB | 0644 |
|
regex_compiler.tcc | File | 18.46 KB | 0644 |
|
regex_constants.h | File | 14.36 KB | 0644 |
|
regex_error.h | File | 4.85 KB | 0644 |
|
regex_executor.h | File | 7.31 KB | 0644 |
|
regex_executor.tcc | File | 16.91 KB | 0644 |
|
regex_scanner.h | File | 6.92 KB | 0644 |
|
regex_scanner.tcc | File | 14.66 KB | 0644 |
|
shared_ptr.h | File | 22.37 KB | 0644 |
|
shared_ptr_atomic.h | File | 9.54 KB | 0644 |
|
shared_ptr_base.h | File | 52.54 KB | 0644 |
|
slice_array.h | File | 9.13 KB | 0644 |
|
specfun.h | File | 44.03 KB | 0644 |
|
sstream.tcc | File | 9.88 KB | 0644 |
|
std_abs.h | File | 3.21 KB | 0644 |
|
std_function.h | File | 23.41 KB | 0644 |
|
std_mutex.h | File | 9.08 KB | 0644 |
|
stl_algo.h | File | 208.85 KB | 0644 |
|
stl_algobase.h | File | 49.22 KB | 0644 |
|
stl_bvector.h | File | 33.03 KB | 0644 |
|
stl_construct.h | File | 7.22 KB | 0644 |
|
stl_deque.h | File | 75.95 KB | 0644 |
|
stl_function.h | File | 32.5 KB | 0644 |
|
stl_heap.h | File | 19.73 KB | 0644 |
|
stl_iterator.h | File | 40.77 KB | 0644 |
|
stl_iterator_base_funcs.h | File | 7.88 KB | 0644 |
|
stl_iterator_base_types.h | File | 8.48 KB | 0644 |
|
stl_list.h | File | 63.65 KB | 0644 |
|
stl_map.h | File | 50.02 KB | 0644 |
|
stl_multimap.h | File | 39 KB | 0644 |
|
stl_multiset.h | File | 33.26 KB | 0644 |
|
stl_numeric.h | File | 13.51 KB | 0644 |
|
stl_pair.h | File | 18.21 KB | 0644 |
|
stl_queue.h | File | 21.61 KB | 0644 |
|
stl_raw_storage_iter.h | File | 3.74 KB | 0644 |
|
stl_relops.h | File | 4.49 KB | 0644 |
|
stl_set.h | File | 33.63 KB | 0644 |
|
stl_stack.h | File | 11.18 KB | 0644 |
|
stl_tempbuf.h | File | 8.15 KB | 0644 |
|
stl_tree.h | File | 73.07 KB | 0644 |
|
stl_uninitialized.h | File | 27 KB | 0644 |
|
stl_vector.h | File | 54.33 KB | 0644 |
|
stream_iterator.h | File | 6.5 KB | 0644 |
|
streambuf.tcc | File | 4.81 KB | 0644 |
|
streambuf_iterator.h | File | 12.33 KB | 0644 |
|
string_view.tcc | File | 6.48 KB | 0644 |
|
stringfwd.h | File | 2.55 KB | 0644 |
|
uniform_int_dist.h | File | 9.91 KB | 0644 |
|
unique_ptr.h | File | 24.88 KB | 0644 |
|
unordered_map.h | File | 67.04 KB | 0644 |
|
unordered_set.h | File | 52.56 KB | 0644 |
|
uses_allocator.h | File | 6.23 KB | 0644 |
|
valarray_after.h | File | 22.12 KB | 0644 |
|
valarray_array.h | File | 21.3 KB | 0644 |
|
valarray_array.tcc | File | 7.08 KB | 0644 |
|
valarray_before.h | File | 18.08 KB | 0644 |
|
vector.tcc | File | 26.95 KB | 0644 |
|