#include "testEnv.hpp" template struct Point { Point() {} Point(T X, T Y) : X(X), Y(Y) {} T X, Y; }; template struct Box { Box() {} Box(Point UpperLeft, Point LowerRight) : UpperLeft(UpperLeft), LowerRight(LowerRight) {} Point UpperLeft, LowerRight; void print(void) { scprintf(_SC("UL.X %f UL.Y %f LR.X %f LR.Y %f\n"), UpperLeft.X, UpperLeft.Y, LowerRight.X, LowerRight.Y); } }; template struct Window { int id; Box box; }; typedef Point Pointf; typedef Box Boxf; typedef Window Windowf; int constructPointf(float X, float Y, HSQUIRRELVM v) { using namespace SqPlus; return PostConstruct(v, new Pointf(X,Y), ReleaseClassPtr::release); } // Must pass by reference or pointer (not copy) int constructBoxf(Pointf &UpperLeft, Pointf &LowerRight, HSQUIRRELVM v) { using namespace SqPlus; return PostConstruct(v, new Boxf(UpperLeft, LowerRight), ReleaseClassPtr::release); } struct WindowHolder { static Windowf *currentWindow; static Windowf *getWindow(void) { return currentWindow; } }; Windowf * WindowHolder::currentWindow = 0; DECLARE_INSTANCE_TYPE(Pointf); DECLARE_INSTANCE_TYPE(Boxf); DECLARE_INSTANCE_TYPE(Windowf); SQPLUS_TEST(Test_PointBoxf) { SQPLUS_TEST_TRACE(); using namespace SqPlus; SQClassDef() .staticFunc(constructPointf, _SC("constructor")) .var(&Pointf::X, _SC("X")) .var(&Pointf::Y, _SC("Y")) ; SQClassDef() .staticFunc(constructBoxf, _SC("constructor")) .func(&Boxf::print, _SC("print")) .var(&Boxf::UpperLeft, _SC("UpperLeft")) .var(&Boxf::LowerRight, _SC("LowerRight")) ; SQClassDef() .var(&Windowf::id, _SC("Id")) .var(&Windowf::box, _SC("Box")) ; RegisterGlobal(WindowHolder::getWindow, _SC("getWindow")); Windowf myWindow; myWindow.id = 42; myWindow.box = Boxf(Pointf(1.f, 2.f), Pointf(3.f, 4.f)); WindowHolder::currentWindow = &myWindow; // The createWindow() function below creates a new instance on the // root table. The instance data is a pointer to the C/C++ // instance, and will not be freed or otherwise managed. RUN_SCRIPT(_SC("\ local MyWindow = Windowf(); \n\ MyWindow.Box = Boxf(Pointf(11., 22.), Pointf(33., 44.)); \n\ MyWindow.Box.print(); \n\ print(MyWindow.Box.LowerRight.Y); \n\ assert(MyWindow.Box.LowerRight.Y == 44.);\n\ MyWindow.Box.LowerRight.Y += 1.; \n\ local MyWindow2 = Windowf(); \n\ MyWindow2 = MyWindow; \n\ print(MyWindow2.Box.LowerRight.Y); \n\ assert(MyWindow2.Box.LowerRight.Y == 45.); \n\ local MyBox = Boxf(Pointf(10., 20.), Pointf(30., 40.)); \n\ MyBox.UpperLeft = Pointf(1000., 1000.); \n\ MyBox.UpperLeft.X = 5000. \n\ MyBox.print(); \n\ print(MyBox.UpperLeft.X) \n\ print(MyBox.UpperLeft.Y) \n\ assert(MyBox.UpperLeft.X == 5000.) \n\ assert(MyBox.UpperLeft.Y == 1000.) \n\ ") _SC(" \n\ MyWindow2.Box = MyBox; \n\ assert(MyWindow2.Box.UpperLeft.X == 5000.); \n\ assert(MyWindow2.Box.UpperLeft.Y == 1000.); \n\ assert(MyWindow2.Box.LowerRight.X == 30.); \n\ assert(MyWindow2.Box.LowerRight.Y == 40.); \n\ MyWindow2 = getWindow(); \n\ print(\"MyWindow2: \"+MyWindow2.Id); \n\ assert(MyWindow2.Id == 42); \n\ MyWindow2.Box.print(); \n\ assert(MyWindow2.Box.UpperLeft.X == 1.); \n\ assert(MyWindow2.Box.UpperLeft.Y == 2.); \n\ assert(MyWindow2.Box.LowerRight.X == 3.); \n\ assert(MyWindow2.Box.LowerRight.Y == 4.); \n\ function createWindow(name, instance) { \n\ ::rawset(name, instance); \n\ } \n\ ")); Windowf window = myWindow; window.id = 54; window.box.UpperLeft.X += 1; window.box.UpperLeft.Y += 1; window.box.LowerRight.X += 1; window.box.LowerRight.Y += 1; // Create a new Window instance "NewWindow" on the root table. SquirrelFunction(_SC("createWindow"))(_SC("NewWindow"), &window); RUN_SCRIPT(_SC("\n\ print(\"NewWindow: \"+NewWindow.Id); \n\ assert(NewWindow.Id == 54); \n\ NewWindow.Box.print(); \n\ assert(NewWindow.Box.UpperLeft.X == 2.); \n\ assert(NewWindow.Box.UpperLeft.Y == 3.); \n\ assert(NewWindow.Box.LowerRight.X == 4.); \n\ assert(NewWindow.Box.LowerRight.Y == 5.); \n\ ")); }