Skip to content

Commit 0e4c4ce

Browse files
committed
add const iteration for concatenation
1 parent 6f8d0f4 commit 0e4c4ce

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

source/mir/ndslice/concatenation.d

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,17 +133,26 @@ version(mir_ndslice_test) unittest
133133
// 4 5 6
134134
auto matrix = iota([2, 3], 1);
135135

136-
assert(concatenation(vector, matrix).slice == [
136+
auto c0 = concatenation(vector, matrix);
137+
138+
assert(c0.slice == [
137139
[0, 0, 0],
138140
[1, 2, 3],
139141
[4, 5, 6],
140142
]);
141143

142144
vector.popFront;
143-
assert(concatenation!1(vector, matrix).slice == [
145+
auto c1 = concatenation!1(vector, matrix);
146+
assert(c1.slice == [
144147
[0, 1, 2, 3],
145148
[0, 4, 5, 6],
146149
]);
150+
151+
auto opIndexCompiles0 = c0[];
152+
auto opIndexCompiles1 = c1[];
153+
154+
auto opIndexCompilesForConst0 = (cast(const)c0)[];
155+
auto opIndexCompilesForConst1 = (cast(const)c1)[];
147156
}
148157

149158
/// Multidimensional
@@ -364,6 +373,21 @@ struct Concatenation(size_t dim, Slices...)
364373
assert(indices[dim] < _slices[$-1].length!dim);
365374
return _slices[$-1][indices];
366375
}
376+
377+
ref opIndex()() scope return
378+
{
379+
return this;
380+
}
381+
382+
auto opIndex()() const return scope
383+
{
384+
import mir.ndslice.topology: iota;
385+
import mir.qualifier: LightConstOf, lightConst;
386+
import std.format: format;
387+
alias Ret = .Concatenation!(dim, staticMap!(LightConstOf, Slices));
388+
enum ret = "Ret(%(lightConst(_slices[%s]),%)]))".format(_slices.length.iota);
389+
return mixin(ret);
390+
}
367391
}
368392

369393

source/mir/ndslice/iterator.d

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ struct ZipIterator(Iterators...)
606606
///
607607
auto lightConst()() const @property
608608
{
609-
import std.format;
609+
import std.format: format;
610610
import mir.ndslice.topology: iota;
611611
import std.meta: staticMap;
612612
alias Ret = ZipIterator!(staticMap!(LightConstOf, Iterators));
@@ -617,7 +617,7 @@ struct ZipIterator(Iterators...)
617617
///
618618
auto lightImmutable()() immutable @property
619619
{
620-
import std.format;
620+
import std.format: format;
621621
import mir.ndslice.topology: iota;
622622
import std.meta: staticMap;
623623
alias Ret = ZipIterator!(staticMap!(LightImmutableOf, Iterators));

0 commit comments

Comments
 (0)