2012-07-08 21:01:08 +00:00
# ifndef _SQPLUS_FUNCTION_CALL_IMPL_H_
# define _SQPLUS_FUNCTION_CALL_IMPL_H_
# ifdef GCC_INLINE_WORKAROUND
# define SQINLINE
# else
# define SQINLINE inline
# endif
SQINLINE void Push ( HSQUIRRELVM v , char value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , unsigned char value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , short value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , unsigned short value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , int value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , unsigned int value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , long value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , unsigned long value ) { sq_pushinteger ( v , value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , double value ) { sq_pushfloat ( v , ( FLOAT ) value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , float value ) { sq_pushfloat ( v , ( FLOAT ) value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , const SQChar * value ) { sq_pushstring ( v , value , - 1 ) ; }
SQINLINE void Push ( HSQUIRRELVM v , SQChar * value ) { sq_pushstring ( v , value , - 1 ) ; }
SQINLINE void Push ( HSQUIRRELVM v , const SquirrelNull & ) { sq_pushnull ( v ) ; }
SQINLINE void Push ( HSQUIRRELVM v , SQFUNCTION value ) { sq_pushuserpointer ( v , ( void * ) value ) ; }
SQINLINE void Push ( HSQUIRRELVM v , SQAnythingPtr value ) { sq_pushuserpointer ( v , ( void * ) value ) ; } // Cast to SQAnythingPtr instead of void * if USE_ARGUMENT_DEPENDANT_OVERLOADS can't be used by your compiler.
SQINLINE void Push ( HSQUIRRELVM v , SquirrelObject & so ) { sq_pushobject ( v , so . GetObjectHandle ( ) ) ; }
# ifdef USE_ARGUMENT_DEPENDANT_OVERLOADS
# ifdef _MSC_VER
# pragma warning (disable:4675) // Disable warning: "resolved overload was found by argument-dependent lookup" when class/struct pointers are used as function arguments.
# endif
// === BEGIN Argument Dependent Overloads ===
SQINLINE void Push ( HSQUIRRELVM v , bool value ) { sq_pushbool ( v , value ) ; } // Pass bool as int if USE_ARGUMENT_DEPENDANT_OVERLOADS can't be used by your compiler.
SQINLINE void Push ( HSQUIRRELVM v , const void * value ) { sq_pushuserpointer ( v , ( void * ) value ) ; } // Pass SQAnythingPtr instead of void * " "
SQINLINE void Push ( HSQUIRRELVM v , const SQUserPointer & value ) { sq_pushuserpointer ( v , ( void * ) value ) ; }
// === END Argument Dependent Overloads ===
# endif
# define SQPLUS_CHECK_GET(res) if (!SQ_SUCCEEDED(res)) throw SquirrelError(_SC("sq_get*() failed (type error)"))
//SQINLINE bool Match(TypeWrapper<bool>,HSQUIRRELVM v,int idx) { return sq_gettype(v,idx) == OT_BOOL; }
SQINLINE bool Match ( TypeWrapper < bool > , HSQUIRRELVM v , int idx ) { return true ; } // All types can be cast to bool
SQINLINE bool Match ( TypeWrapper < char > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < unsigned char > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < short > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < unsigned short > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < int > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < unsigned int > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < long > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < unsigned long > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_INTEGER ; }
SQINLINE bool Match ( TypeWrapper < float > , HSQUIRRELVM v , int idx ) { int type = sq_gettype ( v , idx ) ; return type = = OT_FLOAT ; }
SQINLINE bool Match ( TypeWrapper < double > , HSQUIRRELVM v , int idx ) { int type = sq_gettype ( v , idx ) ; return type = = OT_FLOAT ; }
SQINLINE bool Match ( TypeWrapper < const SQChar * > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
SQINLINE bool Match ( TypeWrapper < SQChar * > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
SQINLINE bool Match ( TypeWrapper < HSQUIRRELVM > , HSQUIRRELVM v , int idx ) { return true ; } // See Get() for HSQUIRRELVM below (v is always present).
SQINLINE bool Match ( TypeWrapper < void * > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_USERPOINTER ; }
SQINLINE bool Match ( TypeWrapper < SquirrelObject > , HSQUIRRELVM v , int idx ) { return true ; } // See sq_getstackobj(): always returns true.
SQINLINE void Get ( TypeWrapper < void > , HSQUIRRELVM v , int ) { }
//SQINLINE bool Get(TypeWrapper<bool>,HSQUIRRELVM v,int idx) { SQBool b; SQPLUS_CHECK_GET(sq_getbool(v,idx,&b)); return b != 0; }
SQINLINE char Get ( TypeWrapper < char > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < char > ( i ) ; }
SQINLINE unsigned char Get ( TypeWrapper < unsigned char > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < unsigned char > ( i ) ; }
SQINLINE short Get ( TypeWrapper < short > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < short > ( i ) ; }
SQINLINE unsigned short Get ( TypeWrapper < unsigned short > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < unsigned short > ( i ) ; }
SQINLINE int Get ( TypeWrapper < int > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return i ; }
SQINLINE unsigned int Get ( TypeWrapper < unsigned int > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < unsigned int > ( i ) ; }
SQINLINE long Get ( TypeWrapper < long > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < long > ( i ) ; }
SQINLINE unsigned long Get ( TypeWrapper < unsigned long > , HSQUIRRELVM v , int idx ) { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return static_cast < unsigned long > ( i ) ; }
SQINLINE float Get ( TypeWrapper < float > , HSQUIRRELVM v , int idx ) { FLOAT f ; SQPLUS_CHECK_GET ( sq_getfloat ( v , idx , & f ) ) ; return f ; }
SQINLINE double Get ( TypeWrapper < double > , HSQUIRRELVM v , int idx ) { FLOAT f ; SQPLUS_CHECK_GET ( sq_getfloat ( v , idx , & f ) ) ; return static_cast < double > ( f ) ; }
SQINLINE const SQChar * Get ( TypeWrapper < const SQChar * > , HSQUIRRELVM v , int idx ) { const SQChar * s ; SQPLUS_CHECK_GET ( sq_getstring ( v , idx , & s ) ) ; return s ; }
SQINLINE SquirrelNull Get ( TypeWrapper < SquirrelNull > , HSQUIRRELVM v , int idx ) { ( void ) v , ( void ) idx ; return SquirrelNull ( ) ; }
SQINLINE void * Get ( TypeWrapper < void * > , HSQUIRRELVM v , int idx ) { SQUserPointer p ; SQPLUS_CHECK_GET ( sq_getuserpointer ( v , idx , & p ) ) ; return p ; }
SQINLINE HSQUIRRELVM Get ( TypeWrapper < HSQUIRRELVM > , HSQUIRRELVM v , int /*idx*/ ) { sq_poptop ( v ) ; return v ; } // sq_poptop(v): remove UserData from stack so GetParamCount() matches normal behavior.
SQINLINE SquirrelObject Get ( TypeWrapper < SquirrelObject > , HSQUIRRELVM v , int idx ) { HSQOBJECT o ; SQPLUS_CHECK_GET ( sq_getstackobj ( v , idx , & o ) ) ; return SquirrelObject ( o ) ; }
SQINLINE bool Get ( TypeWrapper < bool > , HSQUIRRELVM v , int idx ) {
switch ( sq_gettype ( v , idx ) ) {
case OT_NULL : { return false ; }
case OT_BOOL : { SQBool b ; SQPLUS_CHECK_GET ( sq_getbool ( v , idx , & b ) ) ; return b ! = 0 ; }
case OT_INTEGER : { INT i ; SQPLUS_CHECK_GET ( sq_getinteger ( v , idx , & i ) ) ; return i ! = 0 ; }
case OT_FLOAT : { FLOAT f ; SQPLUS_CHECK_GET ( sq_getfloat ( v , idx , & f ) ) ; return f ! = ( FLOAT ) 0.0 ; }
default : return true ; } }
# ifdef SQPLUS_AUTOCONVERT_OTHER_CHAR
SQINLINE void Push ( HSQUIRRELVM v , const SQOtherChar * value ) { SQDefCharBuf cb ( value ) ; sq_pushstring ( v , ( const SQChar * ) cb , - 1 ) ; }
SQINLINE void Push ( HSQUIRRELVM v , SQOtherChar * value ) { SQDefCharBuf cb ( value ) ; sq_pushstring ( v , ( const SQChar * ) cb , - 1 ) ; }
SQINLINE bool Match ( TypeWrapper < const SQOtherChar * > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
SQINLINE bool Match ( TypeWrapper < SQOtherChar * > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
/*SQINLINE SQOtherChar* Get(TypeWrapper<const SQOtherChar *>,HSQUIRRELVM v,int idx) {
const SQChar * s ; SQPLUS_CHECK_GET ( sq_getstring ( v , idx , & s ) ) ;
static SQOthCharBuf ocb [ SQPLUS_AUTOCONVERT_MAX_INSTANCES ] ; static int st_buf_cnt ;
return ocb [ st_buf_cnt + + % SQPLUS_AUTOCONVERT_MAX_INSTANCES ] . Set ( s ) ; } */
SQINLINE SQOthCharBuf Get ( TypeWrapper < const SQOtherChar * > , HSQUIRRELVM v , int idx ) { const SQChar * s ; SQPLUS_CHECK_GET ( sq_getstring ( v , idx , & s ) ) ; return SQOthCharBuf ( s ) ; }
# endif // SQPLUS_AUTOCONVERT_OTHER_CHAR
# if defined(SQPLUS_SUPPORT_STD_STRING) && !defined(SQUNICODE)
SQINLINE void Push ( HSQUIRRELVM v , const std : : string & value ) { sq_pushstring ( v , value . c_str ( ) , - 1 ) ; }
SQINLINE bool Match ( TypeWrapper < const std : : string & > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
SQINLINE std : : string Get ( TypeWrapper < const std : : string & > , HSQUIRRELVM v , int idx ) { const SQChar * s ; SQPLUS_CHECK_GET ( sq_getstring ( v , idx , & s ) ) ; return std : : string ( s ) ; }
# endif // defined(SQPLUS_SUPPORT_STD_STRING) && !defined(SQUNICODE)
// Added jflanglois suggestion, 8/20/06. jcs
# ifdef SQPLUS_SUPPORT_SQ_STD_STRING
typedef std : : basic_string < SQChar > sq_std_string ;
SQINLINE void Push ( HSQUIRRELVM v , const sq_std_string & value ) { sq_pushstring ( v , value . c_str ( ) , - 1 ) ; }
SQINLINE bool Match ( TypeWrapper < const sq_std_string & > , HSQUIRRELVM v , int idx ) { return sq_gettype ( v , idx ) = = OT_STRING ; }
SQINLINE sq_std_string Get ( TypeWrapper < const sq_std_string & > , HSQUIRRELVM v , int idx ) { const SQChar * s ; SQPLUS_CHECK_GET ( sq_getstring ( v , idx , & s ) ) ; return sq_std_string ( s ) ; }
# endif
// Specialization to support void return type.
SQINLINE void GetRet ( TypeWrapper < void > , HSQUIRRELVM v , int idx ) { sq_pop ( v , 2 ) ; }
# endif // _SQPLUS_FUNCTION_CALL_IMPL_H_