1#ifndef MSTL_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
2#define MSTL_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
27template <
typename,
typename =
void>
28struct iterator_traits_base {};
30template <
typename Iterator>
31struct iterator_traits_base<Iterator,
32 void_t<typename Iterator::iterator_category, typename Iterator::value_type,
33 typename Iterator::difference_type, typename Iterator::pointer, typename Iterator::reference>>
35 using iterator_category =
typename Iterator::iterator_category;
36 using value_type =
typename Iterator::value_type;
37 using difference_type =
typename Iterator::difference_type;
38 using pointer =
typename Iterator::pointer;
39 using reference =
typename Iterator::reference;
56template <
typename Iterator>
84template <
typename Iterator>
92template <
typename Iterator>
100template <
typename Iterator>
108template <
typename Iterator>
116template <
typename Iterator>
128template <
typename Iterator>
129#ifdef MSTL_STANDARD_20__
130requires is_pair_v<iter_value_t<Iterator>>
141template <
typename Iterator>
142#ifdef MSTL_STANDARD_20__
143requires is_pair_v<iter_value_t<Iterator>>
172template <
typename Ptr,
typename Elem>
173struct pointer_traits_base {
175 using element_type = Elem;
183 template <
typename U>
184 using rebind =
typename get_rebind_type<Ptr, U>::type;
191 MSTL_NODISCARD
static constexpr pointer pointer_to(reference x)
192 noexcept(
noexcept(Ptr::pointer_to(x))) {
193 return Ptr::pointer_to(x);
197template <
typename,
typename =
void,
typename =
void>
198struct __ptr_traits_extract {};
200template <
typename T,
typename U>
202 : pointer_traits_base<T, typename get_first_temp_para<T>::type> {
206struct __ptr_traits_extract<T,
void_t<typename T::element_type>, void>
207 : pointer_traits_base<T, typename T::element_type> {
244 template <
typename U>
265template <
typename Ptr,
typename T>
274template <
typename Ptr>
299constexpr T* __to_address(T* ptr)
noexcept {
304template <
typename Ptr>
305constexpr decltype(
auto) __to_address(
const Ptr& ptr)
noexcept {
310constexpr decltype(
auto) __to_address(
const Ptr& ptr, None...)
noexcept {
311 return __to_address(ptr.operator->());
315constexpr decltype(
auto) __to_address(
const Ptr& ptr, None...)
noexcept {
316 return __to_address(ptr.base().operator->());
331 return _INNER __to_address(ptr);
340template <
typename Ptr>
341constexpr decltype(
auto)
to_address(
const Ptr& ptr)
noexcept {
342 return _INNER __to_address(ptr);
361template <
typename T,
typename Dummy =
void>
363 using type =
typename T::value_type*;
369 using type =
typename T::pointer;
380template <
typename T,
typename Dummy =
void>
382 using pointer =
typename get_pointer_type<T>::type;
389 using type =
typename T::difference_type;
400template <
typename T,
typename Dummy =
void>
408 using type =
typename T::size_type;
MSTL_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
获取迭代器的指针类型
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_INNER__
结束inner命名空间
#define _INNER
inner命名空间前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
#define MSTL_BEGIN_INNER__
开始inner命名空间
typename pointer_traits< Ptr >::template rebind< T > pointer_rebind
指针重新绑定的便捷别名
constexpr decltype(auto) ptr_const_cast(Ptr ptr) noexcept
移除指针的const限定符
constexpr T * to_address(T *ptr) 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的便捷别名
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
static constexpr bool value
contiguous_iterator_tag iterator_category
迭代器类别
ptrdiff_t difference_type
差值类型
remove_cv_t< T > value_type
值类型
ptrdiff_t difference_type
差值类型
static MSTL_NODISCARD constexpr pointer pointer_to(reference x) noexcept
从引用创建指针
conditional_t< is_void< T >::value, char, T > & reference
引用类型