1 /* ///////////////////////////////////////////////////////////////////////
2 * File: iterator_traits.h
7 * Brief: Iterator traits
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
20 # error iterator_traits.h need be supported by c++.
23 /* ///////////////////////////////////////////////////////////////////////
27 #include "iterator_category.h"
29 #ifdef EXTL_TYPE_TRAITS_IS_PTR_SUPPORT
30 # include "../type/traits/is_ptr.h"
33 #ifdef EXTL_TYPE_TRAITS_IS_CONST_SUPPORT
34 # include "../type/traits/is_const.h"
37 #ifdef EXTL_TYPE_TRAITS_IS_REF_SUPPORT
38 # include "../type/traits/is_ref.h"
41 #ifdef EXTL_TYPE_TRAITS_REMOVE_PTR_SUPPORT
42 # include "../type/traits/remove_ptr.h"
45 #ifdef EXTL_TYPE_TRAITS_REMOVE_CV_SUPPORT
46 # include "../type/traits/remove_cv.h"
49 #ifdef EXTL_TYPE_TRAITS_REMOVE_REF_SUPPORT
50 # include "../type/traits/remove_ref.h"
53 #ifdef EXTL_TYPE_TRAITS_ADD_REF_SUPPORT
54 # include "../type/traits/add_ref.h"
57 #ifdef EXTL_TYPE_TRAITS_ADD_CONST_SUPPORT
58 # include "../type/traits/add_const.h"
61 #ifdef EXTL_TYPE_TRAITS_IS_CONVERTIBLE_SUPPORT
62 # include "../type/traits/is_convertible.h"
65 #ifdef EXTL_MPL_IF_SUPPORT
66 # include "../mpl/if_.h"
69 /* ///////////////////////////////////////////////////////////////////////
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)
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)
89 /* ///////////////////////////////////////////////////////////////////////
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
>
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
)
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
)
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
>
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
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
)
149 , typename_type_k add_ref
<reduced_ptr_type
>::type
153 /* T const vloatile* ==> T const vloatile*, T* ==> T const* */
154 typedef typename_type_k
EXTL_NS_MPL(if_
)< (is_const
< pointer
>::value
)
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
)
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
190 typedef EXTL_NS_DETAIL(xtl_iterator_traits_impl
)<It
> iterator_traits_impl_
;
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
;
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
));
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
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
;
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
));
254 #endif /* EXTL_ITERATOR_RAW_POINTER_ITERATOR_TRAITS_SUPPORT */
256 /* ///////////////////////////////////////////////////////////////////////
261 /* //////////////////////////////////////////////////////////////////// */
262 #endif /* EXTL_ITERATOR_ITERATOR_TRAITS_H */
263 /* //////////////////////////////////////////////////////////////////// */