Skip to content

Commit a725dbc

Browse files
authored
Merge pull request #4823 from 9il/templatebloat
reduce ndslice template bloat
2 parents 59b6392 + a90f857 commit a725dbc

File tree

4 files changed

+138
-261
lines changed

4 files changed

+138
-261
lines changed

std/experimental/ndslice/internal.d

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -334,42 +334,6 @@ enum indexError(size_t pos, size_t N) =
334334
~ " from the range [0 .." ~ N.stringof ~ ")"
335335
~ " must be less than corresponding length.";
336336

337-
enum indexStrideCode = q{
338-
static if (_indexes.length)
339-
{
340-
size_t stride = _strides[0] * _indexes[0];
341-
assert(_indexes[0] < _lengths[0], indexError!(0, N));
342-
foreach (i; Iota!(1, N)) //static
343-
{
344-
assert(_indexes[i] < _lengths[i], indexError!(i, N));
345-
stride += _strides[i] * _indexes[i];
346-
}
347-
return stride;
348-
}
349-
else
350-
{
351-
return 0;
352-
}
353-
};
354-
355-
enum mathIndexStrideCode = q{
356-
static if (_indexes.length)
357-
{
358-
size_t stride = _strides[0] * _indexes[N - 1];
359-
assert(_indexes[N - 1] < _lengths[0], indexError!(N - 1, N));
360-
foreach_reverse (i; Iota!(0, N - 1)) //static
361-
{
362-
assert(_indexes[i] < _lengths[N - 1 - i], indexError!(i, N));
363-
stride += _strides[N - 1 - i] * _indexes[i];
364-
}
365-
return stride;
366-
}
367-
else
368-
{
369-
return 0;
370-
}
371-
};
372-
373337
enum string tailErrorMessage(
374338
string fun = __FUNCTION__,
375339
string pfun = __PRETTY_FUNCTION__) =
@@ -513,6 +477,8 @@ private bool isValidPartialPermutationImpl(size_t N)(in size_t[] perm, ref int[N
513477
return true;
514478
}
515479

480+
enum toSize_t(size_t i) = i;
481+
enum isSize_t(alias i) = is(typeof(i) == size_t);
516482
enum isIndex(I) = is(I : size_t);
517483
enum is_Slice(S) = is(S : _Slice);
518484

std/experimental/ndslice/iteration.d

Lines changed: 47 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@ Returns:
329329
n-dimensional slice of the same type
330330
See_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)
410410
template 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...)
444432
in
445433
{
446434
mixin (DimensionsCountRTError);
@@ -458,7 +446,7 @@ body
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:
552540
template 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...)
580559
in
581560
{
582561
foreach (dimension; dimensions)
583562
mixin (DimensionRTError);
584563
}
585564
body
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:
666648
template 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:
892877
template 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...)
920896
in
921897
{
922898
foreach (dimension; dimensions)
923899
mixin (DimensionRTError);
924900
}
925901
body
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
933912
template 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...)
961931
in
962932
{
963933
foreach (dimension; dimensions)
964934
mixin (DimensionRTError);
965935
}
966936
body
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:
10291002
template 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
10571033
template 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:
11181097
template 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
11461128
template 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

Comments
 (0)