NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
iterator_traits.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
2#define NEFORCE_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
3
14
16NEFORCE_BEGIN_NAMESPACE__
17
23
25NEFORCE_BEGIN_INNER__
26
27template <typename, typename = void>
28struct iterator_traits_base {};
29
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;
39};
40
41NEFORCE_END_INNER__
43
44
55template <typename Iterator>
56struct iterator_traits : inner::iterator_traits_base<Iterator> {};
57
67template <typename T>
68struct iterator_traits<T*> {
69 static_assert(is_object<T>::value, "iterator traits requires object types.");
70
74 using pointer = T*;
75 using reference = T&;
76};
77
83template <typename Iterator>
85
91template <typename Iterator>
93
99template <typename Iterator>
101
107template <typename Iterator>
109
115template <typename Iterator>
117
118
127template <typename Iterator>
128#ifdef NEFORCE_STANDARD_20
130#endif
132
140template <typename Iterator>
141#ifdef NEFORCE_STANDARD_20
143#endif
145 // IteratorTraits
147
153
155NEFORCE_BEGIN_INNER__
156
157template <typename Ptr, enable_if_t<is_pointer<Ptr>::value, int> = 0>
158static constexpr decltype(auto) __to_address(const Ptr& ptr) noexcept {
159 static_assert(!is_function<Ptr>::value, "should not be a function pointer");
160 return ptr;
161}
162
163template <typename Ptr, enable_if_t<!is_pointer<Ptr>::value && !has_base<Ptr>::value, int> = 0>
164static constexpr decltype(auto) __to_address(const Ptr& ptr) noexcept {
165 return inner::__to_address(ptr.operator->());
166}
167
168template <typename Ptr, enable_if_t<!is_pointer<Ptr>::value && has_base<Ptr>::value, int> = 0>
169static constexpr decltype(auto) __to_address(const Ptr& ptr) noexcept {
170 return ptr.base();
171}
172
173
188template <typename Ptr, typename Elem>
189struct pointer_traits_base {
190 using pointer = Ptr;
191 using element_type = Elem;
192 using difference_type = get_ptr_difference_t<Ptr>;
193 using reference = conditional_t<is_void<Elem>::value, char, Elem>&;
194
199 template <typename U>
200 using rebind = typename get_rebind_type<Ptr, U>::type;
201
207 NEFORCE_NODISCARD static constexpr pointer pointer_to(reference x) noexcept(noexcept(Ptr::pointer_to(x))) {
208 return Ptr::pointer_to(x);
209 }
210
216 NEFORCE_NODISCARD static constexpr decltype(auto) to_address(const Ptr& ptr) noexcept {
217 return inner::__to_address(ptr);
218 }
219};
220
221template <typename, typename = void, typename = void>
222struct pointer_traits_extract {};
223
224template <typename T, typename U>
225struct pointer_traits_extract<T, U, void_t<get_first_temp_para_t<T>>>
226: pointer_traits_base<T, typename get_first_temp_para<T>::type> {};
227
228template <typename T>
229struct pointer_traits_extract<T, void_t<typename T::element_type>, void>
230: pointer_traits_base<T, typename T::element_type> {};
231
232NEFORCE_END_INNER__
234
235
247template <typename T>
248struct pointer_traits : inner::pointer_traits_extract<T> {
254 NEFORCE_NODISCARD static constexpr decltype(auto) to_address(const T& ptr) noexcept {
255 return inner::__to_address(ptr);
256 }
257};
258
259
264template <typename T>
265struct pointer_traits<T*> {
266 using pointer = T*;
267 using element_type = T;
270
275 template <typename U>
276 using rebind = U*;
277
283 NEFORCE_NODISCARD static constexpr pointer pointer_to(reference ref) noexcept { return _NEFORCE addressof(ref); }
284
285 NEFORCE_NODISCARD static constexpr pointer to_address(pointer ptr) noexcept {
286 static_assert(!is_function<T>::value, "should not be a function pointer");
287 return ptr;
288 }
289};
290
299template <typename Ptr, typename T>
301
308template <typename Ptr>
309constexpr decltype(auto) ptr_const_cast(Ptr ptr) noexcept {
310 using T = typename pointer_traits<Ptr>::element_type;
311 using NonConst = remove_const_t<T>;
312 using Dest = typename pointer_traits<Ptr>::template rebind<NonConst>;
313
314 return pointer_traits<Dest>::pointer_to(const_cast<NonConst&>(*ptr));
315}
316
323template <typename T>
324constexpr decltype(auto) ptr_const_cast(T* ptr) noexcept {
325 return const_cast<remove_const_t<T>*>(ptr);
326}
327
334template <typename Ptr>
335constexpr decltype(auto) to_address(const Ptr& ptr) noexcept {
337}
338 // PointerTraits
340
346
355template <typename T, typename Dummy = void>
357 using type = typename T::value_type*;
358};
359
361template <typename T>
362struct get_pointer_type<T, void_t<typename T::pointer>> {
363 using type = typename T::pointer;
364};
366
367
374template <typename T, typename Dummy = void>
376 using pointer = typename get_pointer_type<T>::type;
377 using type = typename pointer_traits<pointer>::difference_type;
378};
379
381template <typename T>
382struct get_difference_type<T, void_t<typename T::difference_type>> {
383 using type = typename T::difference_type;
384};
386
387
394template <typename T, typename Dummy = void>
398
400template <typename T>
401struct get_size_type<T, void_t<typename T::size_type>> {
402 using type = typename T::size_type;
403};
405 // AllocatorTraitsExtractors
407
408NEFORCE_END_NAMESPACE__
409#endif // NEFORCE_CORE_ITERATOR_ITERATOR_TRAITS_HPP__
检查类型是否具有类似pair的结构
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
获取迭代器的指针类型
int64_t ptrdiff_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的便捷别名
void void_t
将任意类型映射为void
连续迭代器标签
获取分配器的差值类型
获取分配器的指针类型
获取分配器的大小类型
contiguous_iterator_tag iterator_category
迭代器类别
ptrdiff_t difference_type
差值类型
remove_cv_t< T > value_type
值类型
迭代器特性主模板
U * rebind
重新绑定到其他元素类型的模板
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
获取指针指向的原始地址
类型萃取