Files
linguist/samples/Terra/class.t
2016-01-28 11:22:27 +07:00

236 lines
3.2 KiB
Perl

IO = terralib.includec("stdio.h")
local Class = require("lib/javalike")
struct A {
a : int
}
terra A:times2() : int
return self.a*2
end
struct B {
b : int
}
Class.extends(B,A)
terra B:combine(a : int) : int
return self.b + self.a + a
end
struct C {
c : double
}
Class.extends(C,B)
terra C:combine(a : int) : int
return self.c + self.a + self.b + a
end
terra C:times2() : double
return self.a * 4
end
terra doubleAnA(a : &A)
return a:times2()
end
terra combineAB(b : &B)
return b:combine(3)
end
terra returnA(a : A)
return a
end
terra foobar1()
var c = C.alloc()
c.a,c.b,c.c = 1,2,3.5
return c:times2()
end
assert(foobar1() == 4)
terra foobar()
var a = A.alloc()
a.a = 1
var b = B.alloc()
b.a,b.b = 1,2
var c = C.alloc()
c.a,c.b,c.c = 1,2,3.5
var r = doubleAnA(a) + doubleAnA(b) + doubleAnA(c) + combineAB(b) + combineAB(c)
a:free()
b:free()
c:free()
return r
end
assert(23 == foobar())
Doubles = Class.interface { times2 = {} -> int }
Adds = Class.interface { add = int -> int }
struct D {
data : int
}
Class.implements(D,Doubles)
Class.implements(D,Adds)
terra D:times2() : int
return self.data * 2
end
terra D:add(a : int) : int
return self.data + a
end
terra aDoubles(a : &Doubles)
return a:times2()
end
terra aAdds(a : &Adds)
return a:add(3)
end
terra foobar2()
var a : D
a:init()
a.data = 3
return aDoubles(&a) + aAdds(&a)
end
assert(12 == foobar2())
local IO = terralib.includec("stdio.h")
struct Animal {
data : int
}
terra Animal:speak() : {}
IO.printf("... %d\n",self.data)
end
struct Dog {
}
Class.extends(Dog,Animal)
terra Dog:speak() : {}
IO.printf("woof! %d\n",self.data)
end
struct Cat {
}
Class.extends(Cat,Animal)
terra Cat:speak() : {}
IO.printf("meow! %d\n",self.data)
end
terra dospeak(a : &Animal)
a:speak()
end
terra barnyard()
var c : Cat
var d : Dog
c:init()
d:init()
c.data,d.data = 0,1
dospeak(&c)
dospeak(&d)
end
barnyard()
local Add = Class.interface { add = int -> int }
local Sub = Class.interface { sub = int -> int }
local struct P {
data : int
}
Class.implements(P,Add)
local struct C {
data2 : int
}
Class.extends(C,P)
Class.implements(C,Sub)
terra P:add(b : int) : int
self.data = self.data + b
return self.data
end
terra C:sub(b : int) : int
return self.data2 - b
end
terra doadd(a : &Add)
return a:add(1)
end
terra dopstuff(p : &P)
return p:add(2) + doadd(p)
end
terra dosubstuff(s : &Sub)
return s:sub(1)
end
terra dotests()
var p : P
p:init()
var c : C
c:init()
p.data = 1
c.data = 1
c.data2 = 2
return dopstuff(&p) + dopstuff(&c) + dosubstuff(&c)
end
assert(dotests() == 15)
terra timeadd(a :&P, N : int)
IO.printf("%p\n",a)
for i = 0, N,10 do
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
a:add(1)
end
return a
end
local a = global(C)
terra doinit() : &P
a:init()
a.data = 0
return &a
end
local v = doinit()
timeadd:compile()
local b = terralib.currenttimeinseconds()
--timeadd(v,100000000)
local e = terralib.currenttimeinseconds()
print(e - b)
print(v.data)