-- This file illustrates the proxy class C++ interface generated by SWIG.
require("example")

-- ----- Object creation -----
print("Creating some objects:")
local cc = example.Circle(10)
local c = example.ShapePtr(cc)
print("    Created circles", c)
local ss = example.Square(10)
local s = example.ShapePtr(ss)
print("    Created square", s)

-- ----- Access a static member -----
print(string.format("\nA total of %d shapes were created", example.Shape.nshapes))

-- ----- Member data access -----

-- Set the location of the object
c.x = 20
c.y = 30

s.x = -10
s.y = 5

print("\nHere is their current position:")
print(string.format("    Circle = (%f, %f)", c.x, c.y))
print(string.format("    Square = (%f, %f)", s.x, s.y))

-- ----- Call some methods -----
print("\nHere are some properties of the shapes:")
for _, o in ipairs({c, s}) do
    print("    ", o)
    print("        area      =", o:area())
    print("        perimeter =", o:perimeter())
end

print("\nGuess I'll clean up now")

c=nil
s=nil
cc=nil
ss=nil
-- Note: this invokes the virtual destructors
collectgarbage() -- performs a full garbage-collection cycle.

print(string.format("%d shapes remain", example.Shape.nshapes))
print("Goodbye")
