Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 32 additions & 30 deletions std/meta.d
Original file line number Diff line number Diff line change
Expand Up @@ -1146,20 +1146,10 @@ template ApplyRight(alias Template, args...)
alias ApplyRight(left...) = SmartAlias!(Template!(left, args));
}

private template SmartAlias(T...) {
static if (T.length == 1)
{
alias SmartAlias = Alias!T;
}
else
{
alias SmartAlias = AliasSeq!T;
}
}

///
@safe unittest
{
// enum bool isImplicitlyConvertible(From, To)
import std.traits : isImplicitlyConvertible;

static assert(allSatisfy!(
Expand All @@ -1170,25 +1160,6 @@ private template SmartAlias(T...) {
ubyte, string, short, float, int) == AliasSeq!(ubyte, short)));
}

@safe unittest
{
static assert(is(typeof({
alias T(T0, int a, double b, alias T1, string c) = AliasSeq!(T0, a, b, T1, c);
alias T0 = ApplyRight!(ApplyLeft, ApplyRight);
alias T1 = T0!ApplyLeft;
alias T2 = T1!T;
alias T3 = T2!(3, "foo");
alias T4 = T3!(short, 3, 3.3);
static assert(Pack!T4.equals!(short, 3, 3.3, 3, "foo"));

import std.traits : isImplicitlyConvertible;
alias U1 = ApplyLeft!(ApplyRight, isImplicitlyConvertible);
alias U2 = U1!int;
enum U3 = U2!short;
static assert(U3);
})));
}

///
@safe unittest
{
Expand Down Expand Up @@ -1243,6 +1214,37 @@ private template SmartAlias(T...) {
typeof(&foo), typeof(&bar)) == SafeFunctions));
}

private template SmartAlias(T...)
{
static if (T.length == 1)
{
alias SmartAlias = Alias!T;
}
else
{
alias SmartAlias = AliasSeq!T;
}
}

@safe unittest
{
static assert(is(typeof({
alias T(T0, int a, double b, alias T1, string c) = AliasSeq!(T0, a, b, T1, c);
alias T0 = ApplyRight!(ApplyLeft, ApplyRight);
alias T1 = T0!ApplyLeft;
alias T2 = T1!T;
alias T3 = T2!(3, "foo");
alias T4 = T3!(short, 3, 3.3);
static assert(Pack!T4.equals!(short, 3, 3.3, 3, "foo"));

import std.traits : isImplicitlyConvertible;
alias U1 = ApplyLeft!(ApplyRight, isImplicitlyConvertible);
alias U2 = U1!int;
enum U3 = U2!short;
static assert(U3);
})));
}

/**
* Creates an `AliasSeq` which repeats a type or an `AliasSeq` exactly `n` times.
*/
Expand Down