src/squirrel_class.hpp
author truelight
Sun, 25 Mar 2007 13:55:31 +0000
branchnoai
changeset 9525 1d6c509b56ee
parent 9424 90e9aa6326f3
child 9530 5b93bc87cc5e
permissions -rw-r--r--
(svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
-Add: allow consts to be registered to an SQ class (so we can now tell about enums)
9388
032008c3f6e3 (svn r9180) [NoAI] -Fix: copy/pasting can be nasty: wrong @file headers
truelight
parents: 9387
diff changeset
     1
/* $Id$ */
032008c3f6e3 (svn r9180) [NoAI] -Fix: copy/pasting can be nasty: wrong @file headers
truelight
parents: 9387
diff changeset
     2
032008c3f6e3 (svn r9180) [NoAI] -Fix: copy/pasting can be nasty: wrong @file headers
truelight
parents: 9387
diff changeset
     3
/** @file squirrel_class.cpp defines templates for converting C++ classes to Squirrel classes */
032008c3f6e3 (svn r9180) [NoAI] -Fix: copy/pasting can be nasty: wrong @file headers
truelight
parents: 9387
diff changeset
     4
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     5
#ifndef SQUIRREL_CLASS_HPP
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     6
#define SQUIRREL_CLASS_HPP
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     7
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     8
/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     9
 * The template to define classes in Squirrel. It takes care of the creation
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    10
 *  and calling of such classes, to make the AI Layer cleaner while having a
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    11
 *  powerful script as possible AI language.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    12
 */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    13
template <class CL>
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    14
class DefSQClass {
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    15
private:
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    16
	const char *classname;
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    17
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    18
public:
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    19
	DefSQClass(const char *_classname) :
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    20
		classname(_classname)
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    21
	{}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    22
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    23
	/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    24
	 * The destructor, to delete the real instance.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    25
	 */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    26
	static SQInteger Destructor(SQUserPointer p, SQInteger size)
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    27
	{
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    28
		/* Remove the real instance too */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    29
		if (p != NULL) delete (CL *)p;
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    30
		return 0;
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    31
	}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    32
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    33
	/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    34
	 * The constructor, to create the real instance.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    35
	 */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    36
	static SQInteger Constructor(HSQUIRRELVM vm)
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    37
	{
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    38
		/* Create the real instance */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    39
		CL *instance = new CL();
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    40
		sq_setinstanceup(vm, -1, instance);
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    41
		sq_setreleasehook(vm, -1, &DefSQClass::Destructor);
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    42
		return 0;
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    43
	}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    44
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    45
	/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    46
	 * This defines a method inside a class for Squirrel.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    47
	 */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    48
	template <typename Func>
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    49
	void DefSQFunction(Squirrel *engine, Func function_proc, const char *function_name)
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    50
	{
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9388
diff changeset
    51
		engine->AddMethod(function_name, SQConvert::DefSQCallback<CL, Func>, &function_proc, sizeof(function_proc));
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    52
	}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    53
9525
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    54
	template <typename Var>
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    55
	void DefSQConst(Squirrel *engine, Var value, const char *var_name)
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    56
	{
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    57
		engine->AddConst(var_name, value);
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    58
	}
1d6c509b56ee (svn r9445) [NoAI] -Change: changed from sq_createslot to sq_newslot (first is deprecated)
truelight
parents: 9424
diff changeset
    59
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    60
	void PreRegister(Squirrel *engine)
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    61
	{
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9388
diff changeset
    62
		engine->AddClassBegin(this->classname);
9404
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
    63
	}
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
    64
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    65
	void AddConstructor(Squirrel *engine)
9404
ef9e171617a3 (svn r9201) [NoAI] -Change: make adding a default-constructor for DefSQClass optional
truelight
parents: 9396
diff changeset
    66
	{
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9388
diff changeset
    67
		engine->AddMethod("constructor", &DefSQClass::Constructor);
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    68
	}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    69
9422
33efcc5f1b09 (svn r9223) [NoAI] -Change: moved squirrel/engine.cpp to squirrel.cpp in root
truelight
parents: 9404
diff changeset
    70
	void PostRegister(Squirrel *engine)
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    71
	{
9396
a05857491d2d (svn r9188) [NoAI] -Cleanup: cleaned up DefSQClass a bit by using the SquirrelEngine
truelight
parents: 9388
diff changeset
    72
		engine->AddClassEnd();
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    73
	}
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    74
};
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    75
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    76
#endif /* SQUIRREL_CLASS_HPP */