@@ -83,6 +83,7 @@ import std.meta;
83
83
import mir.internal.utility;
84
84
import mir.ndslice.internal;
85
85
import mir.ndslice.slice;
86
+ import mir.utility;
86
87
87
88
@fastmath:
88
89
@@ -330,24 +331,15 @@ Returns:
330
331
n-dimensional slice of the same type
331
332
See_also: $(LREF swapped), $(LREF transposed)
332
333
+/
333
- Slice! (Universal, packs, Iterator) everted(size_t [] packs, Iterator)(Slice! (Universal, packs, Iterator) slice)
334
+ Slice! (kind, packs, Iterator) everted(size_t [] packs, SliceKind kind, Iterator)(Slice! (kind, packs, Iterator) slice)
335
+ if (kind == Universal || kind == Canonical && packs.length > 1 )
334
336
{
335
- mixin _DefineRet;
336
- with (slice)
337
+ with (slice) foreach (i; Iota! (packs[0 ] / 2 ))
337
338
{
338
- foreach (i; Iota! (packs[0 ]))
339
- {
340
- ret._lengths[N - 1 - i] = _lengths[i];
341
- ret._strides[N - 1 - i] = _strides[i];
342
- }
343
- foreach (i; Iota! (packs[0 ], slice.N))
344
- {
345
- ret._lengths[i] = _lengths[i];
346
- ret._strides[i] = _strides[i];
347
- }
348
- ret._iterator = _iterator;
349
- return ret;
339
+ swap(_lengths[i], _lengths[packs[0 ] - i - 1 ]);
340
+ swap(_strides[i], _strides[packs[0 ] - i - 1 ]);
350
341
}
342
+ return slice;
351
343
}
352
344
353
345
// /
@@ -362,24 +354,21 @@ Slice!(Universal, packs, Iterator) everted(size_t[] packs, Iterator)(Slice!(Univ
362
354
}
363
355
364
356
private enum _transposedCode = q{
365
- mixin _DefineRet;
366
- with (slice)
357
+ size_t [typeof (return ).N] lengths_;
358
+ ptrdiff_t [max(typeof (return ).S, size_t (1 ))] strides_;
359
+ with (slice) foreach (i; Iota! (packs[0 ]))
367
360
{
368
- foreach (i; Iota! (packs[0 ]))
369
- {
370
- ret._lengths[i] = _lengths[perm[i]];
371
- static if (i < ret.S)
372
- ret._strides[i] = _strides[perm[i]];
373
- }
374
- foreach (i; Iota! (packs[0 ], slice.N))
375
- {
376
- ret._lengths[i] = _lengths[i];
377
- static if (i < ret.S)
378
- ret._strides[i] = _strides[i];
379
- }
380
- ret._iterator = _iterator;
381
- return ret;
361
+ lengths_[i] = _lengths[perm[i]];
362
+ static if (i < typeof (return ).S)
363
+ strides_[i] = _strides[perm[i]];
364
+ }
365
+ with (slice) foreach (i; Iota! (packs[0 ], slice.N))
366
+ {
367
+ lengths_[i] = _lengths[i];
368
+ static if (i < typeof (return ).S)
369
+ strides_[i] = _strides[i];
382
370
}
371
+ return typeof (return )(lengths_, strides_[0 .. typeof (return ).S], slice._iterator);
383
372
};
384
373
385
374
private size_t [N] completeTranspose (size_t N)(size_t [] dimensions)
@@ -536,6 +525,7 @@ Returns:
536
525
n-dimensional slice of the same type
537
526
+/
538
527
Slice! (kind, packs, Iterator) allReversed(SliceKind kind, size_t [] packs, Iterator)(Slice! (kind, packs, Iterator) slice)
528
+ @trusted
539
529
if (kind == Universal || kind == Canonical && packs.length > 1 )
540
530
{
541
531
foreach (dimension; Iota! (packs[0 ]))
@@ -571,7 +561,9 @@ template reversed(Dimensions...)
571
561
alias reversed = .reversed! (staticMap! (toSize_t, Dimensions));
572
562
else
573
563
// /
574
- @fastmath Slice! (kind, packs, Iterator) reversed(SliceKind kind, size_t [] packs, Iterator)(Slice! (kind, packs, Iterator) slice)
564
+ @fastmath Slice! (kind, packs, Iterator)
565
+ reversed(SliceKind kind, size_t [] packs, Iterator)(Slice! (kind, packs, Iterator) slice)
566
+ @trusted
575
567
if (kind == Universal || kind == Canonical)
576
568
{
577
569
foreach (i, dimension; Dimensions)
@@ -585,6 +577,7 @@ template reversed(Dimensions...)
585
577
586
578
// /ditto
587
579
Slice! (kind, packs, Iterator) reversed(SliceKind kind, size_t [] packs, Iterator, size_t M)(Slice! (kind, packs, Iterator) slice, size_t [M] dimensions... )
580
+ @trusted
588
581
if (kind == Universal || kind == Canonical)
589
582
in
590
583
{
602
595
}
603
596
604
597
// /
605
- pure nothrow unittest
598
+ @safe pure nothrow unittest
606
599
{
607
600
import mir.ndslice.topology: iota, universal;
608
601
auto slice = iota([2 , 2 ], 1 ).universal;
@@ -626,7 +619,7 @@ pure nothrow unittest
626
619
}
627
620
628
621
// /
629
- pure nothrow unittest
622
+ @safe pure nothrow unittest
630
623
{
631
624
import mir.ndslice.topology: iota, canonical;
632
625
auto slice = iota([2 , 2 ], 1 ).canonical;
0 commit comments