Skip to content

Commit 9936e0e

Browse files
committed
Overload as_view(e) for chunked RHS
1 parent 915236e commit 9936e0e

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

include/xtensor/xchunked_view.hpp

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
namespace 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

Comments
 (0)