@@ -245,23 +245,53 @@ namespace xt
245245
246246 namespace detail
247247 {
248- template <class C >
249- struct linear_iterator_traits
248+ template <class T , bool is_const>
249+ struct get_storage_iterator ;
250+
251+ template <class T >
252+ struct get_storage_iterator <T, true >
250253 {
251- using iterator = typename C::iterator ;
252- using const_iterator = typename C ::const_iterator;
253- using reverse_iterator = typename C::reverse_iterator ;
254- using const_reverse_iterator = typename C ::const_reverse_iterator;
254+ using iterator = typename T::const_iterator ;
255+ using const_iterator = typename T ::const_iterator;
256+ using reverse_iterator = typename T::const_reverse_iterator ;
257+ using const_reverse_iterator = typename T ::const_reverse_iterator;
255258 };
256259
257- template <class C >
258- struct linear_iterator_traits <const C>
260+ template <class T >
261+ struct get_storage_iterator <T, false >
262+ {
263+ using iterator = typename T::iterator;
264+ using const_iterator = typename T::const_iterator;
265+ using reverse_iterator = typename T::reverse_iterator;
266+ using const_reverse_iterator = typename T::const_reverse_iterator;
267+ };
268+
269+ template <class D , bool has_storage_type>
270+ struct linear_iterator_traits_impl ;
271+
272+ template <class D >
273+ struct linear_iterator_traits_impl <D, true >
259274 {
260- using iterator = typename C::const_iterator;
261- using const_iterator = iterator;
262- using reverse_iterator = typename C::const_reverse_iterator;
263- using const_reverse_iterator = reverse_iterator;
275+ using inner_types = xcontainer_inner_types<D>;
276+ using storage_type = typename inner_types::storage_type;
277+ using iterator_type = get_storage_iterator<storage_type, std::is_const<storage_type>::value>;
278+ using linear_iterator = typename iterator_type::iterator;
279+ using const_linear_iterator = typename iterator_type::const_iterator;
280+ using reverse_linear_iterator = typename iterator_type::reverse_iterator;
281+ using const_reverse_linear_iterator = typename iterator_type::const_reverse_iterator;
264282 };
283+
284+ template <class D >
285+ struct linear_iterator_traits_impl <D, false >
286+ {
287+ using linear_iterator = typename D::linear_iterator;
288+ using const_linear_iterator = typename D::const_linear_iterator;
289+ using reverse_linear_iterator = typename D::reverse_linear_iterator;
290+ using const_reverse_linear_iterator = typename D::const_reverse_linear_iterator;
291+ };
292+
293+ template <class D >
294+ using linear_iterator_traits = linear_iterator_traits_impl<D, has_storage_type<D>::value>;
265295 }
266296
267297 /* *
@@ -283,7 +313,6 @@ namespace xt
283313 using derived_type = D;
284314
285315 using inner_types = xcontainer_inner_types<D>;
286- using storage_type = typename inner_types::storage_type;
287316
288317 using iterable_base = xiterable<D>;
289318 using stepper = typename iterable_base::stepper;
@@ -321,11 +350,11 @@ namespace xt
321350 template <class S , layout_type L>
322351 using const_reverse_broadcast_iterator = typename iterable_base::template const_reverse_broadcast_iterator<S, L>;
323352
324- using storage_traits = detail::linear_iterator_traits<storage_type >;
325- using linear_iterator = typename storage_traits::iterator ;
326- using const_linear_iterator = typename storage_traits::const_iterator ;
327- using reverse_linear_iterator = typename storage_traits::reverse_iterator ;
328- using const_reverse_linear_iterator = typename storage_traits::const_reverse_iterator ;
353+ using linear_traits = detail::linear_iterator_traits<D >;
354+ using linear_iterator = typename linear_traits::linear_iterator ;
355+ using const_linear_iterator = typename linear_traits::const_linear_iterator ;
356+ using reverse_linear_iterator = typename linear_traits::reverse_linear_iterator ;
357+ using const_reverse_linear_iterator = typename linear_traits::const_reverse_linear_iterator ;
329358
330359 template <layout_type L, class It1 , class It2 >
331360 using select_iterator_impl = std::conditional_t <L == static_layout, It1, It2>;
0 commit comments