#ifndef bgu_line2av_h_
#define bgu_line2av_h_
#include "myinit.h"
#include <boost/geometry/algorithms/num_points.hpp>
SV*
linestring2perl(pTHX_ const linestring& ls)
{
AV* av = newAV();
const unsigned int line_len = boost::geometry::num_points(ls);
av_extend(av, line_len-1);
for (int i = 0; i < line_len; i++) {
AV* pointav = newAV();
av_store(av, i, newRV_noinc((SV*)pointav));
av_fill(pointav, 1);
av_store_point_xy(pointav, ls[i].x(), ls[i].y());
}
return (SV*)newRV_noinc((SV*)av);
}
linestring*
perl2linestring(pTHX_ AV* theAv)
{
using boost::geometry::make;
const unsigned int len = av_len(theAv)+1;
if (len == 0)
return NULL;
linestring* retval = new 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;
}
innerav = (AV*)SvRV(*elem);
retval->push_back(av_fetch_point_xy(innerav));
}
return retval;
}
#endif