MSTL 1.4.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
iterator_traits.hpp
浏览该文件的文档.
1#ifndef MSTL_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
2#define MSTL_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
3
14
17
23
26
27template <typename, typename = void>
28struct iterator_traits_base {};
29
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>>
34{
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;
40};
41
44
45
56template <typename Iterator>
57struct iterator_traits : _INNER iterator_traits_base<Iterator> {};
58
68template <typename T>
69struct iterator_traits<T*> {
70 static_assert(is_object<T>::value, "iterator traits requires object types.");
71
75 using pointer = T*;
76 using reference = T&;
77};
78
84template <typename Iterator>
86
92template <typename Iterator>
94
100template <typename Iterator>
102
108template <typename Iterator>
110
116template <typename Iterator>
118
119
128template <typename Iterator>
129#ifdef MSTL_STANDARD_20__
130requires is_pair_v<iter_value_t<Iterator>>
131#endif
133
141template <typename Iterator>
142#ifdef MSTL_STANDARD_20__
143requires is_pair_v<iter_value_t<Iterator>>
144#endif
146 // IteratorTraits
148
154
157
172template <typename Ptr, typename Elem>
173struct pointer_traits_base {
174 using pointer = Ptr;
175 using element_type = Elem;
176 using difference_type = get_ptr_difference_t<Ptr>;
177 using reference = conditional_t<is_void<Elem>::value, char, Elem>&;
178
183 template <typename U>
184 using rebind = typename get_rebind_type<Ptr, U>::type;
185
191 MSTL_NODISCARD static constexpr pointer pointer_to(reference x)
192 noexcept(noexcept(Ptr::pointer_to(x))) {
193 return Ptr::pointer_to(x);
194 }
195};
196
197template <typename, typename = void, typename = void>
198struct __ptr_traits_extract {};
199
200template <typename T, typename U>
201struct __ptr_traits_extract<T, U, void_t<get_first_temp_para_t<T>>>
202 : pointer_traits_base<T, typename get_first_temp_para<T>::type> {
203};
204
205template <typename T>
206struct __ptr_traits_extract<T, void_t<typename T::element_type>, void>
207 : pointer_traits_base<T, typename T::element_type> {
208};
209
212
213
225template <typename T>
226struct pointer_traits : _INNER __ptr_traits_extract<T> {};
227
228
233template <typename T>
234struct pointer_traits<T*> {
235 using pointer = T*;
236 using element_type = T;
239
244 template <typename U>
245 using rebind = U*;
246
252 MSTL_NODISCARD static constexpr pointer pointer_to(reference x) noexcept {
253 return _MSTL addressof(x);
254 }
255};
256
265template <typename Ptr, typename T>
267
274template <typename Ptr>
275constexpr decltype(auto) ptr_const_cast(Ptr ptr) noexcept {
276 using T = typename pointer_traits<Ptr>::element_type;
277 using NonConst = remove_const_t<T>;
278 using Dest = typename pointer_traits<Ptr>::template rebind<NonConst>;
279
280 return pointer_traits<Dest>::pointer_to(const_cast<NonConst&>(*ptr));
281}
282
289template <typename T>
290constexpr decltype(auto) ptr_const_cast(T* ptr) noexcept {
291 return const_cast<remove_const_t<T>*>(ptr);
292}
293
294
297
298template <typename T>
299constexpr T* __to_address(T* ptr) noexcept {
300 static_assert(!is_function<T>::value, "not a function pointer");
301 return ptr;
302}
303
304template <typename Ptr>
305constexpr decltype(auto) __to_address(const Ptr& ptr) noexcept {
307}
308
309template <typename Ptr, typename... None, enable_if_t<!has_base<Ptr>::value, int> = 0>
310constexpr decltype(auto) __to_address(const Ptr& ptr, None...) noexcept {
311 return __to_address(ptr.operator->());
312}
313
314template <typename Ptr, typename... None, enable_if_t<has_base<Ptr>::value, int> = 0>
315constexpr decltype(auto) __to_address(const Ptr& ptr, None...) noexcept {
316 return __to_address(ptr.base().operator->());
317}
318
321
322
329template <typename T>
330constexpr T* to_address(T* ptr) noexcept {
331 return _INNER __to_address(ptr);
332}
333
340template <typename Ptr>
341constexpr decltype(auto) to_address(const Ptr& ptr) noexcept {
342 return _INNER __to_address(ptr);
343}
344 // PointerTraits
346
352
361template <typename T, typename Dummy = void>
363 using type = typename T::value_type*;
364};
365
367template <typename T>
368struct get_pointer_type<T, void_t<typename T::pointer>> {
369 using type = typename T::pointer;
370};
372
373
380template <typename T, typename Dummy = void>
382 using pointer = typename get_pointer_type<T>::type;
383 using type = typename pointer_traits<pointer>::difference_type;
384};
385
387template <typename T>
388struct get_difference_type<T, void_t<typename T::difference_type>> {
389 using type = typename T::difference_type;
390};
392
393
400template <typename T, typename Dummy = void>
404
406template <typename T>
407struct get_size_type<T, void_t<typename T::size_type>> {
408 using type = typename T::size_type;
409};
411 // AllocatorTraitsExtractors
413
415#endif // MSTL_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
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命名空间
int64_t ptrdiff_t
指针差类型
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的便捷别名
void void_t
将任意类型映射为void
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
连续迭代器标签
获取分配器的差值类型
获取分配器的指针类型
获取分配器的大小类型
contiguous_iterator_tag iterator_category
迭代器类别
ptrdiff_t difference_type
差值类型
remove_cv_t< T > value_type
值类型
迭代器特性主模板
U * rebind
重新绑定到其他元素类型的模板
ptrdiff_t difference_type
差值类型
static MSTL_NODISCARD constexpr pointer pointer_to(reference x) noexcept
从引用创建指针
conditional_t< is_void< T >::value, char, T > & reference
引用类型
指针特性主模板
MSTL类型萃取