Ported get_layer_range() to C

This commit is contained in:
Alessandro Ranellucci 2013-06-23 15:33:07 +02:00
parent ff795f2918
commit 37105e8237
14 changed files with 72 additions and 738 deletions

View File

@ -65,6 +65,7 @@ use Slic3r::Print::Object;
use Slic3r::Print::Region;
use Slic3r::Surface;
use Slic3r::TriangleMesh;
use Slic3r::XS;
our $build = eval "use Slic3r::Build; 1";
use constant SCALING_FACTOR => 0.000001;

View File

@ -101,37 +101,7 @@ sub get_layer_range {
my $self = shift;
my ($min_z, $max_z) = @_;
# $min_layer is the uppermost layer having slice_z <= $min_z
# $max_layer is the lowermost layer having slice_z >= $max_z
my ($min_layer, $max_layer);
my ($bottom, $top) = (0, $#{$self->layers});
while (1) {
my $mid = $bottom+int(($top - $bottom)/2);
if ($mid == $top || $mid == $bottom) {
$min_layer = $mid;
last;
}
if ($self->layers->[$mid]->slice_z >= $min_z) {
$top = $mid;
} else {
$bottom = $mid;
}
}
$top = $#{$self->layers};
while (1) {
my $mid = $bottom+int(($top - $bottom)/2);
if ($mid == $top || $mid == $bottom) {
$max_layer = $mid;
last;
}
if ($self->layers->[$mid]->slice_z < $max_z) {
$bottom = $mid;
} else {
$top = $mid;
}
}
return ($min_layer, $max_layer);
return @{ Slic3r::Object::XS::get_layer_range([ map $_->slice_z, @{$self->layers} ], $min_z, $max_z) };
}
sub bounding_box {

View File

@ -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

View File

@ -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 <cstring>
#include <cstdlib>
#include <ostream>
#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 <exception>
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 <exception>
#include <myinit.h>
/* 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;
}

Binary file not shown.

View File

@ -1,27 +0,0 @@
/*
* WARNING: This file was auto-generated. Changes will be lost!
*/
#include <cstring>
#include <cstdlib>
#include <ostream>
#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

View File

@ -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<double>* T_STD_VECTOR_DOUBLE_PTR
std::vector< double > T_STD_VECTOR_DOUBLE
std::vector<double> T_STD_VECTOR_DOUBLE
std::vector< int >* T_STD_VECTOR_INT_PTR
std::vector<int>* T_STD_VECTOR_INT_PTR
std::vector< int > T_STD_VECTOR_INT
std::vector<int> T_STD_VECTOR_INT
std::vector< unsigned int >* T_STD_VECTOR_UINT_PTR
std::vector<unsigned int>* T_STD_VECTOR_UINT_PTR
std::vector< unsigned int > T_STD_VECTOR_UINT
std::vector<unsigned int> T_STD_VECTOR_UINT
std::vector<std::string> T_STD_VECTOR_STD_STRING
std::vector<std::string>* T_STD_VECTOR_STD_STRING_PTR
std::vector<char*> T_STD_VECTOR_CSTRING
std::vector<char*>* 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<double>(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<double>(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<int>(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<int>(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<unsigned int>(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<unsigned int>(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<std::string>(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<std::string>(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<char*>(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<char*>(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));
}

View File

@ -1,10 +0,0 @@
package Slic3r::TriangleMesh::XS;
use warnings;
use strict;
our $VERSION = '0.01';
use XSLoader;
XSLoader::load(__PACKAGE__, $VERSION);
1;

12
xs/t/02_object.t Normal file
View File

@ -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__

49
xs/xsp/Object.xsp Normal file
View File

@ -0,0 +1,49 @@
%module{Slic3r::XS};
%package{Slic3r::Object::XS};
#include <list>
#include <vector>
%{
PROTOTYPES: DISABLE
std::vector<unsigned int>
get_layer_range(z_array, min_z, max_z)
std::vector<unsigned int>* 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
%}

View File

@ -1,4 +1,4 @@
%module{Slic3r::TriangleMesh::XS};
%module{Slic3r::XS};
%package{Slic3r::TriangleMesh::XS};
%{

View File

@ -1,6 +1,8 @@
%module{Slic3r::XS};
%package{Slic3r::XS};
%{
#include <myinit.h>
%{
%}

1
xs/xsp/my.map Normal file
View File

@ -0,0 +1 @@
std::map<uint32_t, uint32_t>* T_PTR

View File

@ -1,2 +1 @@
%typemap{std::string}{simple};
%typemap{std::string&}{reference};
%typemap{std::string};