2020namespace xt
2121{
2222
23+ template <class E >
24+ struct is_chunked_t : detail::chunk_helper<E>::is_chunked
25+ {
26+ };
27+
2328 /* ****************
2429 * xchunked_view *
2530 *****************/
@@ -49,10 +54,15 @@ namespace xt
4954 xchunked_view (OE&& e, S&& chunk_shape);
5055
5156 template <class OE >
52- typename std::enable_if<!is_chunked<OE>(), xchunked_view<E>&>::type operator =(const OE& e);
57+ xchunked_view (OE&& e);
58+
59+ void init ();
60+
61+ template <class OE >
62+ typename std::enable_if_t <!is_chunked_t <OE>::value, xchunked_view<E>&> operator =(const OE& e);
5363
5464 template <class OE >
55- typename std::enable_if<is_chunked <OE>() , xchunked_view<E>&>::type operator =(const OE& e);
65+ typename std::enable_if_t < is_chunked_t <OE>::value , xchunked_view<E>&> operator =(const OE& e);
5666
5767 size_type dimension () const noexcept ;
5868 const shape_type& shape () const noexcept ;
@@ -96,6 +106,22 @@ namespace xt
96106 m_shape.resize (e.dimension ());
97107 const auto & s = e.shape ();
98108 std::copy (s.cbegin (), s.cend (), m_shape.begin ());
109+ init ();
110+ }
111+
112+ template <class E >
113+ template <class OE >
114+ inline xchunked_view<E>::xchunked_view(OE&& e)
115+ : m_expression(std::forward<OE>(e))
116+ {
117+ m_shape.resize (e.dimension ());
118+ const auto & s = e.shape ();
119+ std::copy (s.cbegin (), s.cend (), m_shape.begin ());
120+ }
121+
122+ template <class E >
123+ void xchunked_view<E>::init()
124+ {
99125 // compute chunk number in each dimension
100126 m_grid_shape.resize (m_shape.size ());
101127 std::transform
@@ -118,7 +144,7 @@ namespace xt
118144
119145 template <class E >
120146 template <class OE >
121- typename std::enable_if<!is_chunked <OE>() , xchunked_view<E>&>::type xchunked_view<E>::operator =(const OE& e)
147+ typename std::enable_if_t <! is_chunked_t <OE>::value , xchunked_view<E>&> xchunked_view<E>::operator =(const OE& e)
122148 {
123149 auto end = chunk_end ();
124150 for (auto it = chunk_begin (); it != end; ++it)
@@ -131,8 +157,12 @@ namespace xt
131157
132158 template <class E >
133159 template <class OE >
134- typename std::enable_if<is_chunked <OE>() , xchunked_view<E>&>::type xchunked_view<E>::operator =(const OE& e)
160+ typename std::enable_if_t < is_chunked_t <OE>::value , xchunked_view<E>&> xchunked_view<E>::operator =(const OE& e)
135161 {
162+ m_chunk_shape.resize (e.dimension ());
163+ const auto & cs = e.chunk_shape ();
164+ std::copy (cs.cbegin (), cs.cend (), m_chunk_shape.begin ());
165+ init ();
136166 auto it2 = e.chunks ().begin ();
137167 auto end1 = chunk_end ();
138168 for (auto it1 = chunk_begin (); it1 != end1; ++it1, ++it2)
@@ -240,6 +270,12 @@ namespace xt
240270 {
241271 return xchunked_view<E>(std::forward<E>(e), std::forward<S>(chunk_shape));
242272 }
273+
274+ template <class E >
275+ inline xchunked_view<E> as_chunked (E&& e)
276+ {
277+ return xchunked_view<E>(std::forward<E>(e));
278+ }
243279}
244280
245281#endif
0 commit comments