Skip to content

Commit 0c4b824

Browse files
committed
fix bug with front!1 and front!0 for Canonical and Contiguous ndslices
1 parent 7d2ffa0 commit 0c4b824

File tree

1 file changed

+50
-28
lines changed

1 file changed

+50
-28
lines changed

source/mir/ndslice/slice.d

Lines changed: 50 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,7 @@ auto sliced(size_t N, Iterator)(Iterator iterator, size_t[N] lengths...)
125125
alias S = Slice!(Contiguous, [N], typeof(C.init[0])*);
126126
else
127127
alias S = Slice!(Contiguous, [N], C);
128-
static if (hasElaborateAssign!Iterator)
129-
S ret;
130-
else
131-
S ret = void;
128+
S ret = S.init;
132129
static if (isDynamicArray!Iterator)
133130
ret._iterator = iterator.ptr;
134131
else
@@ -545,16 +542,13 @@ struct Slice(SliceKind kind, size_t[] packs, Iterator)
545542
static if (N == 1)
546543
alias ElemType = typeof(Iterator.init[size_t.init]);
547544
else
548-
static if (kind == Canonical)
549-
static if (dimension == N - 1)
550-
alias ElemType = Slice!(Universal, packs.decDim, Iterator);
551-
else
552-
static if (N == 2)
553-
alias ElemType = Slice!(Contiguous, packs.decDim, Iterator);
554-
else
555-
alias ElemType = Slice!(Canonical, packs.decDim, Iterator);
545+
static if (kind == Universal || dimension == N - 1)
546+
alias ElemType = Slice!(Universal, packs.decDim, Iterator);
556547
else
557-
alias ElemType = Slice!(kind, packs.decDim, Iterator);
548+
static if (N == 2 || kind == Contiguous && dimension == 0)
549+
alias ElemType = Slice!(Contiguous, packs.decDim, Iterator);
550+
else
551+
alias ElemType = Slice!(Canonical, packs.decDim, Iterator);
558552
}
559553

560554
static if (packs.length == 1)
@@ -806,7 +800,7 @@ struct Slice(SliceKind kind, size_t[] packs, Iterator)
806800
return _strides[0 .. packs[0]];
807801
else
808802
{
809-
typeof(return) ret = void;
803+
typeof(return) ret;
810804
static if (kind == Canonical)
811805
{
812806
foreach (i; Iota!S)
@@ -1028,13 +1022,24 @@ struct Slice(SliceKind kind, size_t[] packs, Iterator)
10281022
static if (hasElaborateAssign!Iterator)
10291023
ElemType!dimension ret;
10301024
else
1031-
ElemType!dimension ret = void;
1025+
ElemType!dimension ret = ElemType!dimension.init;
10321026

1033-
foreach (i; Erase!(dimension, Iota!N))
1034-
ret._lengths[SkipDimension!(dimension, i)] = _lengths[i];
1027+
foreach (i; Iota!(ret.N))
1028+
{
1029+
enum j = i >= dimension ? i + 1 : i;
1030+
ret._lengths[i] = _lengths[j];
1031+
}
10351032

1036-
foreach (i; Erase!(dimension, Iota!S))
1037-
ret._strides[SkipDimension!(dimension, i)] = _strides[i];
1033+
static if (!ret.S || ret.S + 1 == S)
1034+
alias s =_strides;
1035+
else
1036+
auto s = strides;
1037+
1038+
foreach (i; Iota!(ret.S))
1039+
{
1040+
enum j = i >= dimension ? i + 1 : i;
1041+
ret._strides[i] = s[j];
1042+
}
10381043

10391044
ret._iterator = _iterator;
10401045
return ret;
@@ -1069,13 +1074,24 @@ struct Slice(SliceKind kind, size_t[] packs, Iterator)
10691074
static if (hasElaborateAssign!Iterator)
10701075
ElemType!dimension ret;
10711076
else
1072-
ElemType!dimension ret = void;
1077+
ElemType!dimension ret = ElemType!dimension.init;
1078+
1079+
foreach (i; Iota!(ret.N))
1080+
{
1081+
enum j = i >= dimension ? i + 1 : i;
1082+
ret._lengths[i] = _lengths[j];
1083+
}
10731084

1074-
foreach (i; Erase!(dimension, Iota!N))
1075-
ret._lengths[SkipDimension!(dimension, i)] = _lengths[i];
1085+
static if (!ret.S || ret.S + 1 == S)
1086+
alias s =_strides;
1087+
else
1088+
auto s = strides;
10761089

1077-
foreach (i; Erase!(dimension, Iota!S))
1078-
ret._strides[SkipDimension!(dimension, i)] = _strides[i];
1090+
foreach (i; Iota!(ret.S))
1091+
{
1092+
enum j = i >= dimension ? i + 1 : i;
1093+
ret._strides[i] = s[j];
1094+
}
10791095

10801096
ret._iterator = _iterator;
10811097
ret._iterator += backIndex!dimension;
@@ -1410,10 +1426,8 @@ struct Slice(SliceKind kind, size_t[] packs, Iterator)
14101426
enum K = Contiguous;
14111427
else
14121428
enum K = Canonical;
1413-
static if (hasElaborateAssign!Iterator)
1414-
Slice!(K, (packs[0] - F) ~ packs[1 .. $], Iterator) ret;
1415-
else
1416-
Slice!(K, (packs[0] - F) ~ packs[1 .. $], Iterator) ret = void;
1429+
alias Ret = Slice!(K, (packs[0] - F) ~ packs[1 .. $], Iterator);
1430+
mixin _DefineRet_;
14171431
enum bool shrink = kind == Canonical && slices.length == N;
14181432
static if (shrink)
14191433
{
@@ -2700,3 +2714,11 @@ unittest
27002714
import mir.ndslice.topology: canonical, iota;
27012715
static assert(kindOf!(typeof(iota([1, 2]).canonical[1])) == Contiguous);
27022716
}
2717+
2718+
unittest
2719+
{
2720+
import mir.ndslice.topology: iota;
2721+
auto s = iota(2, 3);
2722+
assert(s.front!1 == [0, 3]);
2723+
assert(s.back!1 == [2, 5]);
2724+
}

0 commit comments

Comments
 (0)