From 37105e8237272565b60550c41945b3c41b11a9d9 Mon Sep 17 00:00:00 2001 From: Alessandro Ranellucci Date: Sun, 23 Jun 2013 15:33:07 +0200 Subject: Ported get_layer_range() to C --- xs/MANIFEST | 4 +- xs/buildtmp/XS.c | 236 --------------------- xs/buildtmp/XS.o | Bin 5468 -> 0 bytes xs/buildtmp/main.xs | 27 --- xs/buildtmp/typemap | 429 --------------------------------------- xs/lib/Slic3r/TriangleMesh/XS.pm | 10 - xs/t/02_object.t | 12 ++ xs/xsp/Object.xsp | 49 +++++ xs/xsp/TriangleMesh.xsp | 2 +- xs/xsp/XS.xsp | 4 +- xs/xsp/my.map | 1 + xs/xsp/typemap.xspt | 3 +- 12 files changed, 70 insertions(+), 707 deletions(-) delete mode 100644 xs/buildtmp/XS.c delete mode 100644 xs/buildtmp/XS.o delete mode 100644 xs/buildtmp/main.xs delete mode 100644 xs/buildtmp/typemap delete mode 100644 xs/lib/Slic3r/TriangleMesh/XS.pm create mode 100644 xs/t/02_object.t create mode 100644 xs/xsp/Object.xsp create mode 100644 xs/xsp/my.map (limited to 'xs') diff --git a/xs/MANIFEST b/xs/MANIFEST index a473c6c89..43e2324d1 100644 --- a/xs/MANIFEST +++ b/xs/MANIFEST @@ -1,11 +1,13 @@ Build.PL -lib/Slic3r/TriangleMesh/XS.pm lib/Slic3r/XS.pm MANIFEST This list of files src/myinit.h src/ppport.h t/01_trianglemesh.t +t/02_object.t +xsp/my.map xsp/mytype.map +xsp/Object.xsp xsp/TriangleMesh.xsp xsp/typemap.xspt xsp/XS.xsp diff --git a/xs/buildtmp/XS.c b/xs/buildtmp/XS.c deleted file mode 100644 index f6ebb8445..000000000 --- a/xs/buildtmp/XS.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * This file was generated automatically by ExtUtils::ParseXS version 3.15 from the - * contents of main.xs. Do not edit this file, edit main.xs instead. - * - * ANY CHANGES MADE HERE WILL BE LOST! - * - */ - -#line 1 "buildtmp/main.xs" -/* - * WARNING: This file was auto-generated. Changes will be lost! - */ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" -#include "ppport.h" -#undef do_open -#undef do_close -#ifdef __cplusplus -} -#endif - -#line 32 "buildtmp/XS.c" -#ifndef PERL_UNUSED_VAR -# define PERL_UNUSED_VAR(var) if (0) var = var -#endif - -#ifndef dVAR -# define dVAR dNOOP -#endif - - -/* This stuff is not part of the API! You have been warned. */ -#ifndef PERL_VERSION_DECIMAL -# define PERL_VERSION_DECIMAL(r,v,s) (r*1000000 + v*1000 + s) -#endif -#ifndef PERL_DECIMAL_VERSION -# define PERL_DECIMAL_VERSION \ - PERL_VERSION_DECIMAL(PERL_REVISION,PERL_VERSION,PERL_SUBVERSION) -#endif -#ifndef PERL_VERSION_GE -# define PERL_VERSION_GE(r,v,s) \ - (PERL_DECIMAL_VERSION >= PERL_VERSION_DECIMAL(r,v,s)) -#endif -#ifndef PERL_VERSION_LE -# define PERL_VERSION_LE(r,v,s) \ - (PERL_DECIMAL_VERSION <= PERL_VERSION_DECIMAL(r,v,s)) -#endif - -/* XS_INTERNAL is the explicit static-linkage variant of the default - * XS macro. - * - * XS_EXTERNAL is the same as XS_INTERNAL except it does not include - * "STATIC", ie. it exports XSUB symbols. You probably don't want that - * for anything but the BOOT XSUB. - * - * See XSUB.h in core! - */ - - -/* TODO: This might be compatible further back than 5.10.0. */ -#if PERL_VERSION_GE(5, 10, 0) && PERL_VERSION_LE(5, 15, 1) -# undef XS_EXTERNAL -# undef XS_INTERNAL -# if defined(__CYGWIN__) && defined(USE_DYNAMIC_LOADING) -# define XS_EXTERNAL(name) __declspec(dllexport) XSPROTO(name) -# define XS_INTERNAL(name) STATIC XSPROTO(name) -# endif -# if defined(__SYMBIAN32__) -# define XS_EXTERNAL(name) EXPORT_C XSPROTO(name) -# define XS_INTERNAL(name) EXPORT_C STATIC XSPROTO(name) -# endif -# ifndef XS_EXTERNAL -# if defined(HASATTRIBUTE_UNUSED) && !defined(__cplusplus) -# define XS_EXTERNAL(name) void name(pTHX_ CV* cv __attribute__unused__) -# define XS_INTERNAL(name) STATIC void name(pTHX_ CV* cv __attribute__unused__) -# else -# ifdef __cplusplus -# define XS_EXTERNAL(name) extern "C" XSPROTO(name) -# define XS_INTERNAL(name) static XSPROTO(name) -# else -# define XS_EXTERNAL(name) XSPROTO(name) -# define XS_INTERNAL(name) STATIC XSPROTO(name) -# endif -# endif -# endif -#endif - -/* perl >= 5.10.0 && perl <= 5.15.1 */ - - -/* The XS_EXTERNAL macro is used for functions that must not be static - * like the boot XSUB of a module. If perl didn't have an XS_EXTERNAL - * macro defined, the best we can do is assume XS is the same. - * Dito for XS_INTERNAL. - */ -#ifndef XS_EXTERNAL -# define XS_EXTERNAL(name) XS(name) -#endif -#ifndef XS_INTERNAL -# define XS_INTERNAL(name) XS(name) -#endif - -/* Now, finally, after all this mess, we want an ExtUtils::ParseXS - * internal macro that we're free to redefine for varying linkage due - * to the EXPORT_XSUB_SYMBOLS XS keyword. This is internal, use - * XS_EXTERNAL(name) or XS_INTERNAL(name) in your code if you need to! - */ - -#undef XS_EUPXS -#if defined(PERL_EUPXS_ALWAYS_EXPORT) -# define XS_EUPXS(name) XS_EXTERNAL(name) -#else - /* default to internal */ -# define XS_EUPXS(name) XS_INTERNAL(name) -#endif - -#ifndef PERL_ARGS_ASSERT_CROAK_XS_USAGE -#define PERL_ARGS_ASSERT_CROAK_XS_USAGE assert(cv); assert(params) - -/* prototype to pass -Wmissing-prototypes */ -STATIC void -S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params); - -STATIC void -S_croak_xs_usage(pTHX_ const CV *const cv, const char *const params) -{ - const GV *const gv = CvGV(cv); - - PERL_ARGS_ASSERT_CROAK_XS_USAGE; - - if (gv) { - const char *const gvname = GvNAME(gv); - const HV *const stash = GvSTASH(gv); - const char *const hvname = stash ? HvNAME(stash) : NULL; - - if (hvname) - Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params); - else - Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params); - } else { - /* Pants. I don't think that it should be possible to get here. */ - Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params); - } -} -#undef PERL_ARGS_ASSERT_CROAK_XS_USAGE - -#ifdef PERL_IMPLICIT_CONTEXT -#define croak_xs_usage(a,b) S_croak_xs_usage(aTHX_ a,b) -#else -#define croak_xs_usage S_croak_xs_usage -#endif - -#endif - -/* NOTE: the prototype of newXSproto() is different in versions of perls, - * so we define a portable version of newXSproto() - */ -#ifdef newXS_flags -#define newXSproto_portable(name, c_impl, file, proto) newXS_flags(name, c_impl, file, proto, 0) -#else -#define newXSproto_portable(name, c_impl, file, proto) (PL_Sv=(SV*)newXS(name, c_impl, file), sv_setpv(PL_Sv, proto), (CV*)PL_Sv) -#endif /* !defined(newXS_flags) */ - -#line 174 "buildtmp/XS.c" - -/* INCLUDE_COMMAND: Including output of '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp' from 'main.xs' */ - -#include - - -XS_EUPXS(XS_Slic3r__TriangleMesh__XS_hello_world); /* prototype to pass -Wmissing-prototypes */ -XS_EUPXS(XS_Slic3r__TriangleMesh__XS_hello_world) -{ - dVAR; dXSARGS; - if (items != 0) - croak_xs_usage(cv, ""); - { - std::string RETVAL; -#line 14 "/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp" - RETVAL = "Hello world!"; -#line 191 "buildtmp/XS.c" - ST(0) = newSVpvn( RETVAL.c_str(), RETVAL.length() ); - sv_2mortal(ST(0)); - } - XSRETURN(1); -} - - -/* INCLUDE: Returning to 'main.xs' from '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp' */ - - -/* INCLUDE_COMMAND: Including output of '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp' from 'main.xs' */ - -#include - -#include - -/* INCLUDE: Returning to 'main.xs' from '/opt/local/bin/perl -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp' */ - -#ifdef __cplusplus -extern "C" -#endif -XS_EXTERNAL(boot_Slic3r__XS); /* prototype to pass -Wmissing-prototypes */ -XS_EXTERNAL(boot_Slic3r__XS) -{ - dVAR; dXSARGS; -#if (PERL_REVISION == 5 && PERL_VERSION < 9) - char* file = __FILE__; -#else - const char* file = __FILE__; -#endif - - PERL_UNUSED_VAR(cv); /* -W */ - PERL_UNUSED_VAR(items); /* -W */ -#ifdef XS_APIVERSION_BOOTCHECK - XS_APIVERSION_BOOTCHECK; -#endif - XS_VERSION_BOOTCHECK; - - newXS("Slic3r::TriangleMesh::XS::hello_world", XS_Slic3r__TriangleMesh__XS_hello_world, file); -#if (PERL_REVISION == 5 && PERL_VERSION >= 9) - if (PL_unitcheckav) - call_list(PL_scopestack_ix, PL_unitcheckav); -#endif - XSRETURN_YES; -} - diff --git a/xs/buildtmp/XS.o b/xs/buildtmp/XS.o deleted file mode 100644 index 6dd21b68e..000000000 Binary files a/xs/buildtmp/XS.o and /dev/null differ diff --git a/xs/buildtmp/main.xs b/xs/buildtmp/main.xs deleted file mode 100644 index a1aeb8023..000000000 --- a/xs/buildtmp/main.xs +++ /dev/null @@ -1,27 +0,0 @@ -/* - * WARNING: This file was auto-generated. Changes will be lost! - */ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif -#include "EXTERN.h" -#include "perl.h" -#include "XSUB.h" -#include "ppport.h" -#undef do_open -#undef do_close -#ifdef __cplusplus -} -#endif - -MODULE = Slic3r::XS PACKAGE = Slic3r::XS - -INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/TriangleMesh.xsp - -INCLUDE_COMMAND: $^X -MExtUtils::XSpp::Cmd -e xspp -- -t /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/typemap.xspt /Users/al/Documents/Software/Slic3r/Slic3r/xs/xsp/XS.xsp - diff --git a/xs/buildtmp/typemap b/xs/buildtmp/typemap deleted file mode 100644 index d2f0eb576..000000000 --- a/xs/buildtmp/typemap +++ /dev/null @@ -1,429 +0,0 @@ -TYPEMAP -int T_IV -signed int T_IV -short T_IV -signed short T_IV -long T_IV -signed long T_IV -char T_IV -signed char T_IV -short int T_IV -signed short int T_IV -long int T_IV -signed long int T_IV -long long T_IV -signed long long T_IV -time_t T_IV -Sint16 T_IV -Sint32 T_IV -Sint64 T_IV -unsigned int T_UV -unsigned short T_UV -unsigned long T_UV -unsigned char T_UV -unsigned short int T_UV -unsigned long int T_UV -unsigned long long T_UV -unsigned T_UV -Uint16 T_UV -Uint32 T_UV -Uint64 T_UV -size_t T_UV -bool T_UV -float T_NV -double T_NV -long double T_NV -const int T_IV -const signed int T_IV -const short T_IV -const signed short T_IV -const long T_IV -const signed long T_IV -const char T_IV -const signed char T_IV -const short int T_IV -const signed short int T_IV -const long int T_IV -const signed long int T_IV -const long long T_IV -const signed long long T_IV -const time_t T_IV -const Sint16 T_IV -const Sint32 T_IV -const Sint64 T_IV -const unsigned int T_UV -const unsigned short T_UV -const unsigned long T_UV -const unsigned char T_UV -const unsigned short int T_UV -const unsigned long int T_UV -const unsigned long long T_UV -const unsigned T_UV -const Uint16 T_UV -const Uint32 T_UV -const Uint64 T_UV -const size_t T_UV -const bool T_UV -const float T_NV -const double T_NV -const long double T_NV -HV * T_HvRV -AV * T_AvRV -std::string T_STD_STRING -std::string* T_STD_STRING_PTR -std::vector< double >* T_STD_VECTOR_DOUBLE_PTR -std::vector* T_STD_VECTOR_DOUBLE_PTR -std::vector< double > T_STD_VECTOR_DOUBLE -std::vector T_STD_VECTOR_DOUBLE -std::vector< int >* T_STD_VECTOR_INT_PTR -std::vector* T_STD_VECTOR_INT_PTR -std::vector< int > T_STD_VECTOR_INT -std::vector T_STD_VECTOR_INT -std::vector< unsigned int >* T_STD_VECTOR_UINT_PTR -std::vector* T_STD_VECTOR_UINT_PTR -std::vector< unsigned int > T_STD_VECTOR_UINT -std::vector T_STD_VECTOR_UINT -std::vector T_STD_VECTOR_STD_STRING -std::vector* T_STD_VECTOR_STD_STRING_PTR -std::vector T_STD_VECTOR_CSTRING -std::vector* T_STD_VECTOR_CSTRING_PTR - -INPUT -O_OBJECT - if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) - $var = ($type)SvIV((SV*)SvRV( $arg )); - else{ - warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" ); - XSRETURN_UNDEF; - } -T_OBJECT - if( SvROK($arg) ) - $var = ($type)SvIV((SV*)SvRV( $arg )); - else{ - warn( \"${Package}::$func_name() -- $var is not an SV reference\" ); - XSRETURN_UNDEF; - } -O_HvRV - if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) ) - $var = (HV*)SvRV( $arg ); - else { - warn( \"${Package}::$func_name() -- $var is not a blessed HV reference\" ); - XSRETURN_UNDEF; - } -T_HvRV - if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVHV) ) - $var = (HV*)SvRV( $arg ); - else { - warn( \"${Package}::$func_name() -- $var is not an HV reference\" ); - XSRETURN_UNDEF; - } -O_AvRV - if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) ) - $var = (AV*)SvRV( $arg ); - else { - warn( \"${Package}::$func_name() -- $var is not a blessed AV reference\" ); - XSRETURN_UNDEF; - } -T_AvRV - if( SvROK($arg) && (SvTYPE(SvRV($arg)) == SVt_PVAV) ) - $var = (AV*)SvRV( $arg ); - else { - warn( \"${Package}::$func_name() -- $var is not an AV reference\" ); - XSRETURN_UNDEF; - } -T_STD_STRING - $var = std::string( SvPV_nolen( $arg ), SvCUR( $arg ) ); -T_STD_STRING_PTR - $var = new std::string( SvPV_nolen( $arg ), SvCUR( $arg ) ); -T_STD_VECTOR_DOUBLE - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - ${var}[i] = SvNV(*elem); - else - ${var}[i] = 0.; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_DOUBLE_PTR - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = new std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - (*$var)[i] = SvNV(*elem); - else - (*$var)[i] = 0.; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_INT - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - ${var}[i] = SvIV(*elem); - else - ${var}[i] = 0; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_INT_PTR - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = new std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - (*$var)[i] = SvIV(*elem); - else - (*$var)[i] = 0.; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_UINT - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - ${var}[i] = SvUV(*elem); - else - ${var}[i] = 0; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_UINT_PTR - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = new std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) - (*$var)[i] = SvUV(*elem); - else - (*$var)[i] = 0.; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_STD_STRING - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int alen = av_len(av)+1; - $var = std::vector(alen); - STRLEN len; - char* tmp; - SV** elem; - for (unsigned int i = 0; i < alen; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) { - tmp = SvPV(*elem, len); - ${var}[i] = std::string(tmp, len); - } - else - ${var}[i] = std::string(\"\"); - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_STD_STRING_PTR - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int alen = av_len(av)+1; - $var = new std::vector(alen); - STRLEN len; - char* tmp; - SV** elem; - for (unsigned int i = 0; i < alen; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) { - tmp = SvPV(*elem, len); - (*$var)[i] = std::string(tmp, len); - } - else - (*$var)[i] = std::string(\"\"); - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_CSTRING - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) { - ${var}[i] = SvPV_nolen(*elem); - else - ${var}[i] = NULL; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); -T_STD_VECTOR_CSTRING_PTR - if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) { - AV* av = (AV*)SvRV($arg); - const unsigned int len = av_len(av)+1; - $var = new std::vector(len); - SV** elem; - for (unsigned int i = 0; i < len; i++) { - elem = av_fetch(av, i, 0); - if (elem != NULL) { - (*$var)[i] = SvPV_nolen(*elem); - else - (*$var)[i] = NULL; - } - } - else - Perl_croak(aTHX_ \"%s: %s is not an array reference\", - ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]}, - \"$var\"); - -OUTPUT -O_OBJECT - sv_setref_pv( $arg, CLASS, (void*)$var ); -T_OBJECT - sv_setref_pv( $arg, Nullch, (void*)$var ); -O_HvRV - $arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) ); -T_HvRV - $arg = newRV((SV*)$var); -O_AvRV - $arg = sv_bless( newRV((SV*)$var), gv_stashpv(CLASS,1) ); -T_AvRV - $arg = newRV((SV*)$var); -T_STD_STRING - $arg = newSVpvn( $var.c_str(), $var.length() ); -T_STD_STRING_PTR - $arg = newSVpvn( $var->c_str(), $var->length() ); -T_STD_VECTOR_DOUBLE - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var.size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSVnv(${var}[i])); - } -T_STD_VECTOR_DOUBLE_PTR - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var->size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSVnv((*$var)[i])); - } -T_STD_VECTOR_INT - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var.size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSViv(${var}[i])); - } -T_STD_VECTOR_INT_PTR - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var->size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSViv((*$var)[i])); - } -T_STD_VECTOR_UINT - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var.size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSVuv(${var}[i])); - } -T_STD_VECTOR_UINT_PTR - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var->size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - av_store(av, i, newSVuv((*$var)[i])); - } -T_STD_VECTOR_STD_STRING - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var.size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - const std::string& str = ${var}[i]; - STRLEN len = str.length(); - av_store(av, i, newSVpv(str.c_str(), len)); - } -T_STD_VECTOR_STD_STRING_PTR - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var->size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - const std::string& str = (*$var)[i]; - STRLEN len = str.length(); - av_store(av, i, newSVpv(str.c_str(), len)); - } -T_STD_VECTOR_CSTRING - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var.size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - STRLEN len = strlen(${var}[i]); - av_store(av, i, newSVpv(${var}[i], len)); - } -T_STD_VECTOR_CSTRING_PTR - AV* av = newAV(); - $arg = newRV_noinc((SV*)av); - const unsigned int len = $var->size(); - av_extend(av, len-1); - for (unsigned int i = 0; i < len; i++) { - STRLEN len = strlen((*$var)[i]); - av_store(av, i, newSVpv((*$var)[i], len)); - } diff --git a/xs/lib/Slic3r/TriangleMesh/XS.pm b/xs/lib/Slic3r/TriangleMesh/XS.pm deleted file mode 100644 index 7d8296cd5..000000000 --- a/xs/lib/Slic3r/TriangleMesh/XS.pm +++ /dev/null @@ -1,10 +0,0 @@ -package Slic3r::TriangleMesh::XS; -use warnings; -use strict; - -our $VERSION = '0.01'; - -use XSLoader; -XSLoader::load(__PACKAGE__, $VERSION); - -1; diff --git a/xs/t/02_object.t b/xs/t/02_object.t new file mode 100644 index 000000000..d9b2b85dc --- /dev/null +++ b/xs/t/02_object.t @@ -0,0 +1,12 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Slic3r::XS; +use Test::More tests => 1; + +is_deeply Slic3r::Object::XS::get_layer_range([ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ], 39, 69), + [2, 6], 'get_layer_range'; + +__END__ diff --git a/xs/xsp/Object.xsp b/xs/xsp/Object.xsp new file mode 100644 index 000000000..9a8168d4f --- /dev/null +++ b/xs/xsp/Object.xsp @@ -0,0 +1,49 @@ +%module{Slic3r::XS}; +%package{Slic3r::Object::XS}; + +#include +#include + +%{ +PROTOTYPES: DISABLE + +std::vector +get_layer_range(z_array, min_z, max_z) + std::vector* z_array; + unsigned int min_z; + unsigned int max_z; + CODE: + RETVAL.resize(2); + + unsigned int bottom = 0; + unsigned int top = z_array->size()-1; + while (1) { + unsigned int mid = bottom + floor((top - bottom)/2.0); + if (mid == top || mid == bottom) { + RETVAL[0] = mid; + break; + } + if ((*z_array)[mid] > min_z) { + top = mid; + } else { + bottom = mid; + } + } + top = z_array->size()-1; + while (1) { + unsigned int mid = bottom + ceil((top - bottom)/2.0); + if (mid == top || mid == bottom) { + RETVAL[1] = mid; + break; + } + if ((*z_array)[mid] < max_z) { + bottom = mid; + } else { + top = mid; + } + } + delete z_array; + OUTPUT: + RETVAL + +%} diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index a696f02b2..be6b31df6 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -1,4 +1,4 @@ -%module{Slic3r::TriangleMesh::XS}; +%module{Slic3r::XS}; %package{Slic3r::TriangleMesh::XS}; %{ diff --git a/xs/xsp/XS.xsp b/xs/xsp/XS.xsp index 9db230b07..f14af9433 100644 --- a/xs/xsp/XS.xsp +++ b/xs/xsp/XS.xsp @@ -1,6 +1,8 @@ %module{Slic3r::XS}; %package{Slic3r::XS}; -%{ #include + +%{ + %} diff --git a/xs/xsp/my.map b/xs/xsp/my.map new file mode 100644 index 000000000..ad7868c92 --- /dev/null +++ b/xs/xsp/my.map @@ -0,0 +1 @@ +std::map* T_PTR diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt index 0f97dcebb..15a95c239 100644 --- a/xs/xsp/typemap.xspt +++ b/xs/xsp/typemap.xspt @@ -1,2 +1 @@ -%typemap{std::string}{simple}; -%typemap{std::string&}{reference}; +%typemap{std::string}; -- cgit v1.2.3