#ifndef bgu_mline2av_h_ #define bgu_mline2av_h_ #include "myinit.h" #include SV* multi_linestring2perl(pTHX_ const multi_linestring& mls) { AV* av = newAV(); const unsigned int size = mls.size(); av_extend(av, size-1); for (int i = 0; i < size; i++) { AV* lineav = newAV(); linestring ls = mls[i]; av_store(av, i, newRV_noinc((SV*)lineav)); av_fill(lineav, 1); const unsigned int line_len = boost::geometry::num_points(ls); for (int j = 0; j < line_len; j++) { AV* pointav = newAV(); av_store(lineav, j, newRV_noinc((SV*)pointav)); av_fill(pointav, 1); av_store_point_xy(pointav, ls[j].x(), ls[j].y()); } } return (SV*)newRV_noinc((SV*)av); } void add_line(AV* theAv, multi_linestring* mls) { using boost::geometry::make; const unsigned int len = av_len(theAv)+1; SV** elem; AV* innerav; linestring ls; for (unsigned int i = 0; i < len; i++) { elem = av_fetch(theAv, i, 0); if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV || av_len((AV*)SvRV(*elem)) < 1) { return; } innerav = (AV*)SvRV(*elem); ls.push_back(av_fetch_point_xy(innerav)); } mls->push_back(ls); } multi_linestring* perl2multi_linestring(pTHX_ AV* theAv) { const unsigned int len = av_len(theAv)+1; multi_linestring* retval = new multi_linestring(); SV** elem; AV* innerav; for (unsigned int i = 0; i < len; i++) { elem = av_fetch(theAv, i, 0); if (!SvROK(*elem) || SvTYPE(SvRV(*elem)) != SVt_PVAV || av_len((AV*)SvRV(*elem)) < 1) { delete retval; return NULL; } add_line((AV*)SvRV(*elem), retval); } return retval; } #endif