src/squirrel_helper.hpp
author rubidium
Sun, 22 Jun 2008 21:41:03 +0000
branchnoai
changeset 11053 d8d48e076a3f
parent 11044 097ea3e7ec56
permissions -rw-r--r--
(svn r13610) [NoAI] -Add: AIDepotList giving you a list of the locations of your depots (including hangars).
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     1
/* $Id$ */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     2
9424
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
     3
/** @file squirrel_helper.hpp declarations and parts of the implementation of the class for convert code */
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
     4
9424
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
     5
#ifndef SQUIRREL_HELPER_HPP
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
     6
#define SQUIRREL_HELPER_HPP
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
     7
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
     8
#include <squirrel.h>
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
     9
#include "core/math_func.hpp"
11044
097ea3e7ec56 (svn r13600) [NoAI] -Sync: with trunk r13508:13599.
rubidium
parents: 11002
diff changeset
    10
#include "core/smallvec_type.hpp"
9723
eee46cb39750 (svn r11796) [NoAI] -Sync: with trunk r11502:11795.
rubidium
parents: 9722
diff changeset
    11
#include "economy_type.h"
10992
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
    12
#include "squirrel_helper_type.hpp"
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    13
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    14
/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    15
 * The Squirrel convert routines
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    16
 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    17
namespace SQConvert {
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    18
	/**
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    19
	 * Pointers assigned to this class will be free'd when this instance
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    20
	 *  comes out of scope. Useful to make sure you can use strdup(),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    21
	 *  without leaking memory.
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    22
	 */
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    23
	struct SQAutoFreePointers : SmallVector<void *, 1> {
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    24
		~SQAutoFreePointers()
10722
6ea1daff57aa (svn r13272) [NoAI] -Codechange: strdup all parameter strings coming from Squirrel going into the API after the possible WChar* -> char* conversion and free them after return.
rubidium
parents: 9813
diff changeset
    25
		{
6ea1daff57aa (svn r13272) [NoAI] -Codechange: strdup all parameter strings coming from Squirrel going into the API after the possible WChar* -> char* conversion and free them after return.
rubidium
parents: 9813
diff changeset
    26
			for (uint i = 0; i < this->items; i++) free(this->data[i]);
6ea1daff57aa (svn r13272) [NoAI] -Codechange: strdup all parameter strings coming from Squirrel going into the API after the possible WChar* -> char* conversion and free them after return.
rubidium
parents: 9813
diff changeset
    27
		}
6ea1daff57aa (svn r13272) [NoAI] -Codechange: strdup all parameter strings coming from Squirrel going into the API after the possible WChar* -> char* conversion and free them after return.
rubidium
parents: 9813
diff changeset
    28
	};
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    29
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    30
	template <bool Y> struct YesT {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    31
		static const bool Yes = Y;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    32
		static const bool No = !Y;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    33
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    34
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    35
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    36
	 * Helper class to recognize if the given type is void. Usage: 'IsVoidT<T>::Yes'
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    37
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    38
	template <typename T> struct IsVoidT : YesT<false> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    39
	template <> struct IsVoidT<void> : YesT<true> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    40
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    41
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    42
	 * Helper class to recognize if the function/method return type is void.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    43
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    44
	template <typename Tfunc> struct HasVoidReturnT;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    45
	/* functions */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    46
	template <typename Tretval> struct HasVoidReturnT<Tretval (*)()> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    47
	template <typename Tretval, typename Targ1> struct HasVoidReturnT<Tretval (*)(Targ1)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    48
	template <typename Tretval, typename Targ1, typename Targ2> struct HasVoidReturnT<Tretval (*)(Targ1, Targ2)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    49
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3> struct HasVoidReturnT<Tretval (*)(Targ1, Targ2, Targ3)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    50
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4> struct HasVoidReturnT<Tretval (*)(Targ1, Targ2, Targ3, Targ4)> : IsVoidT<Tretval> {};
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
    51
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5> struct HasVoidReturnT<Tretval (*)(Targ1, Targ2, Targ3, Targ4, Targ5)> : IsVoidT<Tretval> {};
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    52
	/* methods */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    53
	template <class Tcls, typename Tretval> struct HasVoidReturnT<Tretval (Tcls::*)()> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    54
	template <class Tcls, typename Tretval, typename Targ1> struct HasVoidReturnT<Tretval (Tcls::*)(Targ1)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    55
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2> struct HasVoidReturnT<Tretval (Tcls::*)(Targ1, Targ2)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    56
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3> struct HasVoidReturnT<Tretval (Tcls::*)(Targ1, Targ2, Targ3)> : IsVoidT<Tretval> {};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    57
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4> struct HasVoidReturnT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4)> : IsVoidT<Tretval> {};
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
    58
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5> struct HasVoidReturnT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4, Targ5)> : IsVoidT<Tretval> {};
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    59
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    60
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    61
	/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    62
	 * Special class to make it possible for the compiler to pick the correct GetParam().
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
	template <typename T> class ForceType { };
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
	/**
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    67
	 * To return a value to squirrel, we call this function. It converts to the right format.
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
	template <typename T> static int Return(HSQUIRRELVM vm, T t);
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    70
9532
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    71
	template <> inline int Return<uint8>       (HSQUIRRELVM vm, uint8 res)       { sq_pushinteger(vm, (int32)res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    72
	template <> inline int Return<uint16>      (HSQUIRRELVM vm, uint16 res)      { sq_pushinteger(vm, (int32)res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    73
	template <> inline int Return<uint32>      (HSQUIRRELVM vm, uint32 res)      { sq_pushinteger(vm, (int32)res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    74
	template <> inline int Return<int8>        (HSQUIRRELVM vm, int8 res)        { sq_pushinteger(vm, res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    75
	template <> inline int Return<int16>       (HSQUIRRELVM vm, int16 res)       { sq_pushinteger(vm, res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    76
	template <> inline int Return<int32>       (HSQUIRRELVM vm, int32 res)       { sq_pushinteger(vm, res); return 1; }
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents: 9609
diff changeset
    77
	template <> inline int Return<int64>       (HSQUIRRELVM vm, int64 res)       { sq_pushinteger(vm, ClampToI32(res)); return 1; }
9722
ebf0ece7d8f6 (svn r11503) [NoAI] -Sync: with trunk r11308:11502.
rubidium
parents: 9679
diff changeset
    78
	template <> inline int Return<Money>       (HSQUIRRELVM vm, Money res)       { sq_pushinteger(vm, ClampToI32(res)); return 1; }
9532
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    79
	template <> inline int Return<bool>        (HSQUIRRELVM vm, bool res)        { sq_pushbool   (vm, res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    80
	template <> inline int Return<char *>      (HSQUIRRELVM vm, char *res)       { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); free(res); return 1; }
539c48d64eea (svn r9453) [NoAI] -Codechange: make a difference between static and non-static methods in the squirrel export script.
rubidium
parents: 9531
diff changeset
    81
	template <> inline int Return<const char *>(HSQUIRRELVM vm, const char *res) { if (res == NULL) sq_pushnull(vm); else sq_pushstring (vm, OTTD2FS(res), strlen(res)); return 1; }
9651
6e2860c67455 (svn r10551) [NoAI] -Add: added SQ support for "void *"
truelight
parents: 9635
diff changeset
    82
	template <> inline int Return<void *>      (HSQUIRRELVM vm, void *res)       { sq_pushuserpointer(vm, res); return 1; }
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
    83
9387
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
	 * To get a param from squirrel, we call this function. It converts to the right format.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    86
	 */
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    87
	template <typename T> static T GetParam(ForceType<T>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr);
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    88
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    89
	template <> inline uint8       GetParam(ForceType<uint8>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    90
	template <> inline uint16      GetParam(ForceType<uint16>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    91
	template <> inline uint32      GetParam(ForceType<uint32>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    92
	template <> inline int8        GetParam(ForceType<int8>        , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    93
	template <> inline int16       GetParam(ForceType<int16>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    94
	template <> inline int32       GetParam(ForceType<int32>       , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger     tmp; sq_getinteger    (vm, index, &tmp); return tmp; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    95
	template <> inline bool        GetParam(ForceType<bool>        , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQBool        tmp; sq_getbool       (vm, index, &tmp); return tmp != 0; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    96
	template <> inline const char *GetParam(ForceType<const char *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { const SQChar *tmp; sq_getstring     (vm, index, &tmp); char *tmp_str = strdup(FS2OTTD(tmp)); *ptr->Append() = (void *)tmp_str; return tmp_str; }
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
    97
	template <> inline void       *GetParam(ForceType<void *>      , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer tmp; sq_getuserpointer(vm, index, &tmp); return tmp; }
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
    98
10992
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
    99
	template <> inline Array      *GetParam(ForceType<Array *>,      HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr)
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   100
	{
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   101
		SQObject obj;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   102
		sq_getstackobj(vm, index, &obj);
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   103
		sq_pushobject(vm, obj);
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   104
		sq_pushnull(vm);
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   105
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   106
		SmallVector<int32, 2> data;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   107
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   108
		while (SQ_SUCCEEDED(sq_next(vm, -2))) {
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   109
			SQInteger tmp;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   110
			if (SQ_SUCCEEDED(sq_getinteger(vm, -1, &tmp))) {
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   111
				*data.Append() = (int32)tmp;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   112
			} else {
11002
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   113
				sq_pop(vm, 4);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   114
				throw sq_throwerror(vm, _SC("a member of an array used as parameter to a function is not numeric"));
10992
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   115
			}
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   116
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   117
			sq_pop(vm, 2);
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   118
		}
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   119
		sq_pop(vm, 2);
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   120
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   121
		Array *arr = (Array*)MallocT<byte>(sizeof(Array) + sizeof(int32) * data.Length());
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   122
		arr->size = data.Length();
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   123
		memcpy(arr->array, data.Begin(), sizeof(int32) * data.Length());
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   124
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   125
		*ptr->Append() = arr;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   126
		return arr;
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   127
	}
4dd4f4327c3a (svn r13546) [NoAI] -Codechange: add support to pass arrays with integers to C++ functions.
rubidium
parents: 10734
diff changeset
   128
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   129
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   130
	* Helper class to recognize the function type (retval type, args) and use the proper specialization
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   131
	* for SQ callback. The partial specializations for the second arg (Tis_void_retval) are not possible
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   132
	* on the function. Therefore the class is used instead.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   133
	*/
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   134
	template <typename Tfunc, bool Tis_void_retval = HasVoidReturnT<Tfunc>::Yes> struct HelperT;
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   135
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   136
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   137
	 * The real C++ caller for function with return value and 0 params.
9437
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   138
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   139
	template <typename Tretval>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   140
	struct HelperT<Tretval (*)(), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   141
		static int SQCall(void *instance, Tretval (*func)(), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   142
		{
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   143
			return Return(vm, (*func)());
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   144
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   145
	};
9437
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   146
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   147
	/**
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   148
	 * The real C++ caller for function with no return value and 0 params.
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   149
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   150
	template <typename Tretval>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   151
	struct HelperT<Tretval (*)(), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   152
		static int SQCall(void *instance, Tretval (*func)(), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   153
		{
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   154
			(*func)();
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   155
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   156
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   157
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   158
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   159
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   160
	 * The real C++ caller for method with return value and 0 params.
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   161
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   162
	template <class Tcls, typename Tretval>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   163
	struct HelperT<Tretval (Tcls::*)(), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   164
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   165
		{
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   166
			return Return(vm, (instance->*func)());
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   167
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   168
	};
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   169
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   170
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   171
	 * The real C++ caller for method with no return value and 0 params.
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   172
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   173
	template <class Tcls, typename Tretval>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   174
	struct HelperT<Tretval (Tcls::*)(), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   175
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   176
		{
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   177
			(instance->*func)();
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   178
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   179
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   180
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   181
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(), HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   182
		{
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   183
			return new Tcls();
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   184
		}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   185
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   186
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   187
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   188
	 * The real C++ caller for function with return value and 1 param.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   189
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   190
	template <typename Tretval, typename Targ1>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   191
	struct HelperT<Tretval (*)(Targ1), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   192
		static int SQCall(void *instance, Tretval (*func)(Targ1), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   193
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   194
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   195
			Tretval ret = (*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   196
				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   197
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   198
			sq_pop(vm, 1);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   199
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   200
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   201
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   202
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   203
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   204
	 * The real C++ caller for function with no return value and 1 param.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   205
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   206
	template <typename Tretval, typename Targ1>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   207
	struct HelperT<Tretval (*)(Targ1), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   208
		static int SQCall(void *instance, Tretval (*func)(Targ1), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   209
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   210
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   211
			(*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   212
				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   213
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   214
			sq_pop(vm, 1);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   215
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   216
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   217
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   218
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   219
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   220
	 * The real C++ caller for method with return value and 1 param.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   221
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   222
	template <class Tcls, typename Tretval, typename Targ1>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   223
	struct HelperT<Tretval (Tcls::*)(Targ1), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   224
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   225
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   226
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   227
			Tretval ret = (instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   228
				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   229
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   230
			sq_pop(vm, 1);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   231
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   232
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   233
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   234
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   235
	/**
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   236
	 * The real C++ caller for method with no return value and 1 param.
9437
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   237
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   238
	template <class Tcls, typename Tretval, typename Targ1>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   239
	struct HelperT<Tretval (Tcls::*)(Targ1), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   240
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   241
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   242
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   243
			(instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   244
				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   245
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   246
			sq_pop(vm, 1);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   247
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   248
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   249
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   250
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1), HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   251
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   252
			SQAutoFreePointers ptr;
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   253
			Tcls *inst = new Tcls(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   254
				GetParam(ForceType<Targ1>(), vm, 2, &ptr)
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   255
			);
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   256
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   257
			return inst;
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   258
		}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   259
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   260
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   261
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   262
	 * The real C++ caller for function with return value and 2 params.
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   263
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   264
	template <typename Tretval, typename Targ1, typename Targ2>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   265
	struct HelperT<Tretval (*)(Targ1, Targ2), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   266
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   267
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   268
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   269
			Tretval ret = (*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   270
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   271
				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   272
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   273
			sq_pop(vm, 2);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   274
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   275
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   276
	};
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   277
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   278
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   279
	 * The real C++ caller for function with no return value and 2 params.
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   280
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   281
	template <typename Tretval, typename Targ1, typename Targ2>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   282
	struct HelperT<Tretval (*)(Targ1, Targ2), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   283
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   284
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   285
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   286
			(*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   287
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   288
				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   289
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   290
			sq_pop(vm, 2);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   291
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   292
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   293
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   294
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   295
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   296
	 * The real C++ caller for method with return value and 2 params.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   297
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   298
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   299
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   300
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   301
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   302
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   303
			Tretval ret = (instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   304
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   305
				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   306
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   307
			sq_pop(vm, 2);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   308
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   309
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   310
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   311
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   312
	/**
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   313
	 * The real C++ caller for method with no return value and 2 params.
9437
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   314
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   315
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   316
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   317
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   318
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   319
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   320
			(instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   321
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   322
				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   323
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   324
			sq_pop(vm, 2);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   325
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   326
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   327
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   328
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2), HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   329
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   330
			SQAutoFreePointers ptr;
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   331
			Tcls *inst = new Tcls(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   332
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   333
				GetParam(ForceType<Targ2>(), vm, 3, &ptr)
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   334
			);
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   335
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   336
			return inst;
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   337
		}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   338
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   339
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   340
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   341
	 * The real C++ caller for function with return value and 3 params.
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   342
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   343
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   344
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   345
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   346
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   347
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   348
			Tretval ret = (*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   349
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   350
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   351
				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   352
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   353
			sq_pop(vm, 3);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   354
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   355
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   356
	};
9437
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   357
28e0105114a4 (svn r9248) [NoAI] -Add: added templates for void func() to SQ functions
truelight
parents: 9434
diff changeset
   358
	/**
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   359
	 * The real C++ caller for function with no return value and 3 params.
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   360
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   361
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   362
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   363
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   364
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   365
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   366
			(*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   367
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   368
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   369
				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   370
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   371
			sq_pop(vm, 3);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   372
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   373
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   374
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   375
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   376
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   377
	 * The real C++ caller for method with return value and 3 params.
9480
d071f885f918 (svn r9329) [NoAI] -Fix: add AIRoad() for Squirrel
truelight
parents: 9437
diff changeset
   378
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   379
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   380
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   381
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   382
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   383
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   384
			Tretval ret = (instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   385
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   386
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   387
				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   388
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   389
			sq_pop(vm, 3);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   390
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   391
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   392
	};
9480
d071f885f918 (svn r9329) [NoAI] -Fix: add AIRoad() for Squirrel
truelight
parents: 9437
diff changeset
   393
d071f885f918 (svn r9329) [NoAI] -Fix: add AIRoad() for Squirrel
truelight
parents: 9437
diff changeset
   394
	/**
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   395
	 * The real C++ caller for method with no return value and 3 params.
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   396
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   397
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   398
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   399
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   400
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   401
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   402
			(instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   403
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   404
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   405
				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   406
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   407
			sq_pop(vm, 3);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   408
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   409
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   410
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   411
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3), HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   412
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   413
			SQAutoFreePointers ptr;
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   414
			Tcls *inst = new Tcls(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   415
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   416
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   417
				GetParam(ForceType<Targ3>(), vm, 4, &ptr)
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   418
			);
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   419
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   420
			return inst;
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   421
		}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   422
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   423
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   424
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   425
	 * The real C++ caller for function with return value and 4 params.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   426
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   427
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   428
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   429
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   430
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   431
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   432
			Tretval ret = (*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   433
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   434
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   435
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   436
				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   437
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   438
			sq_pop(vm, 4);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   439
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   440
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   441
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   442
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   443
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   444
	 * The real C++ caller for function with no return value and 4 params.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   445
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   446
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   447
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   448
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   449
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   450
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   451
			(*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   452
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   453
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   454
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   455
				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   456
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   457
			sq_pop(vm, 4);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   458
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   459
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   460
	};
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   461
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   462
	/**
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   463
	 * The real C++ caller for method with return value and 4 params.
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   464
	 */
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   465
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   466
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4), false> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   467
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   468
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   469
			SQAutoFreePointers ptr;
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   470
			Tretval ret = (instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   471
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   472
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   473
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   474
				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   475
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   476
			sq_pop(vm, 4);
9656
ddb4260f3051 (svn r10558) [NoAI] -Fix: don't use free'd memory (tnx glx for tracing!!)
truelight
parents: 9651
diff changeset
   477
			return Return(vm, ret);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   478
		}
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   479
	};
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   480
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   481
	/**
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   482
	 * The real C++ caller for method with no return value and 4 params.
9480
d071f885f918 (svn r9329) [NoAI] -Fix: add AIRoad() for Squirrel
truelight
parents: 9437
diff changeset
   483
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   484
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4>
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   485
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4), true> {
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   486
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   487
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   488
			SQAutoFreePointers ptr;
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   489
			(instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   490
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   491
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   492
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   493
				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   494
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   495
			sq_pop(vm, 4);
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   496
			return 0;
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   497
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   498
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   499
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4), HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   500
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   501
			SQAutoFreePointers ptr;
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   502
			Tcls *inst = new Tcls(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   503
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   504
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   505
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   506
				GetParam(ForceType<Targ4>(), vm, 5, &ptr)
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   507
			);
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   508
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   509
			return inst;
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   510
		}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   511
	};
9480
d071f885f918 (svn r9329) [NoAI] -Fix: add AIRoad() for Squirrel
truelight
parents: 9437
diff changeset
   512
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   513
	/**
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   514
	 * The real C++ caller for function with return value and 5 params.
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   515
	 */
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   516
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5>
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   517
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4, Targ5), false> {
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   518
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   519
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   520
			SQAutoFreePointers ptr;
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   521
			Tretval ret = (*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   522
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   523
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   524
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   525
				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   526
				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   527
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   528
			sq_pop(vm, 5);
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   529
			return Return(vm, ret);
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   530
		}
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   531
	};
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   532
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   533
	/**
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   534
	 * The real C++ caller for function with no return value and 5 params.
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   535
	 */
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   536
	template <typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5>
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   537
	struct HelperT<Tretval (*)(Targ1, Targ2, Targ3, Targ4, Targ5), true> {
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   538
		static int SQCall(void *instance, Tretval (*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   539
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   540
			SQAutoFreePointers ptr;
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   541
			(*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   542
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   543
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   544
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   545
				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   546
				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   547
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   548
			sq_pop(vm, 5);
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   549
			return 0;
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   550
		}
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   551
	};
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   552
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   553
	/**
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   554
	 * The real C++ caller for method with return value and 5 params.
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   555
	 */
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   556
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5>
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   557
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4, Targ5), false> {
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   558
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   559
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   560
			SQAutoFreePointers ptr;
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   561
			Tretval ret = (instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   562
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   563
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   564
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   565
				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   566
				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   567
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   568
			sq_pop(vm, 5);
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   569
			return Return(vm, ret);
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   570
		}
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   571
	};
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   572
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   573
	/**
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   574
	 * The real C++ caller for method with no return value and 5 params.
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   575
	 */
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   576
	template <class Tcls, typename Tretval, typename Targ1, typename Targ2, typename Targ3, typename Targ4, typename Targ5>
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   577
	struct HelperT<Tretval (Tcls::*)(Targ1, Targ2, Targ3, Targ4, Targ5), true> {
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   578
		static int SQCall(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   579
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   580
			SQAutoFreePointers ptr;
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   581
			(instance->*func)(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   582
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   583
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   584
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   585
				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   586
				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   587
			);
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   588
			sq_pop(vm, 5);
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   589
			return 0;
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   590
		}
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   591
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   592
		static Tcls *SQConstruct(Tcls *instance, Tretval (Tcls::*func)(Targ1, Targ2, Targ3, Targ4, Targ5), HSQUIRRELVM vm)
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   593
		{
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   594
			SQAutoFreePointers ptr;
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   595
			Tcls *inst = new Tcls(
10734
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   596
				GetParam(ForceType<Targ1>(), vm, 2, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   597
				GetParam(ForceType<Targ2>(), vm, 3, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   598
				GetParam(ForceType<Targ3>(), vm, 4, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   599
				GetParam(ForceType<Targ4>(), vm, 5, &ptr),
06f95974ac15 (svn r13284) [NoAI] -Change r13272: make the auto-free-pointers much more general, so in the future we can use it for other things, and not limited to strings
truebrain
parents: 10722
diff changeset
   600
				GetParam(ForceType<Targ5>(), vm, 6, &ptr)
9658
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   601
			);
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   602
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   603
			return inst;
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   604
		}
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   605
	};
e7675771bca4 (svn r10565) [NoAI] -Add: allow giving width, height and radius to check for cargo acceptance
truelight
parents: 9656
diff changeset
   606
9490
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   607
999eb7531205 (svn r9360) [NoAI] -Add: class-functions can now be static and still be added to SQ. There they behave as they are non-static, which is fine for that level of coding.
truelight
parents: 9480
diff changeset
   608
	/**
9530
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   609
	 * A general template for all non-static method callbacks from Squirrel.
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   610
	 *  In here the function_proc is recovered, and the SQCall is called that
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   611
	 *  can handle this exact amount of params.
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   612
	 */
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   613
	template <typename Tcls, typename Tmethod>
9530
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   614
	inline SQInteger DefSQNonStaticCallback(HSQUIRRELVM vm)
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   615
	{
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   616
		/* Find the amount of params we got */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   617
		int nparam = sq_gettop(vm);
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   618
		SQUserPointer ptr = NULL;
9529
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   619
		SQUserPointer real_instance = NULL;
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   620
		HSQOBJECT instance;
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   621
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   622
		/* Get the 'SQ' instance of this class */
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   623
		Squirrel::GetInstance(vm, &instance);
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   624
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   625
		/* Protect against calls to a non-static method in a static way */
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   626
		sq_pushroottable(vm);
9531
6a2e35738593 (svn r9452) [NoAI] -Fix r9450: compilation with _UNICODE was broken
glx
parents: 9530
diff changeset
   627
		sq_pushstring(vm, OTTD2FS(Tcls::GetClassName()), -1);
9529
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   628
		sq_get(vm, -2);
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   629
		sq_pushobject(vm, instance);
9531
6a2e35738593 (svn r9452) [NoAI] -Fix r9450: compilation with _UNICODE was broken
glx
parents: 9530
diff changeset
   630
		if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, _SC("class method is non-static"));
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   631
		sq_pop(vm, 3);
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   632
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   633
		/* Get the 'real' instance of this class */
9529
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   634
		sq_getinstanceup(vm, 1, &real_instance, 0);
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   635
		/* Get the real function pointer */
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   636
		sq_getuserdata(vm, nparam, &ptr, 0);
9635
9ee82e091af7 (svn r10526) [NoAI] -Fix: a class with params for the constructor lost his instance when called from SQ (templates can be really useful ;))
truelight
parents: 9629
diff changeset
   637
		if (real_instance == NULL) return sq_throwerror(vm, _SC("couldn't detect real instance of class for non-static call"));
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   638
		/* Remove the userdata from the stack */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   639
		sq_pop(vm, 1);
9529
5f26f4bc574b (svn r9450) [NoAI] -Fix: don't allow static-method calls from SQ to non-static functions
truelight
parents: 9510
diff changeset
   640
11002
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   641
		try {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   642
			/* Delegate it to a template that can handle this specific function */
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   643
			return HelperT<Tmethod>::SQCall((Tcls *)real_instance, *(Tmethod *)ptr, vm);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   644
		} catch (SQInteger e) {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   645
			sq_pop(vm, nparam);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   646
			return e;
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   647
		}
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   648
	}
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   649
9530
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   650
	/**
9813
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   651
	 * A general template for all non-static advanced method callbacks from Squirrel.
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   652
	 *  In here the function_proc is recovered, and the SQCall is called that
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   653
	 *  can handle this exact amount of params.
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   654
	 */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   655
	template <typename Tcls, typename Tmethod>
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   656
	inline SQInteger DefSQAdvancedNonStaticCallback(HSQUIRRELVM vm)
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   657
	{
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   658
		/* Find the amount of params we got */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   659
		int nparam = sq_gettop(vm);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   660
		SQUserPointer ptr = NULL;
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   661
		SQUserPointer real_instance = NULL;
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   662
		HSQOBJECT instance;
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   663
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   664
		/* Get the 'SQ' instance of this class */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   665
		Squirrel::GetInstance(vm, &instance);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   666
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   667
		/* Protect against calls to a non-static method in a static way */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   668
		sq_pushroottable(vm);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   669
		sq_pushstring(vm, OTTD2FS(Tcls::GetClassName()), -1);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   670
		sq_get(vm, -2);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   671
		sq_pushobject(vm, instance);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   672
		if (sq_instanceof(vm) != SQTrue) return sq_throwerror(vm, _SC("class method is non-static"));
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   673
		sq_pop(vm, 3);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   674
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   675
		/* Get the 'real' instance of this class */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   676
		sq_getinstanceup(vm, 1, &real_instance, 0);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   677
		/* Get the real function pointer */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   678
		sq_getuserdata(vm, nparam, &ptr, 0);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   679
		if (real_instance == NULL) return sq_throwerror(vm, _SC("couldn't detect real instance of class for non-static call"));
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   680
		/* Remove the userdata from the stack */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   681
		sq_pop(vm, 1);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   682
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   683
		/* Call the function, which its only param is always the VM */
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   684
		return (SQInteger)(((Tcls *)real_instance)->*(*(Tmethod *)ptr))(vm);
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   685
	}
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   686
9646f7e37c31 (svn r12409) [NoAI] -Add: allow an AdvancedMethod which gives you complete control over the param handling from a call from SQ
truebrain
parents: 9723
diff changeset
   687
	/**
9530
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   688
	 * A general template for all function/static method callbacks from Squirrel.
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   689
	 *  In here the function_proc is recovered, and the SQCall is called that
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   690
	 *  can handle this exact amount of params.
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   691
	 */
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   692
	template <typename Tcls, typename Tmethod>
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   693
	inline SQInteger DefSQStaticCallback(HSQUIRRELVM vm)
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   694
	{
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   695
		/* Find the amount of params we got */
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   696
		int nparam = sq_gettop(vm);
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   697
		SQUserPointer ptr = NULL;
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   698
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   699
		/* Get the real function pointer */
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   700
		sq_getuserdata(vm, nparam, &ptr, 0);
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   701
11002
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   702
		try {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   703
			/* Delegate it to a template that can handle this specific function */
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   704
			return HelperT<Tmethod>::SQCall((Tcls *)NULL, *(Tmethod *)ptr, vm);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   705
		} catch (SQInteger e) {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   706
			sq_pop(vm, nparam);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   707
			return e;
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   708
		}
9530
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   709
	}
5b93bc87cc5e (svn r9451) [NoAI] -Add: allow static and non-static members for SQ
truelight
parents: 9529
diff changeset
   710
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   711
	/**
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   712
	 * A general template for the destructor of SQ instances. This is needed
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   713
	 *  here as it has to be in the same scope as DefSQConstructorCallback.
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   714
	 */
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   715
	template <typename Tcls>
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   716
	static SQInteger DefSQDestructorCallback(SQUserPointer p, SQInteger size)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   717
	{
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   718
		/* Remove the real instance too */
9679
788e083db48b (svn r10625) [NoAI] -Fix: returning C++ classes, by creating a temp SQ class, had its problems, this should fix them all (double-frees, wrong scope, ..)
truelight
parents: 9658
diff changeset
   719
		if (p != NULL) ((Tcls *)p)->Release();
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   720
		return 0;
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   721
	}
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   722
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   723
	/**
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   724
	 * A general template to handle creating of instance with any amount of
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   725
	 *  params. It creates the instance in C++, and it sets all the needed
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   726
	 *  settings in SQ to register the instance.
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   727
	 */
9635
9ee82e091af7 (svn r10526) [NoAI] -Fix: a class with params for the constructor lost his instance when called from SQ (templates can be really useful ;))
truelight
parents: 9629
diff changeset
   728
	template <typename Tcls, typename Tmethod, int Tnparam>
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   729
	inline SQInteger DefSQConstructorCallback(HSQUIRRELVM vm)
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   730
	{
11002
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   731
		/* Find the amount of params we got */
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   732
		int nparam = sq_gettop(vm);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   733
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   734
		try {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   735
			/* Create the real instance */
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   736
			Tcls *instance = HelperT<Tmethod>::SQConstruct((Tcls *)NULL, (Tmethod)NULL, vm);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   737
			sq_setinstanceup(vm, -Tnparam, instance);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   738
			sq_setreleasehook(vm, -Tnparam, DefSQDestructorCallback<Tcls>);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   739
			instance->AddRef();
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   740
			return 0;
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   741
		} catch (SQInteger e) {
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   742
			sq_pop(vm, nparam);
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   743
			return e;
3a11ba88eb7c (svn r13558) [NoAI] -Codechange: generate an error when you pass a wrong typed value via an array meant for integers to the (C++) API.
rubidium
parents: 10992
diff changeset
   744
		}
9609
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   745
	}
f0dbf5850145 (svn r9767) [NoAI] -Add: add support for params in the constructor (via C++ templates)
truelight
parents: 9608
diff changeset
   746
9510
261d33fbabb8 (svn r9406) [NoAI] -Fix: made the detection of 'void' against 'non-void' functions for the class->SQ convertor via templates (as MSVC failed to understand the other method) (KUDr)
truelight
parents: 9499
diff changeset
   747
}; // namespace SQConvert
9387
4255a0a2d272 (svn r9179) [NoAI] -Add: added templates that makes adding classes to squirrel very easy
truelight
parents:
diff changeset
   748
9424
90e9aa6326f3 (svn r9226) [NoAI] -Change: moved some ai/squirrel files to root
truelight
parents: 9387
diff changeset
   749
#endif /* SQUIRREL_HELPER_HPP */