remove \r
[extl.git] / extl / iterator / iterator_traits.h
blob5fada1914d8606a9b813d5f6e2f46a9c3c7f3e72
1 /* ///////////////////////////////////////////////////////////////////////
2 * File: iterator_traits.h
4 * Created: 08.04.04
5 * Updated: 08.04.15
7 * Brief: Iterator traits
9 * [<Home>]
10 * Copyright (c) 2008-2020, Waruqi All rights reserved.
11 * //////////////////////////////////////////////////////////////////// */
13 #ifndef EXTL_ITERATOR_ITERATOR_TRAITS_H
14 #define EXTL_ITERATOR_ITERATOR_TRAITS_H
16 /*!\file iterator_traits.h
17 * \brief iterator_traits class
19 #ifndef __cplusplus
20 # error iterator_traits.h need be supported by c++.
21 #endif
23 /* ///////////////////////////////////////////////////////////////////////
24 * Includes
26 #include "prefix.h"
27 #include "iterator_category.h"
29 #ifdef EXTL_TYPE_TRAITS_IS_PTR_SUPPORT
30 # include "../type/traits/is_ptr.h"
31 #endif
33 #ifdef EXTL_TYPE_TRAITS_IS_CONST_SUPPORT
34 # include "../type/traits/is_const.h"
35 #endif
37 #ifdef EXTL_TYPE_TRAITS_IS_REF_SUPPORT
38 # include "../type/traits/is_ref.h"
39 #endif
41 #ifdef EXTL_TYPE_TRAITS_REMOVE_PTR_SUPPORT
42 # include "../type/traits/remove_ptr.h"
43 #endif
45 #ifdef EXTL_TYPE_TRAITS_REMOVE_CV_SUPPORT
46 # include "../type/traits/remove_cv.h"
47 #endif
49 #ifdef EXTL_TYPE_TRAITS_REMOVE_REF_SUPPORT
50 # include "../type/traits/remove_ref.h"
51 #endif
53 #ifdef EXTL_TYPE_TRAITS_ADD_REF_SUPPORT
54 # include "../type/traits/add_ref.h"
55 #endif
57 #ifdef EXTL_TYPE_TRAITS_ADD_CONST_SUPPORT
58 # include "../type/traits/add_const.h"
59 #endif
61 #ifdef EXTL_TYPE_TRAITS_IS_CONVERTIBLE_SUPPORT
62 # include "../type/traits/is_convertible.h"
63 #endif
65 #ifdef EXTL_MPL_IF_SUPPORT
66 # include "../mpl/if_.h"
67 #endif
69 /* ///////////////////////////////////////////////////////////////////////
70 * Micros
72 #ifdef EXTL_TYPE_TRAITS_IS_CONVERTIBLE_SUPPORT
74 #define EXTL_ITERATOR_MUST_BE_INPUT(it) EXTL_STATIC_ASSERT(EXTL_NS(xtl_iterator_traits)<it>::is_input_iterator)
75 #define EXTL_ITERATOR_MUST_BE_OUTPUT(it) //EXTL_STATIC_ASSERT(EXTL_NS(xtl_iterator_traits)<it>::is_output_iterator)
76 #define EXTL_ITERATOR_MUST_BE_FORWARD(it) EXTL_STATIC_ASSERT(EXTL_NS(xtl_iterator_traits)<it>::is_forward_iterator)
77 #define EXTL_ITERATOR_MUST_BE_BIDIRECTIONAL(it) EXTL_STATIC_ASSERT(EXTL_NS(xtl_iterator_traits)<it>::is_bidirectional_iterator)
78 #define EXTL_ITERATOR_MUST_BE_RANDOM_ACCESS(it) EXTL_STATIC_ASSERT(EXTL_NS(xtl_iterator_traits)<it>::is_random_access_iterator)
80 #else
82 #define EXTL_ITERATOR_MUST_BE_INPUT(it)
83 #define EXTL_ITERATOR_MUST_BE_OUTPUT(it)
84 #define EXTL_ITERATOR_MUST_BE_FORWARD(it)
85 #define EXTL_ITERATOR_MUST_BE_BIDIRECTIONAL(it)
86 #define EXTL_ITERATOR_MUST_BE_RANDOM_ACCESS(it)
88 #endif
89 /* ///////////////////////////////////////////////////////////////////////
90 * ::extl namespace
92 EXTL_BEGIN_NAMESPACE
94 #ifdef EXTL_ITERATOR_RAW_POINTER_ITERATOR_TRAITS_SUPPORT
96 /* ///////////////////////////////////////////////////////////////////////
97 * ::extl::detail namespace
99 EXTL_DETAIL_BEGIN_NAMESPACE
100 /* xtl_iterator_traits_selector */
101 template<e_bool_t is_pointer>
102 struct xtl_iterator_traits_selector
104 template<typename_param_k It>
105 struct result
107 typedef It iterator_type;
108 typedef typename_type_k iterator_type::iterator_category iterator_category;
109 typedef typename_type_k iterator_type::value_type value_type;
110 typedef typename_type_k iterator_type::difference_type difference_type;
111 typedef typename_type_k iterator_type::pointer pointer;
112 typedef typename_type_k iterator_type::reference reference;
114 typedef typename_type_k EXTL_NS_MPL(if_)< (is_const<pointer>::value)
115 , pointer
116 , typename_type_k add_const<pointer>::type
117 >::type const_pointer;
119 typedef typename_type_k EXTL_NS_MPL(if_)< (is_const<reference>::value)
120 , reference
121 , typename_type_k add_const<reference>::type
122 >::type const_reference;
126 /* raw pointer traits */
127 EXTL_TEMPLATE_SPECIALISATION
128 struct xtl_iterator_traits_selector<e_true_v>
130 template<typename_param_k It>
131 struct result
133 typedef It iterator_type;
134 typedef std_random_access_iterator_tag iterator_category;
135 typedef iterator_type pointer;
137 /* T const vloatile* ==> T const vloatile */
138 typedef typename_type_k remove_ptr<pointer>::type reduced_ptr_type;
140 /* T const vloatile* ==> T */
141 typedef typename_type_k remove_ref < typename_type_k remove_cv< reduced_ptr_type >::type
142 >::type value_type;
144 typedef e_ptrdiff_t difference_type;
146 /* T const vloatile* ==> T const vloatile&, T* ==> T& */
147 typedef typename_type_k EXTL_NS_MPL(if_)< (is_ref< reduced_ptr_type >::value)
148 , reduced_ptr_type
149 , typename_type_k add_ref<reduced_ptr_type>::type
150 >::type reference;
153 /* T const vloatile* ==> T const vloatile*, T* ==> T const* */
154 typedef typename_type_k EXTL_NS_MPL(if_)< (is_const< pointer >::value)
155 , pointer
156 , typename_type_k add_const<pointer>::type
157 >::type const_pointer;
159 /* T const vloatile* ==> T const vloatile&, T* ==> T const& */
160 typedef typename_type_k EXTL_NS_MPL(if_)< (is_const< reference >::value)
161 , reference
162 , typename_type_k add_const<reference>::type
163 >::type const_reference;
167 template<typename_param_k It>
168 struct xtl_iterator_traits_impl
169 : public xtl_iterator_traits_selector< (is_ptr<It>::value) >::template_qual_k result<It>
173 /* ///////////////////////////////////////////////////////////////////////
174 * namespace extl::detail
176 EXTL_DETAIL_END_NAMESPACE
178 /*!\brief xtl_iterator_traits
180 * \param It The iterator type
182 * \ingroup extl_group_iterator
184 template<typename_param_k It>
185 struct xtl_iterator_traits
187 /// \name Types
188 /// @{
189 private:
190 typedef EXTL_NS_DETAIL(xtl_iterator_traits_impl)<It> iterator_traits_impl_;
191 public:
192 typedef It iterator_type;
193 typedef typename_type_k iterator_traits_impl_::iterator_category iterator_category;
194 typedef typename_type_k iterator_traits_impl_::value_type value_type;
195 typedef typename_type_k iterator_traits_impl_::difference_type difference_type;
196 typedef typename_type_k iterator_traits_impl_::pointer pointer;
197 typedef typename_type_k iterator_traits_impl_::reference reference;
199 typedef typename_type_k iterator_traits_impl_::const_pointer const_pointer;
200 typedef typename_type_k iterator_traits_impl_::const_reference const_reference;
201 /// @}
203 /// \name Traits
204 /// @{
205 public:
206 // note: std_output_iterator_tag is not a base class of all iterators
207 #ifdef EXTL_TYPE_TRAITS_IS_CONVERTIBLE_SUPPORT
208 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_input_iterator = (is_convertible<iterator_category, std_input_iterator_tag>::value));
209 //EXTL_STATIC_MEMBER_CONST(e_bool_t, is_output_iterator = (is_convertible<iterator_category, std_output_iterator_tag>::value));
210 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_forward_iterator = (is_convertible<iterator_category, std_forward_iterator_tag>::value));
211 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_bidirectional_iterator = (is_convertible<iterator_category, std_bidirectional_iterator_tag>::value));
212 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_random_access_iterator = (is_convertible<iterator_category, std_random_access_iterator_tag>::value));
213 #endif
214 /// @}
216 #else
218 /*!\brief xtl_iterator_traits
220 * \param It The interator type
222 * \ingroup extl_group_iterator
224 template<typename_param_k It>
225 struct xtl_iterator_traits
227 /// \name Types
228 /// @{
229 public:
230 typedef It iterator_type;
231 typedef typename_type_k iterator_type::iterator_category iterator_category;
232 typedef typename_type_k iterator_type::value_type value_type;
233 typedef typename_type_k iterator_type::difference_type difference_type;
234 typedef typename_type_k iterator_type::pointer pointer;
235 typedef typename_type_k iterator_type::reference reference;
237 typedef pointer const_pointer;
238 typedef reference const_reference;
239 /// @}
241 /// \name Traits
242 /// @{
243 public:
244 #ifdef EXTL_TYPE_TRAITS_IS_CONVERTIBLE_SUPPORT
245 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_input_iterator = (is_convertible<iterator_category, std_input_iterator_tag>::value));
246 //EXTL_STATIC_MEMBER_CONST(e_bool_t, is_output_iterator = (is_convertible<iterator_category, std_output_iterator_tag>::value));
247 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_forward_iterator = (is_convertible<iterator_category, std_forward_iterator_tag>::value));
248 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_bidirectional_iterator = (is_convertible<iterator_category, std_bidirectional_iterator_tag>::value));
249 EXTL_STATIC_MEMBER_CONST(e_bool_t, is_random_access_iterator = (is_convertible<iterator_category, std_random_access_iterator_tag>::value));
250 #endif
251 /// @}
254 #endif /* EXTL_ITERATOR_RAW_POINTER_ITERATOR_TRAITS_SUPPORT */
256 /* ///////////////////////////////////////////////////////////////////////
257 * ::extl namespace
259 EXTL_END_NAMESPACE
261 /* //////////////////////////////////////////////////////////////////// */
262 #endif /* EXTL_ITERATOR_ITERATOR_TRAITS_H */
263 /* //////////////////////////////////////////////////////////////////// */