Skip to content

Commit 4ef3cef

Browse files
committed
remove storage_type from xcontiguous_iterable
1 parent d557845 commit 4ef3cef

File tree

3 files changed

+72
-18
lines changed

3 files changed

+72
-18
lines changed

include/xtensor/xiterable.hpp

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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>;

include/xtensor/xutils.hpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,21 @@ namespace xt
574574
{
575575
return N;
576576
}
577+
/***********************************
578+
* has_storage_type implementation *
579+
***********************************/
580+
581+
template <class T, class = void>
582+
struct has_storage_type : std::false_type
583+
{};
584+
585+
template<class T>
586+
struct xcontainer_inner_types;
587+
588+
template <class T>
589+
struct has_storage_type<T, void_t<typename xcontainer_inner_types<T>::storage_type>>
590+
: std::true_type
591+
{};
577592

578593
/*************************************
579594
* has_data_interface implementation *

test/test_xutils.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,16 @@ namespace xt
132132
EXPECT_FALSE(b);
133133
}
134134

135+
TEST(utils, has_storage_type)
136+
{
137+
bool b = has_storage_type<xarray<int>>::value;
138+
EXPECT_TRUE(b);
139+
140+
xarray<int> x, y;
141+
b = has_storage_type<decltype(x + y)>::value;
142+
EXPECT_FALSE(b);
143+
}
144+
135145
TEST(utils, has_strides)
136146
{
137147
bool b = has_strides<xarray<int>>::value;

0 commit comments

Comments
 (0)