Report a bug
If you spot a problem with this page, click here to create a GitHub issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using a local clone.

mir.primitives

Templates used to check primitives and range primitives for arrays with multi-dimensional like API support.

Note UTF strings behaves like common arrays in Mir. std.uni.byCodePoint can be used to create a range of characters.

Authors:
Ilya Yaroshenko
enum bool hasLength(R);
Returns:
true if R has a length member that returns an integral type implicitly convertible to size_t.
R does not have to be a range.
Examples:
static assert(hasLength!(char[]));
static assert(hasLength!(int[]));
static assert(hasLength!(inout(int)[]));

struct B { size_t length() const { return 0; } }
struct C { @property size_t length() const { return 0; } }
static assert(hasLength!(B));
static assert(hasLength!(C));
enum bool hasShape(R);
Returns:
true if R has a shape member that returns an static array type of size_t[N].
Examples:
static assert(hasShape!(char[]));
static assert(hasShape!(int[]));
static assert(hasShape!(inout(int)[]));

struct B { size_t length() const { return 0; } }
struct C { @property size_t length() const { return 0; } }
static assert(hasShape!(B));
static assert(hasShape!(C));
@property auto shape(Range)(auto ref scope const Range range)
if (hasLength!Range || hasShape!Range);
Examples:
static assert([2, 2, 2].shape == [3]);
template DimensionCount(T)
enum size_t DimensionCount;
Extracts dimension count from a Slice. Alias for isSlice.
@property bool anyEmpty(Range)(auto ref scope const Range range)
if (hasShape!Range || __traits(hasMember, Range, "anyEmpty"));
@property size_t elementCount(Range)(auto ref scope const Range range)
if (hasShape!Range || __traits(hasMember, Range, "elementCount"));
template DeepElementType(S) if (is(S == struct) || is(S == class) || is(S == interface))

template DeepElementType(S : T[], T)
Returns the element type of a struct with .DeepElement inner alias or a type of common array. Returns ForeachType if struct does not have .DeepElement member.
bool empty(size_t dim = 0, T)(scope const T[] ar)
if (!dim);
Examples:
assert((int[]).init.empty);
assert(![1].empty!0); // Slice-like API
ref inout(T) front(size_t dim = 0, T)(return scope inout(T)[] ar)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
assert(*&[3, 4].front == 3); // access be ref
assert([3, 4].front!0 == 3); // Slice-like API
ref inout(T) back(size_t dim = 0, T)(return scope inout(T)[] ar)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
assert(*&[3, 4].back == 4); // access be ref
assert([3, 4].back!0 == 4); // Slice-like API
void popFront(size_t dim = 0, T)(ref scope inout(T)[] ar)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4];
ar.popFront;
assert(ar == [4]);
ar.popFront!0;  // Slice-like API
assert(ar == []);
void popBack(size_t dim = 0, T)(ref scope inout(T)[] ar)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4];
ar.popBack;
assert(ar == [3]);
ar.popBack!0;  // Slice-like API
assert(ar == []);
size_t popFrontN(size_t dim = 0, T)(ref scope inout(T)[] ar, size_t n)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4];
ar.popFrontN(1);
assert(ar == [4]);
ar.popFrontN!0(10);  // Slice-like API
assert(ar == []);
size_t popBackN(size_t dim = 0, T)(ref scope inout(T)[] ar, size_t n)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4];
ar.popBackN(1);
assert(ar == [3]);
ar.popBackN!0(10);  // Slice-like API
assert(ar == []);
void popFrontExactly(size_t dim = 0, T)(ref scope inout(T)[] ar, size_t n)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4, 5];
ar.popFrontExactly(2);
assert(ar == [5]);
ar.popFrontExactly!0(1);  // Slice-like API
assert(ar == []);
void popBackExactly(size_t dim = 0, T)(ref scope inout(T)[] ar, size_t n)
if (!dim && !is(Unqual!T[] == void[]));
Examples:
auto ar = [3, 4, 5];
ar.popBackExactly(2);
assert(ar == [3]);
ar.popBackExactly!0(1);  // Slice-like API
assert(ar == []);
size_t length(size_t d : 0, T)(in T[] array)
if (d == 0);
Examples:
assert([1, 2].length!0 == 2);
assert([1, 2].elementCount == 2);
inout(T)[] save(T)(return scope inout(T)[] array);
Examples:
auto a = [1, 2];
assert(a is a.save);