MODULE = Geo::Geos                PACKAGE = Geo::Geos::Triangulate::DelaunayTriangulationBuilder
PROTOTYPES: DISABLE

Sv new(SV*, SV* geometry_factory, Sv sites, SV* tolerance = NULL) {
    auto builder = std::unique_ptr<DelaunayTriangulationBuilder>(new DelaunayTriangulationBuilder());
    GeometryFactory* factory = xs::in<GeometryFactory*>(geometry_factory);

    if (sites.is_array_ref()) {
        auto seq = std::unique_ptr<CoordinateSequence>(Helper::convert_copy(*factory, sites, 2));
        builder->setSites(*seq);
    }
    else {
        auto& g = xs::in<Geometry&>(sites);
        builder->setSites(g);
    }

    if (tolerance) {
        builder->setTolerance(Simple(tolerance));
    }

    Object wrapped = xs::out<DelaunayTriangulationBuilder*>(builder.release());
    wrapped.payload_attach(SvRV(geometry_factory), &payload_marker);
    RETVAL = wrapped.ref();
}

Sv DelaunayTriangulationBuilder::getEdges() {
    Object me{ST(0)};
    auto payload = me.payload(&payload_marker);
    GeometryFactory* factory = xs::in<GeometryFactory*>(payload.obj);
    auto edges = THIS->getEdges(*factory);
    RETVAL = Helper::uplift(edges.release());
}

Sv DelaunayTriangulationBuilder::getTriangles() {
    Object me{ST(0)};
    auto payload = me.payload(&payload_marker);
    GeometryFactory* factory = xs::in<GeometryFactory*>(payload.obj);
    auto edges = THIS->getTriangles(*factory);
    RETVAL = Helper::uplift(edges.release());
}