author | truelight |
Wed, 14 Mar 2007 20:25:43 +0000 | |
branch | noai |
changeset 9388 | 032008c3f6e3 |
parent 9387 | 4255a0a2d272 |
child 9396 | a05857491d2d |
permissions | -rw-r--r-- |
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> |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
49 |
void DefSQFunction(HSQUIRRELVM vm, Func function_proc, const char *function_name) |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
50 |
{ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
51 |
// int nparam = 1; |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
52 |
// const char *params = "x"; |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
53 |
void *ptr; |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
54 |
|
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
55 |
sq_pushstring(vm, function_name, -1); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
56 |
/* Store the real function-pointer in the user-data */ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
57 |
ptr = sq_newuserdata(vm, sizeof(function_proc)); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
58 |
memcpy(ptr, &function_proc, sizeof(function_proc)); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
59 |
sq_newclosure(vm, SQConvert::DefSQCallback<CL, Func>, 1); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
60 |
// sq_setparamscheck(vm, nparam, params); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
61 |
sq_createslot(vm, -3); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
62 |
} |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
63 |
|
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
64 |
void PreRegister(HSQUIRRELVM vm) |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
65 |
{ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
66 |
/* Prepare the new class */ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
67 |
sq_pushroottable(vm); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
68 |
sq_pushstring(vm, this->classname, -1); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
69 |
sq_newclass(vm, SQFalse); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
70 |
|
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
71 |
/* Register a constructor */ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
72 |
sq_pushstring(vm, "constructor", -1); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
73 |
sq_newclosure(vm, &DefSQClass::Constructor, 0); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
74 |
// sq_setparamscheck(vm, nparam, params); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
75 |
sq_createslot(vm, -3); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
76 |
} |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
77 |
|
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
78 |
void PostRegister(HSQUIRRELVM vm) |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
79 |
{ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
80 |
/* Create the class and all his methods */ |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
81 |
sq_createslot(vm, -3); |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
82 |
} |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
83 |
}; |
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
84 |
|
4255a0a2d272
(svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff
changeset
|
85 |
#endif /* SQUIRREL_CLASS_HPP */ |