122 lines
2.8 KiB
D
122 lines
2.8 KiB
D
// RUNNABLE_PHOBOS_TEST
|
|
import std.stdio;
|
|
|
|
struct S {
|
|
int x = 3;
|
|
void fun(T)(T x) { writefln("S.fun(%s)(%s)",typeid(T),x); this.x += x; }
|
|
}
|
|
|
|
class Tst(TST, int v = 2) {
|
|
int x = 3;
|
|
int z = 4;
|
|
|
|
final private void proc(int x) { writefln("proc(%s) -> %s",x,this.x); }
|
|
void fun(T)(T x) { writefln("fun(%s)(%s) -> %s",typeid(T),x,this.x);}
|
|
void fun()() { writefln("fun()() -> %s",this.x); }
|
|
void fun2()() { writefln("fun2"); }
|
|
|
|
class Inner {
|
|
int y = 99;
|
|
Tst outer;
|
|
void f3() { z = 55; }
|
|
// Make sure the correct this-ptr is used
|
|
void f1() { writefln("Inner.f1"); proc(-11); outer.proc(-11); }
|
|
void f2() { writefln("Inner.f2"); fun(-17); outer.fun(-17); }
|
|
}
|
|
Inner inner;
|
|
|
|
this() {
|
|
inner = new Inner;
|
|
inner.outer = this;
|
|
}
|
|
|
|
void callInnerf1() { writefln("callInnerf1"); inner.f1(); }
|
|
void callInnerf2() { writefln("callInnerf2"); inner.f2(); }
|
|
|
|
|
|
//
|
|
void opAdd(T)(T x) { this.x += x; writefln("opAdd(%s)",x); }
|
|
void opPos()() { writefln("opPos()"); }
|
|
//void opPos() { writefln("xxx"); }
|
|
void opIndex(T)(T x) { writefln("opIndex[%s]",x); }
|
|
|
|
void opIndex(A,B,C)(A a, B b, C c) {
|
|
writefln("opIndex[(%s)%s,(%s)%s,(%s)%s]",typeid(A),a,
|
|
typeid(B),b,typeid(C),c);
|
|
}
|
|
|
|
|
|
static if (v > 1) {
|
|
void opCall(A = int, B = float)(A a = 1, B b = 8.2) { writefln("opCall(%s,%s)",a,b); this.x++; }
|
|
|
|
}
|
|
void opSlice(A,B)(A a, B b) { writefln("opSlice(%s,%s)",a,b); }
|
|
void opSlice()() { writefln("opSlice()"); }
|
|
|
|
void opIndexAssign(A,B)(A a, B b) {
|
|
writefln("opIndexAssign((%s)%s,(%s)%s)",typeid(A),a,typeid(B),b);
|
|
}
|
|
|
|
void opSliceAssign(A,B,C)(A a, B b, C c) {
|
|
writefln("opSliceAssign(%s,%s,%s)",a,b,c);
|
|
}
|
|
|
|
bool opEquals(A)(A x) { writefln("opEquals((%s))",typeid(A));return true; }
|
|
|
|
int opApply(T)(int delegate(ref T)dg) {
|
|
for (int i = 0; i < 5; i++) {
|
|
T d = cast(T)(i+0.1);
|
|
if (auto result = dg(d))
|
|
return result;
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
class Y : Tst!(float) {}
|
|
|
|
void main() {
|
|
Tst!(int) t = new Tst!(int);
|
|
Y u = new Y;
|
|
S s;
|
|
t.x = 7;
|
|
t.proc(5);
|
|
t.fun(5);
|
|
t.fun();
|
|
t.callInnerf1();
|
|
t.callInnerf2();
|
|
u.fun(5);
|
|
u.fun();
|
|
u.callInnerf1();
|
|
u.callInnerf2();
|
|
s.fun(5);
|
|
t.fun2();
|
|
|
|
+t;
|
|
t+5;
|
|
t[55];
|
|
t[1,2,3.0];
|
|
u[1,2,3.0];
|
|
t(1,2.5);
|
|
t(2);
|
|
t();
|
|
t[];
|
|
t[1..2];
|
|
u[1..2.5];
|
|
t[1i] = 5;
|
|
t[-4.5..7i] = "hello";
|
|
t == t;
|
|
auto b = t != t; // without assignment -> "! has no effect in expression"
|
|
t == u;
|
|
u == t;
|
|
u == u;
|
|
b = u != u;
|
|
foreach(int i;t) {
|
|
writefln("%s",i);
|
|
}
|
|
foreach(double i;t) {
|
|
writefln("%s",i);
|
|
}
|
|
|
|
}
|