104 lines
3.2 KiB
Lua
104 lines
3.2 KiB
Lua
-- Operator overloading example
|
|
---- importing ----
|
|
if string.sub(_VERSION,1,7)=='Lua 5.0' then
|
|
-- lua5.0 doesn't have a nice way to do this
|
|
lib=loadlib('example.dll','luaopen_example') or loadlib('example.so','luaopen_example')
|
|
assert(lib)()
|
|
else
|
|
-- lua 5.1 does
|
|
require('example')
|
|
end
|
|
|
|
print "ok, let's test Lua's ownership of C++ objects"
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 0)")
|
|
|
|
print "\nLet's make a couple"
|
|
a=example.Square(10)
|
|
b=example.Circle(1)
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 2)")
|
|
|
|
print "\nNote let's use the createX functions"
|
|
c=example.createCircle(5)
|
|
d=example.createSquare(3)
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 4)")
|
|
|
|
print "\nWe will run the garbage collector & see if they are till here"
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 4)")
|
|
|
|
print "\nLet's get rid of them all, collect garbage & see if they are till here"
|
|
a,b,c,d=nil,nil,nil,nil
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 0)")
|
|
|
|
print "\nLet's start putting stuff into the ShapeOwner"
|
|
print "The ShapeOwner now owns the shapes, but Lua still has pointers to them"
|
|
o=example.ShapeOwner()
|
|
a=example.Square(10)
|
|
b=example.Circle(1)
|
|
o:add(a)
|
|
o:add(b)
|
|
o:add(example.createSquare(5))
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 3)")
|
|
|
|
print "\nWe will nil our references,run the garbage collector & see if they are still here"
|
|
print "they should be, as the ShapeOwner owns them"
|
|
a,b=nil,nil
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 3)")
|
|
|
|
print "\nWe will access them and check that they are still valid"
|
|
a=o:get(0)
|
|
b=o:get(1)
|
|
print(" Area's are",a:area(),b:area(),o:get(2):area())
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 3)")
|
|
|
|
print "\nWe will remove one from the C++ owner & pass its ownership to Lua,"
|
|
print " then check that they are still unchanged"
|
|
a,b=nil,nil
|
|
a=o:remove(0) -- a now owns it
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 3)")
|
|
|
|
print "\nDelete the ShapeOwner (this should destroy two shapes),"
|
|
print " but we have one left in Lua"
|
|
o=nil
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 1)")
|
|
|
|
print "\nFinal tidy up "
|
|
a=nil
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 0)")
|
|
|
|
|
|
print "Final test, we will create some Shapes & pass them around like mad"
|
|
print "If there is any memory leak, you will see it in the memory usage"
|
|
io.flush()
|
|
sh={}
|
|
-- make some objects
|
|
for i=0,10 do
|
|
a=example.Circle(i)
|
|
b=example.Square(i)
|
|
sh[a]=true
|
|
sh[b]=true
|
|
end
|
|
o=example.ShapeOwner()
|
|
for i=0,10000 do
|
|
for k,_ in pairs(sh) do
|
|
o:add(k)
|
|
end
|
|
sh={} -- clear it
|
|
while true do
|
|
a=o:remove(0)
|
|
if a==nil then break end
|
|
sh[a]=true
|
|
end
|
|
if i%100==0 then collectgarbage() end
|
|
end
|
|
print "done"
|
|
o,sh=nil,nil
|
|
collectgarbage()
|
|
print("Currently there are",example.Shape_nshapes,"shapes (there should be 0)")
|
|
print "that's all folks!"
|