@@ -551,21 +551,11 @@ private void checkShapesMatch(
551551 {
552552 import mir.ndslice.fuse: fuseShape;
553553 static assert (slices[i].fuseShape.length >= N);
554- assert (slices[i].fuseShape[0 .. N] == slices[0 ].shape, msgShape);
554+ assert (cast ( size_t [N]) slices[i].fuseShape[0 .. N] == slices[0 ].shape, msgShape);
555555 }
556556 }
557557}
558558
559- template frontOf (size_t N)
560- {
561- static if (N == 0 )
562- enum frontOf = " " ;
563- else
564- {
565- enum i = N - 1 ;
566- enum frontOf = frontOf! i ~ " slices[" ~ i.stringof ~ " ].front, " ;
567- }
568- }
569559
570560package (mir) template allFlattened(args... )
571561{
@@ -587,11 +577,19 @@ private template areAllContiguousSlices(Slices...)
587577{
588578 import mir.ndslice.traits: isContiguousSlice;
589579 static if (allSatisfy! (isContiguousSlice, Slices))
590- enum areAllContiguousSlices = Slices[0 ].N > 1 ;
580+ enum areAllContiguousSlices = Slices[0 ].N > 1 && areAllContiguousSlicesImpl ! (Slices[ 0 ].N, Slices[ 1 .. $]) ;
591581 else
592582 enum areAllContiguousSlices = false ;
593583}
594584
585+ private template areAllContiguousSlicesImpl (size_t N, Slices... )
586+ {
587+ static if (Slices.length == 0 )
588+ enum areAllContiguousSlicesImpl = true ;
589+ else
590+ enum areAllContiguousSlicesImpl = Slices[0 ].N == N && areAllContiguousSlicesImpl! (N, Slices[1 .. $]);
591+ }
592+
595593version (LDC ) {}
596594else version (GNU ) {}
597595else version (Windows ) {}
@@ -663,9 +661,9 @@ S reduceImpl(alias fun, S, Slices...)(S seed, scope Slices slices)
663661 do
664662 {
665663 static if (DimensionCount! (Slices[0 ]) == 1 )
666- seed = mixin ( " fun(seed, " ~ frontOf! (Slices.length) ~ " ) " );
664+ seed = fun(seed, frontOf! slices );
667665 else
668- seed = mixin ( " .reduceImpl!fun(seed," ~ frontOf! (Slices.length) ~ " ) " );
666+ seed = .reduceImpl! fun(seed, frontOf! slices );
669667 foreach_reverse (ref slice; slices)
670668 slice.popFront;
671669 }
@@ -920,9 +918,9 @@ void eachImpl(alias fun, Slices...)(scope Slices slices)
920918 do
921919 {
922920 static if (DimensionCount! (Slices[0 ]) == 1 )
923- mixin ( " fun(" ~ frontOf! (Slices.length) ~ " ); " );
921+ fun(frontOf! slices );
924922 else
925- mixin ( " .eachImpl!fun(" ~ frontOf! (Slices.length) ~ " ); " );
923+ .eachImpl! fun(frontOf! slices );
926924 foreach_reverse (i; Iota! (Slices.length))
927925 slices[i].popFront;
928926 }
@@ -1678,15 +1676,15 @@ bool findImpl(alias fun, size_t N, Slices...)(scope ref size_t[N] backwardIndex,
16781676 {
16791677 static if (DimensionCount! (Slices[0 ]) == 1 )
16801678 {
1681- if (mixin ( " fun(" ~ frontOf! (Slices.length) ~ " ) " ))
1679+ if (fun(frontOf! slices ))
16821680 {
16831681 backwardIndex[0 ] = slices[0 ].length;
16841682 return true ;
16851683 }
16861684 }
16871685 else
16881686 {
1689- if (mixin ( " findImpl!fun(backwardIndex[1 .. $], " ~ frontOf! (Slices.length) ~ " ) " ))
1687+ if (findImpl! fun(backwardIndex[1 .. $], frontOf! slices ))
16901688 {
16911689 backwardIndex[0 ] = slices[0 ].length;
16921690 return true ;
@@ -1965,12 +1963,12 @@ size_t anyImpl(alias fun, Slices...)(scope Slices slices)
19651963 {
19661964 static if (DimensionCount! (Slices[0 ]) == 1 )
19671965 {
1968- if (mixin ( " fun(" ~ frontOf! (Slices.length) ~ " ) " ))
1966+ if (fun(frontOf! slices ))
19691967 return true ;
19701968 }
19711969 else
19721970 {
1973- if (mixin ( " anyImpl!fun(" ~ frontOf! (Slices.length) ~ " ) " ))
1971+ if (anyImpl! fun(frontOf! slices ))
19741972 return true ;
19751973 }
19761974 foreach_reverse (ref slice; slices)
@@ -2125,12 +2123,12 @@ size_t allImpl(alias fun, Slices...)(scope Slices slices)
21252123 {
21262124 static if (DimensionCount! (Slices[0 ]) == 1 )
21272125 {
2128- if (! mixin ( " fun(" ~ frontOf! (Slices.length) ~ " ) " ))
2126+ if (! fun(frontOf! slices ))
21292127 return false ;
21302128 }
21312129 else
21322130 {
2133- if (! mixin ( " allImpl!fun(" ~ frontOf! (Slices.length) ~ " ) " ))
2131+ if (! allImpl! fun(frontOf! slices ))
21342132 return false ;
21352133 }
21362134 foreach_reverse (ref slice; slices)
@@ -2636,42 +2634,18 @@ size_t countImpl(alias fun, Slices...)(scope Slices slices)
26362634 {
26372635 static if (DimensionCount! (Slices[0 ]) == 1 )
26382636 {
2639- if (mixin ( " fun(" ~ frontOf! (Slices.length) ~ " ) " ))
2637+ if (fun(frontOf! slices ))
26402638 ret++ ;
26412639 }
26422640 else
2643- ret += mixin ( " .countImpl!fun(" ~ frontOf! (Slices.length) ~ " ) " );
2641+ ret += .countImpl! fun(frontOf! slices );
26442642 foreach_reverse (ref slice; slices)
26452643 slice.popFront;
26462644 }
26472645 while (! slices[0 ].empty);
26482646 return ret;
26492647}
26502648
2651- private template selectBackOf (size_t N, string input)
2652- {
2653- static if (N == 0 )
2654- enum selectBackOf = " " ;
2655- else
2656- {
2657- enum i = N - 1 ;
2658- enum selectBackOf = selectBackOf! (i, input) ~
2659- " lightScope(slices[" ~ i.stringof ~ " ]).selectBack!0(" ~ input ~ " ), " ;
2660- }
2661- }
2662-
2663- private template frontSelectFrontOf (size_t N, string input)
2664- {
2665- static if (N == 0 )
2666- enum frontSelectFrontOf = " " ;
2667- else
2668- {
2669- enum i = N - 1 ;
2670- enum frontSelectFrontOf = frontSelectFrontOf! (i, input) ~
2671- " lightScope(slices[" ~ i.stringof ~ " ]).front!0.selectFront!0(" ~ input ~ " ), " ;
2672- }
2673- }
2674-
26752649/+ +
26762650Returns: max length across all dimensions.
26772651+/
@@ -2756,7 +2730,7 @@ template eachLower(alias fun)
27562730 if ((n + k) < m)
27572731 {
27582732 val = m - (n + k);
2759- mixin ( " .eachImpl!fun(" ~ selectBackOf! (Slices.length, " val " ) ~ " ); " );
2733+ .eachImpl! fun(selectBackOf! (val, slices) );
27602734 }
27612735
27622736 size_t i;
@@ -2771,7 +2745,7 @@ template eachLower(alias fun)
27712745 do
27722746 {
27732747 val = i - k + 1 ;
2774- mixin ( " .eachImpl!fun(" ~ frontSelectFrontOf! (Slices.length, " val " ) ~ " ); " );
2748+ .eachImpl! fun(frontSelectFrontOf! (val, slices) );
27752749
27762750 foreach (ref slice; slices)
27772751 slice.popFront! 0 ;
@@ -3127,30 +3101,6 @@ version(mir_test) unittest
31273101 [ 6 , 7 , 18 ]]);
31283102}
31293103
3130- private template frontSelectBackOf (size_t N, string input)
3131- {
3132- static if (N == 0 )
3133- enum frontSelectBackOf = " " ;
3134- else
3135- {
3136- enum i = N - 1 ;
3137- enum frontSelectBackOf = frontSelectBackOf! (i, input) ~
3138- " lightScope(slices[" ~ i.stringof ~ " ]).front.selectBack!0(" ~ input ~ " ), " ;
3139- }
3140- }
3141-
3142- private template selectFrontOf (size_t N, string input)
3143- {
3144- static if (N == 0 )
3145- enum selectFrontOf = " " ;
3146- else
3147- {
3148- enum i = N - 1 ;
3149- enum selectFrontOf = selectFrontOf! (i, input) ~
3150- " lightScope(slices[" ~ i.stringof ~ " ]).selectFront!0(" ~ input ~ " ), " ;
3151- }
3152- }
3153-
31543104/+ +
31553105The call `eachUpper!(fun)(slice1, ..., sliceN)` evaluates `fun` on the upper
31563106triangle in `slice1, ..., sliceN`, respectively.
@@ -3223,7 +3173,7 @@ template eachUpper(alias fun)
32233173 if (k < 0 )
32243174 {
32253175 val = - k;
3226- mixin ( " .eachImpl!fun(" ~ selectFrontOf! (Slices.length, " val " ) ~ " ); " );
3176+ .eachImpl! fun(selectFrontOf! (val, slices) );
32273177
32283178 foreach (ref slice; slices)
32293179 slice.popFrontExactly! 0 (- k);
@@ -3233,7 +3183,7 @@ template eachUpper(alias fun)
32333183 do
32343184 {
32353185 val = (n - k) - i;
3236- mixin ( " .eachImpl!fun(" ~ frontSelectBackOf! (Slices.length, " val " ) ~ " ); " );
3186+ .eachImpl! fun(frontSelectBackOf! (val, slices) );
32373187
32383188 foreach (ref slice; slices)
32393189 slice.popFront;
0 commit comments