Geo-Geos

 view release on metacpan or  search on metacpan

Geos.xs  view on Meta::CPAN

#include "xs/geos/geos.h"
#include "panda/Geos/Helper.h"
#include "panda/Geos/tesselate.h"
#include "xsi/private_typemaps.h"

using xs::my_perl;
using xs::Sv;
using namespace geos::geom;
using namespace geos::geom::prep;
using namespace geos::algorithm;
using namespace geos::noding;
using namespace geos::noding::snapround;
using namespace geos::io;
using namespace geos::index::chain;
using namespace geos::index;
using namespace geos::precision;
using namespace geos::operation::buffer;
using namespace geos::operation::distance;
using namespace geos::operation::overlay;
using namespace geos::operation::valid;
using namespace geos::operation::relate;
using namespace geos::operation::linemerge;
using namespace geos::triangulate;
using namespace xs;
using namespace Geo::Geos;
using namespace panda;

struct IntersectionFinderAdder_payload {
    using vector_t = std::vector<::geos::geom::Coordinate>;

    xs::Object lineIntersector;
    vector_t coords;
};

struct Noder_payload {
    using vector_t = std::vector<::geos::noding::SegmentString*>;

    xs::Ref array_ref;
    vector_t segments;
};


struct MonotoneChain_payload {
    std::unique_ptr<CoordinateSequence> seq;
};

struct SubItemVisitor: public geos::index::ItemVisitor {
    xs::Sub sub;
    Helper::lookup_map_t& lookup_map;

    SubItemVisitor(Sub sub_, Helper::lookup_map_t& lookup_map_):sub{sub_}, lookup_map{lookup_map_} {};
    void visitItem (void *data) {
        SV* key = static_cast<SV*>(data);
        HE* he = hv_fetch_ent(lookup_map, key, 0, 0);
        if (!he) throw ("Cannot lookup key in map");
        Scalar arg {HeVAL(he)};
        sub(arg);
    }
};

struct SVs_map_payload {
    Helper::lookup_map_t map;
    SVs_map_payload(): map{Hash::create()} {}
};

static xs::Sv::payload_marker_t payload_marker{};
static xs::Sv::payload_marker_t payload_marker_IntersectionFinderAdder{};
static xs::Sv::payload_marker_t payload_marker_Noder{};
static xs::Sv::payload_marker_t payload_marker_MonotoneChain{};
static xs::Sv::payload_marker_t payload_marker_SVs_map{};

static int payload_marker_IntersectionFinderAdder_free(pTHX_ SV*, MAGIC* mg) {
    if (mg->mg_virtual == &payload_marker_IntersectionFinderAdder) {
        auto* payload = static_cast<IntersectionFinderAdder_payload*>((void*)mg->mg_ptr);
        delete payload;
    }
    return 0;
}



( run in 2.008 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )