Skip to content

Commit 2b9c2b0

Browse files
committed
Added const chunk iterators
1 parent 3abb74c commit 2b9c2b0

3 files changed

Lines changed: 104 additions & 14 deletions

File tree

include/xtensor/xchunked_array.hpp

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ namespace xt
7575
using bool_load_type = xt::bool_load_type<value_type>;
7676
static constexpr layout_type static_layout = layout_type::dynamic;
7777
static constexpr bool contiguous_layout = false;
78-
using chunk_iterator_type = xchunk_iterator<self_type>;
78+
using chunk_iterator = xchunk_iterator<self_type>;
79+
using const_chunk_iterator = xchunk_iterator<const self_type>;
7980

8081
template <class S>
8182
xchunked_array(chunk_storage_type&& chunks, S&& shape, S&& chunk_shape, layout_type chunk_memory_layout = XTENSOR_DEFAULT_LAYOUT);
@@ -136,8 +137,13 @@ namespace xt
136137
chunk_storage_type& chunks();
137138
const chunk_storage_type& chunks() const;
138139

139-
chunk_iterator_type chunk_begin();
140-
chunk_iterator_type chunk_end();
140+
chunk_iterator chunk_begin();
141+
chunk_iterator chunk_end();
142+
143+
const_chunk_iterator chunk_begin() const;
144+
const_chunk_iterator chunk_end() const;
145+
const_chunk_iterator chunk_cbegin() const;
146+
const_chunk_iterator chunk_cend() const;
141147

142148
private:
143149

@@ -489,17 +495,44 @@ namespace xt
489495
}
490496

491497
template <class CS>
492-
inline auto xchunked_array<CS>::chunk_begin() -> chunk_iterator_type
498+
inline auto xchunked_array<CS>::chunk_begin() -> chunk_iterator
499+
{
500+
shape_type chunk_index(m_shape.size(), size_type(0));
501+
return chunk_iterator(*this, std::move(chunk_index), 0u);
502+
}
503+
504+
template <class CS>
505+
inline auto xchunked_array<CS>::chunk_end() -> chunk_iterator
506+
{
507+
shape_type sh = xtl::forward_sequence<shape_type, const grid_shape_type>(grid_shape());
508+
return chunk_iterator(*this, std::move(sh), grid_size());
509+
}
510+
511+
template <class CS>
512+
inline auto xchunked_array<CS>::chunk_begin() const -> const_chunk_iterator
493513
{
494514
shape_type chunk_index(m_shape.size(), size_type(0));
495-
return chunk_iterator_type(*this, std::move(chunk_index), 0u);
515+
return const_chunk_iterator(*this, std::move(chunk_index), 0u);
496516
}
497517

498518
template <class CS>
499-
inline auto xchunked_array<CS>::chunk_end() -> chunk_iterator_type
519+
inline auto xchunked_array<CS>::chunk_end() const -> const_chunk_iterator
500520
{
501521
shape_type sh = xtl::forward_sequence<shape_type, const grid_shape_type>(grid_shape());
502-
return chunk_iterator_type(*this, std::move(sh), grid_size());
522+
return const_chunk_iterator(*this, std::move(sh), grid_size());
523+
}
524+
525+
template <class CS>
526+
inline auto xchunked_array<CS>::chunk_cbegin() const -> const_chunk_iterator
527+
{
528+
return chunk_begin();
529+
}
530+
531+
template <class CS>
532+
inline auto xchunked_array<CS>::chunk_cend() const -> const_chunk_iterator
533+
{
534+
return chunk_end();
535+
503536
}
504537

505538
template <class CS>

include/xtensor/xchunked_view.hpp

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ namespace xt
3535
using expression_type = std::decay_t<E>;
3636
using size_type = size_t;
3737
using shape_type = svector<size_type>;
38-
using chunk_iterator_type = xchunk_iterator<self_type>;
38+
using chunk_iterator = xchunk_iterator<self_type>;
39+
using const_chunk_iterator = xchunk_iterator<const self_type>;
3940

