diff --git a/xs/Build.PL b/xs/Build.PL index e3e65199c..d68c3fa9e 100644 --- a/xs/Build.PL +++ b/xs/Build.PL @@ -44,7 +44,7 @@ my $build = Module::Build::WithXSpp->new( # Provides extra C typemaps that are auto-merged extra_typemap_modules => { - 'ExtUtils::Typemaps::Default' => '1.03', + 'ExtUtils::Typemaps::Basic' => '1.05', }, # for MSVC builds diff --git a/xs/xsp/TriangleMesh.xsp b/xs/xsp/TriangleMesh.xsp index 989719331..122a84f48 100644 --- a/xs/xsp/TriangleMesh.xsp +++ b/xs/xsp/TriangleMesh.xsp @@ -149,11 +149,10 @@ TriangleMesh::size() SV* TriangleMesh::slice(z) - std::vector* z + std::vector z CODE: // convert doubles to floats - std::vector z_f(z->begin(), z->end()); - delete z; + std::vector z_f(z.begin(), z.end()); std::vector layers; TriangleMeshSlicer mslicer(THIS); diff --git a/xs/xsp/my.map b/xs/xsp/my.map index f7858ad9c..b154488ae 100644 --- a/xs/xsp/my.map +++ b/xs/xsp/my.map @@ -1,11 +1,20 @@ coordf_t T_NV -std::vector T_STD_VECTOR_INT -std::vector T_STD_VECTOR_INT +std::string T_STD_STRING +t_config_option_key T_STD_STRING +t_model_material_id T_STD_STRING -t_config_option_key T_STD_STRING -t_model_material_id T_STD_STRING -t_layer_height_ranges T_LAYER_HEIGHT_RANGES +std::vector T_STD_VECTOR_STD_STRING + +std::vector T_STD_VECTOR_INT +std::vector T_STD_VECTOR_INT +std::vector T_STD_VECTOR_INT + +std::vector T_STD_VECTOR_UINT + +std::vector T_STD_VECTOR_DOUBLE + +t_layer_height_ranges T_LAYER_HEIGHT_RANGES BoundingBox* O_OBJECT_SLIC3R @@ -208,6 +217,93 @@ TriangleMeshPtrs T_PTR_ARRAYREF INPUT +T_STD_STRING + { + size_t len; + const char * c = SvPV($arg, len); + $var = std::string(c, len); + } + +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_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_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_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\"); + O_OBJECT_SLIC3R if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) { if ( sv_isa($arg, perl_class_name($var) ) || sv_isa($arg, perl_class_name_ref($var) )) { @@ -285,6 +381,52 @@ T_LAYER_HEIGHT_RANGES OUTPUT + +T_STD_STRING + $arg = newSVpvn_utf8( $var.c_str(), $var.length(), true ); + +T_STD_VECTOR_STD_STRING + AV* av = newAV(); + $arg = newRV_noinc((SV*)av); + const unsigned int len = $var.size(); + if (len) + 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, newSVpvn_utf8(str.c_str(), len, true)); + } + +T_STD_VECTOR_INT + AV* av = newAV(); + $arg = newRV_noinc((SV*)av); + const unsigned int len = $var.size(); + if (len) + 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(); + if (len) + av_extend(av, len-1); + for (unsigned int i = 0; i < len; i++) { + av_store(av, i, newSVuv(${var}[i])); + } + +T_STD_VECTOR_DOUBLE + AV* av = newAV(); + $arg = newRV_noinc((SV*)av); + const unsigned int len = $var.size(); + if (len) + av_extend(av, len-1); + for (unsigned int i = 0; i < len; i++) { + av_store(av, i, newSVnv(${var}[i])); + } + # return object from pointer O_OBJECT_SLIC3R if ($var == NULL)