1#ifndef NEFORCE_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
2#define NEFORCE_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
16NEFORCE_BEGIN_NAMESPACE__
27template <
typename,
typename =
void>
28struct iterator_traits_base {};
30template <
typename Iterator>
31struct iterator_traits_base<Iterator,
void_t<typename Iterator::iterator_category, typename Iterator::value_type,
32 typename Iterator::difference_type, typename Iterator::pointer,
33 typename Iterator::reference>> {
34 using iterator_category =
typename Iterator::iterator_category;
35 using value_type =
typename Iterator::value_type;
36 using difference_type =
typename Iterator::difference_type;
37 using pointer =
typename Iterator::pointer;
38 using reference =
typename Iterator::reference;
55template <
typename Iterator>
83template <
typename Iterator>
91template <
typename Iterator>
99template <
typename Iterator>
107template <
typename Iterator>
115template <
typename Iterator>
127template <
typename Iterator>
128#ifdef NEFORCE_STANDARD_20
140template <
typename Iterator>
141#ifdef NEFORCE_STANDARD_20
157template <typename Ptr, enable_if_t<is_pointer<Ptr>::value,
int> = 0>
158static constexpr decltype(
auto) __to_address(
const Ptr& ptr)
noexcept {
164static constexpr decltype(
auto) __to_address(
const Ptr& ptr)
noexcept {
165 return inner::__to_address(ptr.operator->());
169static constexpr decltype(
auto) __to_address(
const Ptr& ptr)
noexcept {
188template <
typename Ptr,
typename Elem>
189struct pointer_traits_base {
191 using element_type = Elem;
193 using reference = conditional_t<is_void<Elem>::value, char, Elem>&;
199 template <
typename U>
200 using rebind =
typename get_rebind_type<Ptr, U>::type;
207 NEFORCE_NODISCARD
static constexpr pointer pointer_to(reference x)
noexcept(
noexcept(Ptr::pointer_to(x))) {
208 return Ptr::pointer_to(x);
216 NEFORCE_NODISCARD
static constexpr decltype(
auto)
to_address(
const Ptr& ptr)
noexcept {
217 return inner::__to_address(ptr);
221template <
typename,
typename =
void,
typename =
void>
222struct pointer_traits_extract {};
224template <
typename T,
typename U>
226: pointer_traits_base<T, typename get_first_temp_para<T>::type> {};
229struct pointer_traits_extract<T,
void_t<typename T::element_type>, void>
230: pointer_traits_base<T, typename T::element_type> {};
254 NEFORCE_NODISCARD
static constexpr decltype(
auto)
to_address(
const T& ptr)
noexcept {
255 return inner::__to_address(ptr);
275 template <
typename U>
285 NEFORCE_NODISCARD
static constexpr pointer
to_address(pointer ptr)
noexcept {
299template <
typename Ptr,
typename T>
308template <
typename Ptr>
334template <
typename Ptr>
335constexpr decltype(
auto)
to_address(
const Ptr& ptr)
noexcept {
355template <
typename T,
typename Dummy =
void>
357 using type =
typename T::value_type*;
363 using type =
typename T::pointer;
374template <
typename T,
typename Dummy =
void>
376 using pointer =
typename get_pointer_type<T>::type;
383 using type =
typename T::difference_type;
394template <
typename T,
typename Dummy =
void>
402 using type =
typename T::size_type;
408NEFORCE_END_NAMESPACE__
NEFORCE_NODISCARD constexpr T * addressof(T &x) noexcept
获取对象的地址
typename iterator_traits< Iterator >::reference iter_reference_t
获取迭代器的引用类型
typename iterator_traits< Iterator >::iterator_category iter_category_t
获取迭代器的类别标签
remove_const_t< typename iter_value_t< Iterator >::first_type > iter_map_key_t
从映射迭代器中提取键类型
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
typename iter_value_t< Iterator >::second_type iter_map_value_t
从映射迭代器中提取值类型
typename iterator_traits< Iterator >::difference_type iter_difference_t
获取迭代器的差值类型
typename iterator_traits< Iterator >::pointer iter_pointer_t
获取迭代器的指针类型
constexpr decltype(auto) to_address(const Ptr &ptr) noexcept
安全地获取任意指针类型指向的地址
typename pointer_traits< Ptr >::template rebind< T > pointer_rebind
指针重新绑定的便捷别名
constexpr decltype(auto) ptr_const_cast(Ptr ptr) noexcept
移除指针的const限定符
NEFORCE_NODISCARD constexpr reference_wrapper< T > ref(T &val) noexcept
创建引用包装器
typename remove_const< T >::type remove_const_t
remove_const的便捷别名
typename remove_cv< T >::type remove_cv_t
remove_cv的便捷别名
typename make_unsigned< T >::type make_unsigned_t
make_unsigned的便捷别名
typename get_ptr_difference< T >::type get_ptr_difference_t
get_ptr_difference的便捷别名
typename get_first_temp_para< Tmp >::type get_first_temp_para_t
get_first_temp_para的便捷别名
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
static constexpr bool value
contiguous_iterator_tag iterator_category
迭代器类别
ptrdiff_t difference_type
差值类型
remove_cv_t< T > value_type
值类型
ptrdiff_t difference_type
差值类型
static NEFORCE_NODISCARD constexpr pointer pointer_to(reference ref) noexcept
从引用创建指针
conditional_t< is_void< T >::value, char, T > & reference
引用类型
static NEFORCE_NODISCARD constexpr decltype(auto) to_address(const T &ptr) noexcept
获取指针指向的原始地址