4041
template <class OE, class S>
4142
xchunked_view(OE&& e, S&& chunk_shape);
@@ -52,8 +53,13 @@ namespace xt
5253
expression_type& expression() noexcept;
5354
const expression_type& expression() const noexcept;
5455

55-
chunk_iterator_type chunk_begin();
56-
chunk_iterator_type chunk_end();
56+
chunk_iterator chunk_begin();
57+
chunk_iterator chunk_end();
58+
59+
const_chunk_iterator chunk_begin() const;
60+
const_chunk_iterator chunk_end() const;
61+
const_chunk_iterator chunk_cbegin() const;
62+
const_chunk_iterator chunk_cend() const;
5763

5864
private:
5965

@@ -155,16 +161,41 @@ namespace xt
155161
}
156162

157163
template <class E>
158-
inline auto xchunked_view<E>::chunk_begin() -> chunk_iterator_type
164+
inline auto xchunked_view<E>::chunk_begin() -> chunk_iterator
165+
{
166+
shape_type chunk_index(m_shape.size(), size_type(0));
167+
return chunk_iterator(*this, std::move(chunk_index), 0u);
168+
}
169+
170+
template <class E>
171+
inline auto xchunked_view<E>::chunk_end() -> chunk_iterator
172+
{
173+
return chunk_iterator(*this, shape_type(grid_shape()), grid_size());
174+
}
175+
176+
template <class E>
177+
inline auto xchunked_view<E>::chunk_begin() const -> const_chunk_iterator
159178
{
160179
shape_type chunk_index(m_shape.size(), size_type(0));
161-
return chunk_iterator_type(*this, std::move(chunk_index), 0u);
180+
return const_chunk_iterator(*this, std::move(chunk_index), 0u);
181+
}
182+
183+
template <class E>
184+
inline auto xchunked_view<E>::chunk_end() const -> const_chunk_iterator
185+
{
186+
return const_chunk_iterator(*this, shape_type(grid_shape()), grid_size());
187+
}
188+
189+
template <class E>
190+
inline auto xchunked_view<E>::chunk_cbegin() const -> const_chunk_iterator
191+
{
192+
return chunk_begin();
162193
}
163194

164195
template <class E>
165-
inline auto xchunked_view<E>::chunk_end() -> chunk_iterator_type
196+
inline auto xchunked_view<E>::chunk_cend() const -> const_chunk_iterator
166197
{
167-
return chunk_iterator_type(*this, shape_type(grid_shape()), grid_size());
198+
return chunk_end();
168199
}
169200

170201
template <class E, class S>

test/test_xchunked_array.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,30 @@ namespace xt
123123

124124
EXPECT_EQ(a, b);
125125
}
126+
127+
TEST(xchunked_array, chunk_iterator)
128+
{
129+
std::vector<std::size_t> shape = {10, 10, 10};
130+
std::vector<std::size_t> chunk_shape = {2, 2, 2};
131+
auto a = chunked_array<double>(shape, chunk_shape);
132+
xt::xarray<double> b = arange(1000).reshape({10, 10, 10});
133+
noalias(a) = b;
134+
135+
auto it = a.chunk_begin();
136+
auto cit = a.chunk_cbegin();
137+
138+
for (size_t i = 0; i < 5; ++i)
139+
{
140+
for (size_t j = 0; j < 5; ++j)
141+
{
142+
for (size_t k = 0; k < 5; ++k)
143+
{
144+
EXPECT_EQ(*((*it).begin()), a(2*i, 2*j, 2*k));
145+
EXPECT_EQ(*((*cit).cbegin()), a(2*i, 2*j, 2*k));
146+
++it;
147+
++cit;
148+
}
149+
}
150+
}
151+
}
126152
}

0 commit comments

Comments
 (0)