my.map 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. coordf_t T_NV
  2. std::string T_STD_STRING
  3. t_config_option_key T_STD_STRING
  4. t_model_material_id T_STD_STRING
  5. std::vector<std::string> T_STD_VECTOR_STD_STRING
  6. std::vector<int> T_STD_VECTOR_INT
  7. std::vector<Points::size_type> T_STD_VECTOR_INT
  8. std::vector<size_t> T_STD_VECTOR_INT
  9. std::vector<unsigned int> T_STD_VECTOR_UINT
  10. std::vector<double> T_STD_VECTOR_DOUBLE
  11. t_layer_height_ranges T_LAYER_HEIGHT_RANGES
  12. BoundingBox* O_OBJECT_SLIC3R
  13. Ref<BoundingBox> O_OBJECT_SLIC3R_T
  14. Clone<BoundingBox> O_OBJECT_SLIC3R_T
  15. BoundingBoxf* O_OBJECT_SLIC3R
  16. Ref<BoundingBoxf> O_OBJECT_SLIC3R_T
  17. Clone<BoundingBoxf> O_OBJECT_SLIC3R_T
  18. BoundingBoxf3* O_OBJECT_SLIC3R
  19. Ref<BoundingBoxf3> O_OBJECT_SLIC3R_T
  20. Clone<BoundingBoxf3> O_OBJECT_SLIC3R_T
  21. DynamicPrintConfig* O_OBJECT_SLIC3R
  22. Ref<DynamicPrintConfig> O_OBJECT_SLIC3R_T
  23. StaticPrintConfig* O_OBJECT_SLIC3R
  24. Ref<StaticPrintConfig> O_OBJECT_SLIC3R_T
  25. PrintObjectConfig* O_OBJECT_SLIC3R
  26. Ref<PrintObjectConfig> O_OBJECT_SLIC3R_T
  27. PrintRegionConfig* O_OBJECT_SLIC3R
  28. Ref<PrintRegionConfig> O_OBJECT_SLIC3R_T
  29. GCodeConfig* O_OBJECT_SLIC3R
  30. Ref<GCodeConfig> O_OBJECT_SLIC3R_T
  31. PrintConfig* O_OBJECT_SLIC3R
  32. Ref<PrintConfig> O_OBJECT_SLIC3R_T
  33. FullPrintConfig* O_OBJECT_SLIC3R
  34. Ref<FullPrintConfig> O_OBJECT_SLIC3R_T
  35. ZTable* O_OBJECT
  36. TriangleMesh* O_OBJECT_SLIC3R
  37. Ref<TriangleMesh> O_OBJECT_SLIC3R_T
  38. Clone<TriangleMesh> O_OBJECT_SLIC3R_T
  39. Point* O_OBJECT_SLIC3R
  40. Ref<Point> O_OBJECT_SLIC3R_T
  41. Clone<Point> O_OBJECT_SLIC3R_T
  42. Point3* O_OBJECT_SLIC3R
  43. Ref<Point3> O_OBJECT_SLIC3R_T
  44. Clone<Point3> O_OBJECT_SLIC3R_T
  45. Pointf* O_OBJECT_SLIC3R
  46. Ref<Pointf> O_OBJECT_SLIC3R_T
  47. Clone<Pointf> O_OBJECT_SLIC3R_T
  48. Pointf3* O_OBJECT_SLIC3R
  49. Ref<Pointf3> O_OBJECT_SLIC3R_T
  50. Clone<Pointf3> O_OBJECT_SLIC3R_T
  51. Line* O_OBJECT_SLIC3R
  52. Ref<Line> O_OBJECT_SLIC3R_T
  53. Clone<Line> O_OBJECT_SLIC3R_T
  54. Linef3* O_OBJECT_SLIC3R
  55. Ref<Linef3> O_OBJECT_SLIC3R_T
  56. Clone<Linef3> O_OBJECT_SLIC3R_T
  57. Polyline* O_OBJECT_SLIC3R
  58. Ref<Polyline> O_OBJECT_SLIC3R_T
  59. Clone<Polyline> O_OBJECT_SLIC3R_T
  60. PolylineCollection* O_OBJECT_SLIC3R
  61. Ref<PolylineCollection> O_OBJECT_SLIC3R_T
  62. Clone<PolylineCollection> O_OBJECT_SLIC3R_T
  63. Polygon* O_OBJECT_SLIC3R
  64. Ref<Polygon> O_OBJECT_SLIC3R_T
  65. Clone<Polygon> O_OBJECT_SLIC3R_T
  66. ExPolygon* O_OBJECT_SLIC3R
  67. Ref<ExPolygon> O_OBJECT_SLIC3R_T
  68. Clone<ExPolygon> O_OBJECT_SLIC3R_T
  69. ExPolygonCollection* O_OBJECT_SLIC3R
  70. Ref<ExPolygonCollection> O_OBJECT_SLIC3R_T
  71. Clone<ExPolygonCollection> O_OBJECT_SLIC3R_T
  72. ExtrusionEntityCollection* O_OBJECT_SLIC3R
  73. Ref<ExtrusionEntityCollection> O_OBJECT_SLIC3R_T
  74. Clone<ExtrusionEntityCollection> O_OBJECT_SLIC3R_T
  75. ExtrusionMultiPath* O_OBJECT_SLIC3R
  76. Ref<ExtrusionMultiPath> O_OBJECT_SLIC3R_T
  77. Clone<ExtrusionMultiPath> O_OBJECT_SLIC3R_T
  78. ExtrusionPath* O_OBJECT_SLIC3R
  79. Ref<ExtrusionPath> O_OBJECT_SLIC3R_T
  80. Clone<ExtrusionPath> O_OBJECT_SLIC3R_T
  81. ExtrusionLoop* O_OBJECT_SLIC3R
  82. Ref<ExtrusionLoop> O_OBJECT_SLIC3R_T
  83. Clone<ExtrusionLoop> O_OBJECT_SLIC3R_T
  84. ExtrusionSimulator* O_OBJECT_SLIC3R
  85. Ref<ExtrusionSimulator> O_OBJECT_SLIC3R_T
  86. Clone<ExtrusionSimulator> O_OBJECT_SLIC3R_T
  87. Filler* O_OBJECT_SLIC3R
  88. Ref<Filler> O_OBJECT_SLIC3R_T
  89. Clone<Filler> O_OBJECT_SLIC3R_T
  90. Flow* O_OBJECT_SLIC3R
  91. Ref<Flow> O_OBJECT_SLIC3R_T
  92. Clone<Flow> O_OBJECT_SLIC3R_T
  93. PrintState* O_OBJECT_SLIC3R
  94. Ref<PrintState> O_OBJECT_SLIC3R_T
  95. Surface* O_OBJECT_SLIC3R
  96. Ref<Surface> O_OBJECT_SLIC3R_T
  97. Clone<Surface> O_OBJECT_SLIC3R_T
  98. SurfaceCollection* O_OBJECT_SLIC3R
  99. Ref<SurfaceCollection> O_OBJECT_SLIC3R_T
  100. Model* O_OBJECT_SLIC3R
  101. Ref<Model> O_OBJECT_SLIC3R_T
  102. Clone<Model> O_OBJECT_SLIC3R_T
  103. ModelMaterial* O_OBJECT_SLIC3R
  104. Ref<ModelMaterial> O_OBJECT_SLIC3R_T
  105. Clone<ModelMaterial> O_OBJECT_SLIC3R_T
  106. ModelObject* O_OBJECT_SLIC3R
  107. Ref<ModelObject> O_OBJECT_SLIC3R_T
  108. Clone<ModelObject> O_OBJECT_SLIC3R_T
  109. ModelVolume* O_OBJECT_SLIC3R
  110. Ref<ModelVolume> O_OBJECT_SLIC3R_T
  111. Clone<ModelVolume> O_OBJECT_SLIC3R_T
  112. ModelInstance* O_OBJECT_SLIC3R
  113. Ref<ModelInstance> O_OBJECT_SLIC3R_T
  114. Clone<ModelInstance> O_OBJECT_SLIC3R_T
  115. PrintRegion* O_OBJECT_SLIC3R
  116. Ref<PrintRegion> O_OBJECT_SLIC3R_T
  117. PrintObject* O_OBJECT_SLIC3R
  118. Ref<PrintObject> O_OBJECT_SLIC3R_T
  119. Print* O_OBJECT_SLIC3R
  120. Ref<Print> O_OBJECT_SLIC3R_T
  121. Clone<Print> O_OBJECT_SLIC3R_T
  122. LayerRegion* O_OBJECT_SLIC3R
  123. Ref<LayerRegion> O_OBJECT_SLIC3R_T
  124. Layer* O_OBJECT_SLIC3R
  125. Ref<Layer> O_OBJECT_SLIC3R_T
  126. SupportLayer* O_OBJECT_SLIC3R
  127. Ref<SupportLayer> O_OBJECT_SLIC3R_T
  128. PlaceholderParser* O_OBJECT_SLIC3R
  129. Ref<PlaceholderParser> O_OBJECT_SLIC3R_T
  130. Clone<PlaceholderParser> O_OBJECT_SLIC3R_T
  131. CoolingBuffer* O_OBJECT_SLIC3R
  132. Ref<CoolingBuffer> O_OBJECT_SLIC3R_T
  133. Clone<CoolingBuffer> O_OBJECT_SLIC3R_T
  134. GCode* O_OBJECT_SLIC3R
  135. Ref<GCode> O_OBJECT_SLIC3R_T
  136. Clone<GCode> O_OBJECT_SLIC3R_T
  137. MotionPlanner* O_OBJECT_SLIC3R
  138. Ref<MotionPlanner> O_OBJECT_SLIC3R_T
  139. Clone<MotionPlanner> O_OBJECT_SLIC3R_T
  140. GCodeSender* O_OBJECT_SLIC3R
  141. Ref<GCodeSender> O_OBJECT_SLIC3R_T
  142. Clone<GCodeSender> O_OBJECT_SLIC3R_T
  143. BridgeDetector* O_OBJECT_SLIC3R
  144. Ref<BridgeDetector> O_OBJECT_SLIC3R_T
  145. Clone<BridgeDetector> O_OBJECT_SLIC3R_T
  146. PerimeterGenerator* O_OBJECT_SLIC3R
  147. Ref<PerimeterGenerator> O_OBJECT_SLIC3R_T
  148. Clone<PerimeterGenerator> O_OBJECT_SLIC3R_T
  149. PrintObjectSupportMaterial* O_OBJECT_SLIC3R
  150. Ref<PrintObjectSupportMaterial> O_OBJECT_SLIC3R_T
  151. Clone<PrintObjectSupportMaterial> O_OBJECT_SLIC3R_T
  152. GLShader* O_OBJECT_SLIC3R
  153. Ref<GLShader> O_OBJECT_SLIC3R_T
  154. GLVolume* O_OBJECT_SLIC3R
  155. Ref<GLVolume> O_OBJECT_SLIC3R_T
  156. GLVolumeCollection* O_OBJECT_SLIC3R
  157. Ref<GLVolumeCollection> O_OBJECT_SLIC3R_T
  158. Axis T_UV
  159. ExtrusionLoopRole T_UV
  160. ExtrusionRole T_UV
  161. ExtrusionSimulationType T_UV
  162. FlowRole T_UV
  163. PrintStep T_UV
  164. PrintObjectStep T_UV
  165. SurfaceType T_UV
  166. ClipperLib::JoinType T_UV
  167. ClipperLib::PolyFillType T_UV
  168. # we return these types whenever we want the items to be cloned
  169. Points T_ARRAYREF
  170. Pointfs T_ARRAYREF
  171. Lines T_ARRAYREF
  172. Polygons T_ARRAYREF
  173. Polylines T_ARRAYREF
  174. ExPolygons T_ARRAYREF
  175. ExtrusionPaths T_ARRAYREF
  176. Surfaces T_ARRAYREF
  177. # we return these types whenever we want the items to be returned
  178. # by reference and marked ::Ref because they're contained in another
  179. # Perl object
  180. Polygons* T_ARRAYREF_PTR
  181. ModelObjectPtrs* T_PTR_ARRAYREF_PTR
  182. ModelVolumePtrs* T_PTR_ARRAYREF_PTR
  183. ModelInstancePtrs* T_PTR_ARRAYREF_PTR
  184. PrintRegionPtrs* T_PTR_ARRAYREF_PTR
  185. PrintObjectPtrs* T_PTR_ARRAYREF_PTR
  186. LayerPtrs* T_PTR_ARRAYREF_PTR
  187. SupportLayerPtrs* T_PTR_ARRAYREF_PTR
  188. # we return these types whenever we want the items to be returned
  189. # by reference and not marked ::Ref because they're newly allocated
  190. # and not referenced by any Perl object
  191. TriangleMeshPtrs T_PTR_ARRAYREF
  192. INPUT
  193. T_STD_STRING
  194. {
  195. size_t len;
  196. // const char * c = SvPV($arg, len);
  197. // Always convert strings to UTF-8 before passing them to XS
  198. const char * c = SvPVutf8($arg, len);
  199. $var = std::string(c, len);
  200. }
  201. T_STD_VECTOR_STD_STRING
  202. if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
  203. AV* av = (AV*)SvRV($arg);
  204. const unsigned int alen = av_len(av)+1;
  205. $var = std::vector<std::string>(alen);
  206. STRLEN len;
  207. char* tmp;
  208. SV** elem;
  209. for (unsigned int i = 0; i < alen; i++) {
  210. elem = av_fetch(av, i, 0);
  211. if (elem != NULL) {
  212. tmp = SvPV(*elem, len);
  213. ${var}[i] = std::string(tmp, len);
  214. }
  215. else
  216. ${var}[i] = std::string(\"\");
  217. }
  218. }
  219. else
  220. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  221. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  222. \"$var\");
  223. T_STD_VECTOR_INT
  224. if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
  225. AV* av = (AV*)SvRV($arg);
  226. const unsigned int len = av_len(av)+1;
  227. $var = std::vector<int>(len);
  228. SV** elem;
  229. for (unsigned int i = 0; i < len; i++) {
  230. elem = av_fetch(av, i, 0);
  231. if (elem != NULL)
  232. ${var}[i] = SvIV(*elem);
  233. else
  234. ${var}[i] = 0;
  235. }
  236. }
  237. else
  238. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  239. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  240. \"$var\");
  241. T_STD_VECTOR_UINT
  242. if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
  243. AV* av = (AV*)SvRV($arg);
  244. const unsigned int len = av_len(av)+1;
  245. $var = std::vector<unsigned int>(len);
  246. SV** elem;
  247. for (unsigned int i = 0; i < len; i++) {
  248. elem = av_fetch(av, i, 0);
  249. if (elem != NULL)
  250. ${var}[i] = SvUV(*elem);
  251. else
  252. ${var}[i] = 0;
  253. }
  254. }
  255. else
  256. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  257. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  258. \"$var\");
  259. T_STD_VECTOR_DOUBLE
  260. if (SvROK($arg) && SvTYPE(SvRV($arg))==SVt_PVAV) {
  261. AV* av = (AV*)SvRV($arg);
  262. const unsigned int len = av_len(av)+1;
  263. $var = std::vector<double>(len);
  264. SV** elem;
  265. for (unsigned int i = 0; i < len; i++) {
  266. elem = av_fetch(av, i, 0);
  267. if (elem != NULL)
  268. ${var}[i] = SvNV(*elem);
  269. else
  270. ${var}[i] = 0.;
  271. }
  272. }
  273. else
  274. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  275. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  276. \"$var\");
  277. O_OBJECT_SLIC3R
  278. if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) ) {
  279. if ( sv_isa($arg, Slic3r::perl_class_name($var) ) || sv_isa($arg, Slic3r::perl_class_name_ref($var) )) {
  280. $var = ($type)SvIV((SV*)SvRV( $arg ));
  281. } else {
  282. croak(\"$var is not of type %s (got %s)\", Slic3r::perl_class_name($var), HvNAME(SvSTASH(SvRV($arg))));
  283. XSRETURN_UNDEF;
  284. }
  285. } else {
  286. warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
  287. XSRETURN_UNDEF;
  288. }
  289. T_ARRAYREF
  290. if (SvROK($arg) && SvTYPE(SvRV($arg)) == SVt_PVAV) {
  291. AV* av = (AV*)SvRV($arg);
  292. const unsigned int len = av_len(av)+1;
  293. $var.resize(len);
  294. for (unsigned int i = 0; i < len; i++) {
  295. SV** elem = av_fetch(av, i, 0);
  296. from_SV_check(*elem, &$var\[i]);
  297. }
  298. } else
  299. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  300. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  301. \"$var\");
  302. T_LAYER_HEIGHT_RANGES
  303. {
  304. if (!SvROK($arg) || SvTYPE(SvRV($arg)) != SVt_PVAV) {
  305. Perl_croak(aTHX_ \"%s: %s is not an array reference\",
  306. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  307. \"$var\");
  308. }
  309. AV* av = (AV*)SvRV($arg);
  310. const unsigned int len = av_len(av)+1;
  311. t_layer_height_ranges tmp_ranges;
  312. for (unsigned int i = 0; i < len; i++) {
  313. SV* elem = *av_fetch(av, i, 0);
  314. if (!SvROK(elem) || SvTYPE(SvRV(elem)) != SVt_PVAV) {
  315. Perl_croak(
  316. aTHX_ \"%s: %s contains something that is not an array reference\",
  317. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  318. \"$var\");
  319. }
  320. AV* elemAV = (AV*)SvRV(elem);
  321. if (av_len(elemAV) + 1 != 3) {
  322. Perl_croak(
  323. aTHX_ \"%s: %s contains an array that isn't 3 elements long\",
  324. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]},
  325. \"$var\");
  326. }
  327. coordf_t vals[3];
  328. for (unsigned int j = 0; j < 3; ++j) {
  329. SV *elem_elem = *av_fetch(elemAV, j, 0);
  330. if (!looks_like_number(elem_elem)) {
  331. Perl_croak(
  332. aTHX_ \"%s: layer ranges and heights must be numbers\",
  333. ${$ALIAS?\q[GvNAME(CvGV(cv))]:\qq[\"$pname\"]});
  334. }
  335. vals[j] = SvNV(elem_elem);
  336. }
  337. tmp_ranges[t_layer_height_range(vals[0], vals[1])] = vals[2];
  338. }
  339. $var = tmp_ranges;
  340. }
  341. OUTPUT
  342. T_STD_STRING
  343. $arg = newSVpvn_utf8( $var.c_str(), $var.length(), true );
  344. T_STD_VECTOR_STD_STRING
  345. AV* av = newAV();
  346. $arg = newRV_noinc((SV*)av);
  347. sv_2mortal($arg);
  348. const unsigned int len = $var.size();
  349. if (len)
  350. av_extend(av, len-1);
  351. for (unsigned int i = 0; i < len; i++) {
  352. const std::string& str = ${var}[i];
  353. STRLEN len = str.length();
  354. av_store(av, i, newSVpvn_utf8(str.c_str(), len, true));
  355. }
  356. T_STD_VECTOR_INT
  357. AV* av = newAV();
  358. $arg = newRV_noinc((SV*)av);
  359. sv_2mortal($arg);
  360. const unsigned int len = $var.size();
  361. if (len)
  362. av_extend(av, len-1);
  363. for (unsigned int i = 0; i < len; i++) {
  364. av_store(av, i, newSViv(${var}[i]));
  365. }
  366. T_STD_VECTOR_UINT
  367. AV* av = newAV();
  368. $arg = newRV_noinc((SV*)av);
  369. sv_2mortal($arg);
  370. const unsigned int len = $var.size();
  371. if (len)
  372. av_extend(av, len-1);
  373. for (unsigned int i = 0; i < len; i++) {
  374. av_store(av, i, newSVuv(${var}[i]));
  375. }
  376. T_STD_VECTOR_DOUBLE
  377. AV* av = newAV();
  378. $arg = newRV_noinc((SV*)av);
  379. sv_2mortal($arg);
  380. const unsigned int len = $var.size();
  381. if (len)
  382. av_extend(av, len-1);
  383. for (unsigned int i = 0; i < len; i++) {
  384. av_store(av, i, newSVnv(${var}[i]));
  385. }
  386. # return object from pointer
  387. O_OBJECT_SLIC3R
  388. if ($var == NULL)
  389. XSRETURN_UNDEF;
  390. sv_setref_pv( $arg, Slic3r::perl_class_name($var), (void*)$var );
  391. # return value handled by template class
  392. O_OBJECT_SLIC3R_T
  393. if ($var == NULL)
  394. XSRETURN_UNDEF;
  395. sv_setref_pv( $arg, $type\::CLASS(), (void*)$var );
  396. T_ARRAYREF
  397. AV* av = newAV();
  398. $arg = newRV_noinc((SV*)av);
  399. sv_2mortal($arg);
  400. const unsigned int len = $var.size();
  401. if (len > 0) av_extend(av, len-1);
  402. int i = 0;
  403. for (${type}::const_iterator it = $var.begin(); it != $var.end(); ++it) {
  404. av_store(av, i++, perl_to_SV_clone_ref(*it));
  405. }
  406. T_ARRAYREF_PTR
  407. AV* av = newAV();
  408. $arg = newRV_noinc((SV*)av);
  409. sv_2mortal($arg);
  410. const unsigned int len = $var->size();
  411. if (len > 0) av_extend(av, len-1);
  412. int i = 0;
  413. for (${ my $t = $type; $t =~ s/\*$//; \$t }::iterator it = $var->begin(); it != $var->end(); ++it) {
  414. av_store(av, i++, perl_to_SV_ref(*it));
  415. }
  416. T_PTR_ARRAYREF_PTR
  417. AV* av = newAV();
  418. $arg = newRV_noinc((SV*)av);
  419. sv_2mortal($arg);
  420. const unsigned int len = $var->size();
  421. if (len > 0) av_extend(av, len-1);
  422. int i = 0;
  423. for (${ my $t = $type; $t =~ s/\*$//; \$t }::iterator it = $var->begin(); it != $var->end(); ++it) {
  424. av_store(av, i++, perl_to_SV_ref(**it));
  425. }
  426. T_PTR_ARRAYREF
  427. AV* av = newAV();
  428. $arg = newRV_noinc((SV*)av);
  429. sv_2mortal($arg);
  430. const unsigned int len = $var.size();
  431. if (len > 0) av_extend(av, len-1);
  432. int i = 0;
  433. for (${type}::iterator it = $var.begin(); it != $var.end(); ++it) {
  434. av_store(av, i++, to_SV(*it));
  435. }
  436. T_LAYER_HEIGHT_RANGES
  437. AV* av = newAV();
  438. $arg = newRV_noinc((SV*)av);
  439. sv_2mortal($arg);
  440. const unsigned int len = $var.size();
  441. if (len > 0) av_extend(av, len-1);
  442. // map is sorted, so we can just copy it in order
  443. int i = 0;
  444. for (${type}::iterator it = $var.begin(); it != $var.end(); ++it) {
  445. const coordf_t range_values[] = {
  446. it->first.first, // key's first = minz
  447. it->first.second, // key's second = maxz
  448. it->second, // value = height
  449. };
  450. AV *rangeAV = newAV();
  451. av_extend(rangeAV, 2);
  452. for (int j = 0; j < 3; ++j) {
  453. av_store(rangeAV, j, newSVnv(range_values[j]));
  454. }
  455. av_store(av, i++, (SV*)newRV_noinc((SV*)rangeAV));
  456. }