Skip to content

Commit c39ec4c

Browse files
committed
reduce ndslice template bloat part 1
1 parent 81c09ed commit c39ec4c

File tree

4 files changed

+106
-261
lines changed

4 files changed

+106
-261
lines changed

std/experimental/ndslice/internal.d

Lines changed: 0 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__) =

std/experimental/ndslice/iteration.d

Lines changed: 20 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,7 @@ 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+
@fmb Slice!(N, Range) transposed(size_t N, Range)(Slice!(N, Range) slice)
414414
{
415415
mixin DimensionsCountCTError;
416416
foreach (i, dimension; Dimensions)
@@ -425,22 +425,7 @@ template transposed(Dimensions...)
425425
}
426426

427427
///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...)
428+
Slice!(N, Range) transposed(size_t N, Range, size_t M)(Slice!(N, Range) slice, size_t[M] dimensions...)
444429
in
445430
{
446431
mixin (DimensionsCountRTError);
@@ -458,7 +443,7 @@ body
458443
}
459444

460445
///ditto
461-
Slice!(2, Range) transposed(Range)(auto ref Slice!(2, Range) slice)
446+
Slice!(2, Range) transposed(Range)(Slice!(2, Range) slice)
462447
{
463448
return .transposed!(1, 0)(slice);
464449
}
@@ -564,28 +549,19 @@ template reversed(Dimensions...)
564549
}
565550

566551
///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...)
552+
Slice!(N, Range) reversed(size_t N, Range, size_t M)(Slice!(N, Range) slice, size_t[M] dimensions...)
580553
in
581554
{
582555
foreach (dimension; dimensions)
583556
mixin (DimensionRTError);
584557
}
585558
body
586559
{
587-
foreach (dimension; dimensions)
560+
foreach (i; Iota!(0, M))
561+
{
562+
auto dimension = dimensions[i];
588563
mixin (_reversedCode);
564+
}
589565
return slice;
590566
}
591567

@@ -904,28 +880,19 @@ template dropOne(Dimensions...)
904880
}
905881

906882
///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...)
883+
Slice!(N, Range) dropOne(size_t N, Range, size_t M)(Slice!(N, Range) slice, size_t[M] dimensions...)
920884
in
921885
{
922886
foreach (dimension; dimensions)
923887
mixin (DimensionRTError);
924888
}
925889
body
926890
{
927-
foreach (dimension; dimensions)
891+
foreach (i; Iota!(0, M))
892+
{
893+
auto dimension = dimensions[i];
928894
slice.popFront(dimension);
895+
}
929896
return slice;
930897
}
931898

@@ -945,28 +912,19 @@ template dropBackOne(Dimensions...)
945912
}
946913

947914
///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...)
915+
Slice!(N, Range) dropBackOne(size_t N, Range, size_t M)(Slice!(N, Range) slice, size_t[M] dimensions...)
961916
in
962917
{
963918
foreach (dimension; dimensions)
964919
mixin (DimensionRTError);
965920
}
966921
body
967922
{
968-
foreach (dimension; dimensions)
923+
foreach (i; Iota!(0, M))
924+
{
925+
auto dimension = dimensions[i];
969926
slice.popBack(dimension);
927+
}
970928
return slice;
971929
}
972930

0 commit comments

Comments
 (0)