blob: 73d8d10ff04a7ab9ce5a20a7a1df356cddfdad3b [file] [log] [blame]
// https://issues.dlang.org/show_bug.cgi?id=20470
alias AliasSeq(Args...) = Args;
int g, h;
void test0()
{
static struct S
{
int a, b;
float c = 0, d = 0;
alias fields = AliasSeq!(a, b, c, d);
alias ints = AliasSeq!(a, b);
alias floats = AliasSeq!(c, d);
alias reversed = AliasSeq!(d, c, b, a);
alias globals = AliasSeq!(g, h);
alias properties = AliasSeq!(e, f);
@property int e() { return a; }
@property void e(int i) { a = i; }
@property float f() { return c; }
@property void f(float j) { c = j; }
}
S s;
assert(s.fields == AliasSeq!(0, 0, 0, 0));
s.ints = AliasSeq!(1, 2);
assert(s.fields == AliasSeq!(1, 2, 0, 0));
s.floats = AliasSeq!(3, 4);
assert(s.fields == AliasSeq!(1, 2, 3, 4));
int a, b;
float c, d;
AliasSeq!(d, c, b, a) = s.reversed;
assert(AliasSeq!(a, b, c, d) == AliasSeq!(1, 2, 3, 4));
s.globals = AliasSeq!(30, 40);
assert(g == 30 && h == 40);
// Propagating `this` to functions and properties within tuples will be a breaking change.
// See `test2()` below for an example of existing code that would need to be fixed.
//s.properties = AliasSeq!(11, 12);
//assert(s.e == 11 && s.f == 12);
}
class Nested(Vars...)
{
int a, b;
alias outervars = Vars;
alias fields = AliasSeq!(a, b);
alias all = AliasSeq!(a, b, Vars);
}
auto makeNested()
{
static class C
{
bool b;
double d;
auto nested() { return new Nested!(b, d)(); }
}
return new C().nested();
}
void test1()
{
auto n = makeNested();
n.fields = AliasSeq!(1, 2);
n.outervars = AliasSeq!(true, 1.3);
assert(n.all == AliasSeq!(1, 2, true, 1.3));
}
void test2()
{
// backwards compatibility test for functions within tuples
static struct S
{
void f();
void g();
alias funcs = AliasSeq!(f, g);
}
S s;
alias voidTf = void();
foreach (f; s.funcs)
static assert(is(typeof(f) == voidTf));
}
void main()
{
test0();
test1();
test2();
}