@@ -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