@@ -329,7 +329,7 @@ Returns:
329329 n-dimensional slice of the same type
330330See_also: $(LREF swapped), $(LREF transposed)
331331+/
332- Slice! (N, Range ) everted(size_t N, Range )(auto ref Slice! (N, Range ) slice)
332+ Slice! (N, Range ) everted(size_t N, Range )(Slice! (N, Range ) slice)
333333{
334334 mixin _DefineRet;
335335 with (slice)
@@ -378,7 +378,7 @@ private enum _transposedCode = q{
378378 }
379379};
380380
381- private size_t [N] completeTranspose (size_t N)(in size_t [] dimensions)
381+ private size_t [N] completeTranspose (size_t N)(size_t [] dimensions)
382382{
383383 assert (dimensions.length <= N);
384384 size_t [N] ctr;
@@ -410,7 +410,10 @@ See_also: $(LREF swapped), $(LREF everted)
410410template transposed (Dimensions... )
411411 if (Dimensions.length)
412412{
413- @fmb Slice! (N, Range ) transposed(size_t N, Range )(auto ref Slice! (N, Range ) slice)
413+ static if (! allSatisfy! (isSize_t, Dimensions))
414+ alias transposed = .transposed! (staticMap! (toSize_t, Dimensions));
415+ else
416+ @fmb Slice! (N, Range ) transposed(size_t N, Range )(Slice! (N, Range ) slice)
414417 {
415418 mixin DimensionsCountCTError;
416419 foreach (i, dimension; Dimensions)
@@ -425,22 +428,7 @@ template transposed(Dimensions...)
425428}
426429
427430// /ditto
428- Slice! (N, Range ) transposed(size_t N, Range )(auto ref Slice! (N, Range ) slice, size_t dimension)
429- in
430- {
431- mixin (DimensionRTError);
432- }
433- body
434- {
435- size_t [1 ] permutation = void ;
436- permutation[0 ] = dimension;
437- immutable perm = completeTranspose! N(permutation);
438- assert (perm.isPermutation, __PRETTY_FUNCTION__ ~ " : internal error." );
439- mixin (_transposedCode);
440- }
441-
442- // /ditto
443- Slice! (N, Range ) transposed(size_t N, Range )(auto ref Slice! (N, Range ) slice, in size_t [] dimensions... )
431+ Slice! (N, Range ) transposed(size_t N, Range , size_t M)(Slice! (N, Range ) slice, size_t [M] dimensions... )
444432in
445433{
446434 mixin (DimensionsCountRTError);
458446}
459447
460448// /ditto
461- Slice! (2 , Range ) transposed(Range )(auto ref Slice! (2 , Range ) slice)
449+ Slice! (2 , Range ) transposed(Range )(Slice! (2 , Range ) slice)
462450{
463451 return .transposed! (1 , 0 )(slice);
464452}
@@ -552,6 +540,9 @@ Returns:
552540template reversed (Dimensions... )
553541 if (Dimensions.length)
554542{
543+ static if (! allSatisfy! (isSize_t, Dimensions))
544+ alias reversed = .reversed! (staticMap! (toSize_t, Dimensions));
545+ else
555546 @fmb auto reversed(size_t N, Range )(Slice! (N, Range ) slice)
556547 {
557548 foreach (i, dimension; Dimensions)
@@ -564,28 +555,19 @@ template reversed(Dimensions...)
564555}
565556
566557// /ditto
567- Slice! (N, Range ) reversed(size_t N, Range )(Slice! (N, Range ) slice, size_t dimension)
568- in
569- {
570- mixin (DimensionRTError);
571- }
572- body
573- {
574- mixin (_reversedCode);
575- return slice;
576- }
577-
578- // /ditto
579- Slice! (N, Range ) reversed(size_t N, Range )(Slice! (N, Range ) slice, in size_t [] dimensions... )
558+ Slice! (N, Range ) reversed(size_t N, Range , size_t M)(Slice! (N, Range ) slice, size_t [M] dimensions... )
580559in
581560{
582561 foreach (dimension; dimensions)
583562 mixin (DimensionRTError);
584563}
585564body
586565{
587- foreach (dimension; dimensions)
566+ foreach (i; Iota! (0 , M))
567+ {
568+ auto dimension = dimensions[i];
588569 mixin (_reversedCode);
570+ }
589571 return slice;
590572}
591573
@@ -666,6 +648,9 @@ Returns:
666648template strided (Dimensions... )
667649 if (Dimensions.length)
668650{
651+ static if (! allSatisfy! (isSize_t, Dimensions))
652+ alias strided = .strided! (staticMap! (toSize_t, Dimensions));
653+ else
669654 @fmb auto strided(size_t N, Range )(Slice! (N, Range ) slice, Repeat! (Dimensions.length, size_t ) factors)
670655 body
671656 {
@@ -892,6 +877,9 @@ Returns:
892877template dropOne (Dimensions... )
893878 if (Dimensions.length)
894879{
880+ static if (! allSatisfy! (isSize_t, Dimensions))
881+ alias dropOne = .dropOne! (staticMap! (toSize_t, Dimensions));
882+ else
895883 @fmb Slice! (N, Range ) dropOne(size_t N, Range )(Slice! (N, Range ) slice)
896884 {
897885 foreach (i, dimension; Dimensions)
@@ -904,35 +892,29 @@ template dropOne(Dimensions...)
904892}
905893
906894// /ditto
907- Slice! (N, Range ) dropOne(size_t N, Range )(Slice! (N, Range ) slice, size_t dimension)
908- in
909- {
910- mixin (DimensionRTError);
911- }
912- body
913- {
914- slice.popFront(dimension);
915- return slice;
916- }
917-
918- // /ditto
919- Slice! (N, Range ) dropOne(size_t N, Range )(Slice! (N, Range ) slice, in size_t [] dimensions... )
895+ Slice! (N, Range ) dropOne(size_t N, Range , size_t M)(Slice! (N, Range ) slice, size_t [M] dimensions... )
920896in
921897{
922898 foreach (dimension; dimensions)
923899 mixin (DimensionRTError);
924900}
925901body
926902{
927- foreach (dimension; dimensions)
903+ foreach (i; Iota! (0 , M))
904+ {
905+ auto dimension = dimensions[i];
928906 slice.popFront(dimension);
907+ }
929908 return slice;
930909}
931910
932911// /ditto
933912template dropBackOne (Dimensions... )
934913 if (Dimensions.length)
935914{
915+ static if (! allSatisfy! (isSize_t, Dimensions))
916+ alias dropBackOne = .dropBackOne! (staticMap! (toSize_t, Dimensions));
917+ else
936918 @fmb Slice! (N, Range ) dropBackOne(size_t N, Range )(Slice! (N, Range ) slice)
937919 {
938920 foreach (i, dimension; Dimensions)
@@ -945,28 +927,19 @@ template dropBackOne(Dimensions...)
945927}
946928
947929// /ditto
948- Slice! (N, Range ) dropBackOne(size_t N, Range )(Slice! (N, Range ) slice, size_t dimension)
949- in
950- {
951- mixin (DimensionRTError);
952- }
953- body
954- {
955- slice.popBack(dimension);
956- return slice;
957- }
958-
959- // /ditto
960- Slice! (N, Range ) dropBackOne(size_t N, Range )(Slice! (N, Range ) slice, in size_t [] dimensions... )
930+ Slice! (N, Range ) dropBackOne(size_t N, Range , size_t M)(Slice! (N, Range ) slice, size_t [M] dimensions... )
961931in
962932{
963933 foreach (dimension; dimensions)
964934 mixin (DimensionRTError);
965935}
966936body
967937{
968- foreach (dimension; dimensions)
938+ foreach (i; Iota! (0 , M))
939+ {
940+ auto dimension = dimensions[i];
969941 slice.popBack(dimension);
942+ }
970943 return slice;
971944}
972945
@@ -1029,6 +1002,9 @@ Returns:
10291002template dropExactly (Dimensions... )
10301003 if (Dimensions.length)
10311004{
1005+ static if (! allSatisfy! (isSize_t, Dimensions))
1006+ alias dropExactly = .dropExactly! (staticMap! (toSize_t, Dimensions));
1007+ else
10321008 @fmb Slice! (N, Range ) dropExactly(size_t N, Range )(Slice! (N, Range ) slice, Repeat! (Dimensions.length, size_t ) ns)
10331009 body
10341010 {
@@ -1057,6 +1033,9 @@ body
10571033template dropBackExactly (Dimensions... )
10581034 if (Dimensions.length)
10591035{
1036+ static if (! allSatisfy! (isSize_t, Dimensions))
1037+ alias dropBackExactly = .dropBackExactly! (staticMap! (toSize_t, Dimensions));
1038+ else
10601039 @fmb Slice! (N, Range ) dropBackExactly(size_t N, Range )(Slice! (N, Range ) slice, Repeat! (Dimensions.length, size_t ) ns)
10611040 body
10621041 {
@@ -1118,6 +1097,9 @@ Returns:
11181097template drop (Dimensions... )
11191098 if (Dimensions.length)
11201099{
1100+ static if (! allSatisfy! (isSize_t, Dimensions))
1101+ alias drop = .drop! (staticMap! (toSize_t, Dimensions));
1102+ else
11211103 @fmb Slice! (N, Range ) drop(size_t N, Range )(Slice! (N, Range ) slice, Repeat! (Dimensions.length, size_t ) ns)
11221104 body
11231105 {
@@ -1146,6 +1128,9 @@ body
11461128template dropBack (Dimensions... )
11471129 if (Dimensions.length)
11481130{
1131+ static if (! allSatisfy! (isSize_t, Dimensions))
1132+ alias dropBack = .dropBack! (staticMap! (toSize_t, Dimensions));
1133+ else
11491134 @fmb Slice! (N, Range ) dropBack(size_t N, Range )(Slice! (N, Range ) slice, Repeat! (Dimensions.length, size_t ) ns)
11501135 body
11511136 {
0 commit comments