#ifndef AS_GEN_WRAPPER_H #define AS_GEN_WRAPPER_H #ifndef ANGELSCRIPT_H // Avoid having to inform include path if header is already include before #include #endif #include namespace gw { template class Proxy { public: T value; Proxy(T value) : value(value) {} static T cast(void * ptr) { return reinterpret_cast *>(&ptr)->value; } private: Proxy(const Proxy &); Proxy & operator=(const Proxy &); }; template struct Wrapper {}; template struct ObjFirst {}; template struct ObjLast {}; template struct Constructor {}; template void destroy(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { static_cast(gen->GetObject())->~T(); } template <> struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * /*gen*/) { ((fp)()); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)()); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)()); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)()); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)()); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)()); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()))); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()))); } }; template struct Constructor { static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetObject()) T(); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value)); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, Proxy::cast(gen->GetObject()))); } }; template struct Constructor { static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetObject()) T( static_cast *>(gen->GetAddressOfArg(0))->value); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value)); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, Proxy::cast(gen->GetObject()))); } }; template struct Constructor { static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetObject()) T( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value)); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, Proxy::cast(gen->GetObject()))); } }; template struct Constructor { static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetObject()) T( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct Wrapper { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((static_cast(gen->GetObject())->*fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct ObjFirst { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( Proxy::cast(gen->GetObject()), static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value)); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { ((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value, Proxy::cast(gen->GetObject()))); } }; template struct ObjLast { template static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetAddressOfReturnLocation()) Proxy((fp)( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value, Proxy::cast(gen->GetObject()))); } }; template struct Constructor { static void f(AS_NAMESPACE_QUALIFIER asIScriptGeneric * gen) { new (gen->GetObject()) T( static_cast *>(gen->GetAddressOfArg(0))->value, static_cast *>(gen->GetAddressOfArg(1))->value, static_cast *>(gen->GetAddressOfArg(2))->value, static_cast *>(gen->GetAddressOfArg(3))->value); } }; template struct Id { template AS_NAMESPACE_QUALIFIER asSFuncPtr f(void) { return asFUNCTION(&Wrapper::template f); } template AS_NAMESPACE_QUALIFIER asSFuncPtr of(void) { return asFUNCTION(&ObjFirst::template f); } template AS_NAMESPACE_QUALIFIER asSFuncPtr ol(void) { return asFUNCTION(&ObjLast::template f); } }; template Id id(T /*fn_ptr*/) { return Id(); } // On GNUC it is necessary to use the template keyword as disambiguator. // MSVC seems to accept both with or without the template keyword. #if defined(__GNUC__) #define TMPL template #else #define TMPL #endif #define WRAP_FN(name) (::gw::id(name).TMPL f< name >()) #define WRAP_MFN(ClassType, name) (::gw::id(&ClassType::name).TMPL f< &ClassType::name >()) #define WRAP_OBJ_FIRST(name) (::gw::id(name).TMPL of< name >()) #define WRAP_OBJ_LAST(name) (::gw::id(name).TMPL ol< name >()) #define WRAP_FN_PR(name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper::TMPL f< name >)) #define WRAP_MFN_PR(ClassType, name, Parameters, ReturnType) asFUNCTION((::gw::Wrapper::TMPL f< AS_METHOD_AMBIGUITY_CAST(ReturnType (ClassType::*)Parameters)(&ClassType::name) >)) #define WRAP_OBJ_FIRST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjFirst::TMPL f< name >)) #define WRAP_OBJ_LAST_PR(name, Parameters, ReturnType) asFUNCTION((::gw::ObjLast::TMPL f< name >)) #define WRAP_CON(ClassType, Parameters) asFUNCTION((::gw::Constructor::f)) #define WRAP_DES(ClassType) asFUNCTION((::gw::destroy)) } // end namespace gw #endif