// SqPlusConst.h // SqPlus constant type and constant member function support created by Simon Michelmore. // Modular integration 11/14/05 jcs. #ifdef SQPLUS_DECLARE_INSTANCE_TYPE_CONST #undef SQPLUS_DECLARE_INSTANCE_TYPE_CONST // Kamaitati's NULL_INSTANCE support. 5/28/06 jcs #ifdef SQPLUS_SUPPORT_NULL_INSTANCES #define DECLARE_INSTANCE_TYPE_NAME_CONST_BASE(TYPE,NAME) \ inline bool Match(TypeWrapper,HSQUIRRELVM v,int idx) { return GetInstance(v,idx) != NULL; } \ inline const TYPE & Get(TypeWrapper,HSQUIRRELVM v,int idx) { return *GetInstance(v,idx); } // Ordinary case #define DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,NAME) \ DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) \ namespace SqPlus { \ DECLARE_INSTANCE_TYPE_NAME_CONST_BASE(TYPE,NAME) \ template<> inline void Push(HSQUIRRELVM v,const TYPE * value) { \ if (!value) sq_pushnull(v); \ else if (!CreateNativeClassInstance(v,GetTypeName(*value),(TYPE*)value,0)) \ throw SquirrelError(_SC("Push(): could not create INSTANCE (check registration name)")); } \ template<> inline void Push(HSQUIRRELVM v,const TYPE & value) { if (!CreateCopyInstance(v,GetTypeName(value),value)) throw SquirrelError(_SC("Push(): could not create INSTANCE copy (check registration name)")); } \ } // nameSpace SqPlus // Case for custom Push implementation (covariant return type) #define DECLARE_INSTANCE_TYPE_NAME_CONST_CUSTOM(TYPE,NAME) \ DECLARE_INSTANCE_TYPE_NAME_CUSTOM_(TYPE,NAME) \ namespace SqPlus { \ DECLARE_INSTANCE_TYPE_NAME_CONST_BASE(TYPE,NAME) \ template<> void Push(HSQUIRRELVM v,const TYPE * value); \ template<> void Push(HSQUIRRELVM v,const TYPE & value); \ } // nameSpace SqPlus #else #define DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,NAME) \ DECLARE_INSTANCE_TYPE_NAME_(TYPE,NAME) \ namespace SqPlus { \ template<> inline void Push(HSQUIRRELVM v,const TYPE * value) { if (!CreateNativeClassInstance(v,GetTypeName(*value),(TYPE*)value,0)) throw SquirrelError(_SC("Push(): could not create INSTANCE (check registration name)")); } \ template<> inline void Push(HSQUIRRELVM v,const TYPE & value) { if (!CreateCopyInstance(v,GetTypeName(value),value)) throw SquirrelError(_SC("Push(): could not create INSTANCE copy (check registration name)")); } \ template<> inline bool Match(TypeWrapper,HSQUIRRELVM v,int idx) { return GetInstance(v,idx) != NULL; } \ template<> inline const TYPE & Get(TypeWrapper,HSQUIRRELVM v,int idx) { return *GetInstance(v,idx); } \ } // nameSpace SqPlus #endif #define DECLARE_INSTANCE_TYPE(TYPE) DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_CONST(TYPE,NAME) #define DECLARE_INSTANCE_TYPE_CUSTOM(TYPE) DECLARE_INSTANCE_TYPE_NAME_CONST_CUSTOM(TYPE,TYPE) #define DECLARE_INSTANCE_TYPE_NAME_CUSTOM(TYPE,NAME) DECLARE_INSTANCE_TYPE_NAME_CONST_CUSTOM(TYPE,NAME) #endif #define SQPLUS_APPLY_CONST #include "SqPlusCallTemplates.h" #ifdef SQ_REG_CONST_STATIC_VAR #undef SQ_REG_CONST_STATIC_VAR template SQClassDefBase & staticVar(const VarType * pvar,const SQChar * name,VarAccessType access=VAR_ACCESS_READ_ONLY) { struct CV { const VarType * var; } cv; // Cast Variable helper. cv.var = pvar; RegisterInstanceVariable(newClass,ClassType::type(),*(VarType **)&cv,name,VarAccessType(access|VAR_ACCESS_STATIC)); return *this; } // staticVar #endif // SqPlusConst.h