Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion source/mir/algorithm/iteration.d
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,6 @@ import std.traits;

@optmath:


/+
Bitslice representation for accelerated bitwise algorithm.
1-dimensional contiguousitslice can be split into three chunks: head bits, body chunks, and tail bits.
Expand Down
58 changes: 57 additions & 1 deletion source/mir/ndslice/topology.d
Original file line number Diff line number Diff line change
Expand Up @@ -3918,7 +3918,7 @@ template byDim(Dimensions...)
n-dimensional slice ipacked to allow iteration by dimension
+/
@optmath auto byDim(Iterator, size_t N, SliceKind kind)
(Slice!(Iterator, N, kind) slice)
(Slice!(Iterator, N, kind) slice)
{
import mir.ndslice.topology : ipack;
import mir.ndslice.internal : DimensionsCountCTError;
Expand Down Expand Up @@ -4240,6 +4240,62 @@ version(mir_test) unittest
assert(x == slice);
}

/++
Adds outer dimension length of 1.
+/
Slice!(Iterator, N + 1, kind) addOuterDim(Iterator, size_t N, SliceKind kind)(Slice!(Iterator, N, kind) slice)
{
import mir.utility: swap;
typeof(return) ret;
ret._lengths[0 .. N] = slice._lengths;
ret._lengths[N] = 1;
static if (kind != SliceKind.contiguous)
ret._strides[0 .. $ - 1] = slice._strides;
swap(ret._iterator, slice._iterator);
return ret;
}

///
version (mir_test)
@safe pure nothrow @nogc
unittest
{
// [0, 1, 2] -> [[0, 1, 2]]
assert([3].iota.addOuterDim == [3, 1].iota);
assert([3].iota.universal.addOuterDim == [3, 1].iota);
assert([3, 4].iota.addOuterDim == [3, 4, 1].iota);
assert([3, 4].iota.canonical.addOuterDim == [3, 4, 1].iota);
assert([3, 4].iota.universal.addOuterDim == [3, 4, 1].iota);
}

/++
Adds inner dimension length of 1.
+/
Slice!(Iterator, N + 1, kind) addInnerDim(Iterator, size_t N, SliceKind kind)(Slice!(Iterator, N, kind) slice)
{
import mir.utility: swap;
typeof(return) ret;
ret._lengths[1 .. N + 1] = slice._lengths;
ret._lengths[0] = 1;
static if (kind != SliceKind.contiguous)
ret._strides[1 .. $] = slice._strides;
swap(ret._iterator, slice._iterator);
return ret;
}

///
version (mir_test)
@safe pure nothrow @nogc
unittest
{
// [0, 1, 2] -> [[0], [1], [2]]
assert([3].iota.addInnerDim == [1, 3].iota);
assert([3].iota.universal.addInnerDim == [1, 3].iota);
assert([3, 4].iota.addInnerDim == [1, 3, 4].iota);
assert([3, 4].iota.canonical.addInnerDim == [1, 3, 4].iota);
assert([3, 4].iota.universal.addInnerDim == [1, 3, 4].iota);
}

/++
Field (element's member) projection.

Expand Down