The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
%module{Boost::Geometry::Utils};
%package{Boost::Geometry::Utils};

%{
#include <myinit.h>

PROTOTYPES: DISABLE

opolygon*
_polygon(my_polygon)
    polygon* my_polygon
  CODE:
    RETVAL = my_polygon;
  OUTPUT:
    RETVAL

omultipolygon*
_multi_polygon(my_multi_polygon)
    multi_polygon* my_multi_polygon
  CODE:
    RETVAL = my_multi_polygon;
  OUTPUT:
    RETVAL

polygon*
_polygon_arrayref(my_polygon)
    opolygon* my_polygon
  CODE:
    RETVAL = my_polygon;
  OUTPUT:
    RETVAL

multi_polygon*
_multi_polygon_arrayref(my_multi_polygon)
    omultipolygon* my_multi_polygon
  CODE:
    RETVAL = my_multi_polygon;
  OUTPUT:
    RETVAL

omultilinestring*
_multi_linestring(my_multi_linestring)
    multi_linestring* my_multi_linestring
  CODE:
    RETVAL = my_multi_linestring;
  OUTPUT:
    RETVAL

opolygon*
_read_wkt_polygon(wkt)
    std::string& wkt
  CODE:
    RETVAL = new polygon ();
    boost::geometry::read_wkt(wkt, *RETVAL);
  OUTPUT:
    RETVAL

omultilinestring*
_read_wkt_linestring(wkt)
    std::string& wkt
  CODE:
    RETVAL = new multi_linestring ();
    boost::geometry::read_wkt(wkt, *RETVAL);
  OUTPUT:
    RETVAL

multi_linestring*
polygon_linestring_intersection(my_polygon, my_linestring)
    opolygon* my_polygon
    omultilinestring* my_linestring
  CODE:
    RETVAL = new multi_linestring ();
    boost::geometry::intersection(*my_polygon, *my_linestring, *RETVAL);
  OUTPUT:
    RETVAL

std::string
_polygon_to_wkt(my_polygon)
    opolygon* my_polygon
  CODE:
    std::ostringstream output;
    output << boost::geometry::wkt(*my_polygon);
    RETVAL = output.str();
  OUTPUT:
    RETVAL

std::string
_multilinestring_to_wkt(mls)
    omultilinestring* mls
  CODE:
    std::ostringstream output;
    output << boost::geometry::wkt(*mls);
    RETVAL = output.str();
  OUTPUT:
    RETVAL

multi_linestring*
polygon_multi_linestring_intersection(my_polygon, my_linestring)
    polygon* my_polygon
    multi_linestring* my_linestring
  CODE:
    RETVAL = new multi_linestring ();
    boost::geometry::intersection(*my_polygon, *my_linestring, *RETVAL);
    delete my_polygon; // TODO: not sure if this is best place for this
    delete my_linestring; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

multi_linestring*
multi_polygon_multi_linestring_intersection(my_multi_polygon, my_multi_linestring)
    multi_polygon* my_multi_polygon
    multi_linestring* my_multi_linestring
  CODE:
    RETVAL = new multi_linestring ();
    boost::geometry::intersection(*my_multi_polygon, *my_multi_linestring, *RETVAL);
    delete my_multi_polygon; // TODO: not sure if this is best place for this
    delete my_multi_linestring; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

int
point_within_polygon(my_point_xy, my_polygon)
    point_xy* my_point_xy
    polygon* my_polygon
  CODE:
    RETVAL = boost::geometry::within(*my_point_xy, *my_polygon);
    delete my_polygon; // TODO: not sure if this is best place for this
    delete my_point_xy; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

int
point_covered_by_polygon(my_point_xy, my_polygon)
    point_xy* my_point_xy
    polygon* my_polygon
  CODE:
    RETVAL = boost::geometry::covered_by(*my_point_xy, *my_polygon);
    delete my_polygon; // TODO: not sure if this is best place for this
    delete my_point_xy; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

linestring*
linestring_simplify(my_linestring, tolerance)
    linestring* my_linestring
    const double tolerance
  CODE:
    RETVAL = new linestring ();
    boost::geometry::simplify(*my_linestring, *RETVAL, tolerance);
    delete my_linestring; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

multi_linestring*
multi_linestring_simplify(my_multi_linestring, tolerance)
    multi_linestring* my_multi_linestring
    const double tolerance
  CODE:
    RETVAL = new multi_linestring ();
    boost::geometry::simplify(*my_multi_linestring, *RETVAL, tolerance);
    delete my_multi_linestring; // TODO: not sure if this is best place for this
  OUTPUT:
    RETVAL

double
linestring_length(my_linestring)
    linestring* my_linestring
  CODE:
    RETVAL = boost::geometry::length(*my_linestring);
  OUTPUT:
    RETVAL

point_xy*
polygon_centroid(my_polygon)
    polygon* my_polygon
  CODE:
    RETVAL = new point_xy ();
    boost::geometry::centroid(*my_polygon, *RETVAL);
  OUTPUT:
    RETVAL

point_xy*
linestring_centroid(my_linestring)
    linestring* my_linestring
  CODE:
    RETVAL = new point_xy ();
    boost::geometry::centroid(*my_linestring, *RETVAL);
  OUTPUT:
    RETVAL

point_xy*
multi_linestring_centroid(my_multi_linestring)
    multi_linestring* my_multi_linestring
  CODE:
    RETVAL = new point_xy ();
    boost::geometry::centroid(*my_multi_linestring, *RETVAL);
  OUTPUT:
    RETVAL

polygon*
correct_polygon(my_polygon)
    polygon* my_polygon
  CODE:
    boost::geometry::correct(*my_polygon);
    RETVAL = my_polygon;
  OUTPUT:
    RETVAL

multi_polygon*
correct_multi_polygon(my_multi_polygon)
    multi_polygon* my_multi_polygon
  CODE:
    boost::geometry::correct(*my_multi_polygon);
    RETVAL = my_multi_polygon;
  OUTPUT:
    RETVAL

%}