#ifndef MARSHALL_PRIMITIVES_H #define MARSHALL_PRIMITIVES_H template <> bool perl_to_primitive(SV* sv) { if ( !SvOK(sv) ) return false; if ( SvROK(sv) ) // Because they could pass in a Qt::Bool return SvTRUE( SvRV(sv) ) ? true : false; return SvTRUE(sv) ? true : false; } template <> SV* primitive_to_perl(bool sv) { return boolSV(sv); } //----------------------------------------------------------------------------- template <> signed char perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) return 0; if ( SvIOK( sv ) ) return (char)SvIV(sv); return (char)*SvPV_nolen(sv); } template <> SV *primitive_to_perl(signed char sv) { return newSViv(sv); } //----------------------------------------------------------------------------- template <> unsigned char perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) sv = SvRV(sv); if ( SvIOK( sv ) ) return (unsigned char)SvIV(sv); return (unsigned char)*SvPV_nolen(sv); } template <> SV *primitive_to_perl(unsigned char sv) { return newSViv(sv); } //----------------------------------------------------------------------------- template <> short perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) sv = SvRV(sv); return (short)SvIV(sv); } template <> SV *primitive_to_perl(short sv) { UNTESTED_HANDLER("primitive_to_perl"); return newSViv(sv); } //----------------------------------------------------------------------------- template <> unsigned short perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) sv = SvRV(sv); return (unsigned short)SvIV(sv); } template <> SV *primitive_to_perl(unsigned short sv) { return newSViv((unsigned short) sv); } //----------------------------------------------------------------------------- template<> int perl_to_primitive(SV* sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) // Because enums can be used as ints return SvIV( SvRV(sv) ); return SvIV(sv); } template<> SV* primitive_to_perl(int sv) { return newSViv(sv); } //----------------------------------------------------------------------------- template <> unsigned int perl_to_primitive(SV* sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) return SvUV( SvRV(sv) ); return SvUV(sv); } template <> SV* primitive_to_perl(unsigned int sv) { return newSVuv(sv); } //----------------------------------------------------------------------------- template <> long perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) return 0; if ( SvROK(sv) ) sv = SvRV(sv); return (long) SvIV(sv); } template <> SV *primitive_to_perl(long sv) { return newSViv(sv); } //----------------------------------------------------------------------------- template <> unsigned long perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) { return 0; //} else if (TYPE(sv) == T_OBJECT) { //return (unsigned long) NUM2ULONG(rb_funcall(qt_internal_module, rb_intern("get_qinteger"), 1, sv)); } else { return (unsigned long) SvIV(sv); } } template <> SV *primitive_to_perl(unsigned long sv) { UNTESTED_HANDLER("primitive_to_perl"); return newSViv(sv); } //----------------------------------------------------------------------------- template <> long long perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) { return 0; } else { return SvIV(sv); } } template <> SV *primitive_to_perl(long long sv) { return newSViv(sv); } //----------------------------------------------------------------------------- template <> unsigned long long perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) { return 0; } else { return (unsigned long long)SvIV(sv); } } template <> SV *primitive_to_perl(unsigned long long sv) { UNTESTED_HANDLER("primitive_to_perl"); return newSViv(sv); } //----------------------------------------------------------------------------- template <> float perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) { return 0.0; } else { return (float) SvNV(sv); } } template <> SV *primitive_to_perl(float sv) { UNTESTED_HANDLER("primitive_to_perl"); return newSVnv((double) sv); } //----------------------------------------------------------------------------- template <> double perl_to_primitive(SV* sv) { if ( !SvOK(sv) ) return 0; return SvNV(sv); } template <> SV* primitive_to_perl(double sv) { return newSVnv(sv); } //----------------------------------------------------------------------------- template<> char* perl_to_primitive( SV* sv ) { if( !SvOK(sv) ) return 0; if( SvROK(sv) ) sv = SvRV(sv); return SvPV_nolen(sv); } //----------------------------------------------------------------------------- template <> unsigned char* perl_to_primitive(SV *sv) { if ( !SvOK(sv) ) return 0; return (unsigned char*)SvPV_nolen(sv); } //----------------------------------------------------------------------------- template <> SV *primitive_to_perl(int* sv) { UNTESTED_HANDLER("primitive_to_perl"); if ( !sv ) return &PL_sv_undef; return primitive_to_perl(*sv); } //----------------------------------------------------------------------------- #if defined(Q_OS_WIN32) template <> static WId perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) return 0; #ifdef Q_WS_MAC32 return (WId) SvIV(sv); #else return (WId) SvIV(sv); #endif } template <> static SV *primitive_to_perl(WId sv) { UNTESTED_HANDLER("primitive_to_perl"); #ifdef Q_WS_MAC32 return newSViv((unsigned long) sv); #else return newSViv((unsigned long) sv); #endif } //----------------------------------------------------------------------------- template <> static Q_PID perl_to_primitive(SV *sv) { UNTESTED_HANDLER("perl_to_primitive"); if ( !SvOK(sv) ) return 0; return (Q_PID) SvIV(sv); } template <> static SV *primitive_to_perl(Q_PID sv) { UNTESTED_HANDLER("primitive_to_perl"); return newSViv((unsigned long) sv); } #endif #endif //MARSHALL_PRIMITIVES_H