177 строки
5.3 KiB
OpenEdge ABL
177 строки
5.3 KiB
OpenEdge ABL
/* =========================================================================
|
|
* Copyright 2005-2007 Charlie Savage, cfis@interserv.com
|
|
*
|
|
* Interface for a SWIG generated geos module.
|
|
*
|
|
* This is free software; you can redistribute and/or modify it under
|
|
* the terms of the GNU Lesser General Public Licence as published
|
|
* by the Free Software Foundation.
|
|
* See the COPYING file for more information.
|
|
*
|
|
* ========================================================================= */
|
|
|
|
%rename("dimensions") GeosCoordinateSequence::getDimensions;
|
|
|
|
%rename("srid") GeosGeometry::getSRID;
|
|
%rename("srid=") GeosGeometry::setSRID;
|
|
%rename("envelope") GeosGeometry::getEnvelope;
|
|
|
|
%rename("read_hex") GeosWkbReader::readHEX;
|
|
%rename("write_hex") GeosWkbWriter::writeHEX;
|
|
%rename("output_dimensions") GeosWkbWriter::getOutputDimension;
|
|
%rename("output_dimensions=") GeosWkbWriter::setOutputDimension;
|
|
%rename("byte_order") GeosWkbWriter::getByteOrder;
|
|
%rename("byte_order=") GeosWkbWriter::setByteOrder;
|
|
%rename("include_srid") GeosWkbWriter::getIncludeSRID;
|
|
%rename("include_srid=") GeosWkbWriter::setIncludeSRID;
|
|
|
|
%rename("__len__") GeosCoordinateSequence::getSize;
|
|
|
|
%rename("coord_seq") GeosPoint::getCoordSeq;
|
|
%rename("coord_seq") GeosLineString::getCoordSeq;
|
|
%rename("coord_seq") GeosLinearRing::getCoordSeq;
|
|
|
|
%rename("exterior_ring") GeosPolygon::getExteriorRing;
|
|
%rename("num_interior_rings") GeosPolygon::getNumInteriorRings;
|
|
%rename("interior_ring_n") GeosPolygon::getInteriorRingN;
|
|
|
|
// Use predicates to make the ruby code nicer - so disjoint?
|
|
%predicate GeosGeometry::disjoint;
|
|
%predicate GeosGeometry::touches;
|
|
%predicate GeosGeometry::intersects;
|
|
%predicate GeosGeometry::crosses;
|
|
%predicate GeosGeometry::within;
|
|
%predicate GeosGeometry::contains;
|
|
%predicate GeosGeometry::overlaps;
|
|
|
|
// Use ruby naming conventions for equals
|
|
%rename("eql?") GeosGeometry::equals;
|
|
%alias GeosGeometry::equals "==";
|
|
%rename("eql_exact?") GeosGeometry::equalsExact;
|
|
%rename("dimensions") GeosGeometry::getDimensions;
|
|
%rename("num_geometries") GeosGeometry::getNumGeometries;
|
|
|
|
|
|
%rename("centroid") GeosGeometry::getCentroid;
|
|
%alias GeosGeometry::getCentroid "center"
|
|
|
|
%rename("empty?") GeosGeometry::isEmpty;
|
|
%rename("valid?") GeosGeometry::isValid;
|
|
%rename("simple?") GeosGeometry::isSimple;
|
|
%rename("ring?") GeosGeometry::isRing;
|
|
%rename("has_z?") GeosGeometry::hasZ;
|
|
|
|
/* Convert a Ruby array of GeosLinearRings to a C array. */
|
|
%typemap(in,numinputs=1) (GeosLinearRing **holes, size_t nholes)
|
|
{
|
|
if (NIL_P($input))
|
|
{
|
|
$1 = NULL;
|
|
$2 = 0;
|
|
}
|
|
else
|
|
{
|
|
/* Make sure the input can be treated as an array. */
|
|
Check_Type($input, T_ARRAY);
|
|
|
|
/* Get the length */
|
|
$2 = RARRAY_LEN($input);
|
|
|
|
/* Allocate space for the C array. */
|
|
$1 = (GeosLinearRing**) malloc($2*sizeof(GeosLinearRing*));
|
|
|
|
for(size_t i = 0; i<$2; i++)
|
|
{
|
|
/* Get the Ruby Object */
|
|
VALUE item = rb_ary_entry($input,i);
|
|
|
|
/* Get the underlying pointer and give up ownership of it. */
|
|
GeosLinearRing *ring = NULL;
|
|
int convertResult = SWIG_ConvertPtr(item, (void**)&ring, $descriptor(GeosLinearRing*), SWIG_POINTER_DISOWN);
|
|
if (!SWIG_IsOK(convertResult)) {
|
|
SWIG_exception_fail(SWIG_ArgError(convertResult), "in method '" "createPolygon" "', argument " "1"" of type '" "GeosLinearRing *""'");
|
|
}
|
|
|
|
/* Put the pointer in the array */
|
|
$1[i] = ring;
|
|
}
|
|
}
|
|
}
|
|
|
|
%typemap(freearg) (GeosLinearRing **holes, size_t nholes)
|
|
{
|
|
if ($1) {
|
|
free((void*) $1);
|
|
}
|
|
}
|
|
|
|
// GeosPreparedGeometry
|
|
// Use predicates to make the ruby code nicer - so disjoint?
|
|
%rename("contains_properly?") GeosPreparedGeometry::containsProperly;
|
|
%predicate GeosPreparedGeometry::contains;
|
|
%predicate GeosPreparedGeometry::intersects;
|
|
%predicate GeosPreparedGeometry::covers;
|
|
|
|
// GeosSTRtree
|
|
|
|
%rename("each") GeosSTRtree::iterate;
|
|
|
|
%typemap(in) GeosIndexItem
|
|
{
|
|
$1 = (GeosIndexItem) $input;
|
|
}
|
|
|
|
/* accumulator will be blissfully unused because
|
|
* Ruby supports closures, more or less */
|
|
%typemap(in,numinputs=0) (GeosIndexItem accumulator)
|
|
{
|
|
$1 = (GeosIndexItem) Qnil;
|
|
}
|
|
|
|
/* typecheck GeosIndexItem and make sure it's really a VALUE */
|
|
%typemap(typecheck) GeosIndexItem
|
|
{
|
|
$1 = (TYPE($input) & T_MASK) ? 1 : 0;
|
|
}
|
|
|
|
/* always call the provided block as the query callback */
|
|
%typemap(in,numinputs=0) GeosQueryCallback
|
|
{
|
|
$1 = GeosSTRtree_query_callback;
|
|
}
|
|
|
|
%typemap(typecheck) GeosQueryCallback
|
|
{
|
|
/* SWIG throws a warning if we don't do this */
|
|
$1 = 1;
|
|
}
|
|
|
|
%{
|
|
/* this callback yields the data item to the block */
|
|
static void GeosSTRtree_query_callback (void *data, void *nothing) {
|
|
if (rb_block_given_p()) {
|
|
rb_yield((VALUE) data);
|
|
}
|
|
}
|
|
%}
|
|
|
|
/* assuming that GeosIndexItems are all VALUEs (since this gets tested
|
|
* on typemap(in)), mark them during the mark phase of GC to hang on to them */
|
|
%{
|
|
static void GeosSTRtree_mark_item (void *data, void *nothing)
|
|
{
|
|
if ((VALUE) data != Qnil) {
|
|
rb_gc_mark((VALUE)data);
|
|
}
|
|
}
|
|
|
|
static void mark_GeosSTRtree(void *self)
|
|
{
|
|
GEOSSTRtree *tree = (GEOSSTRtree *) self;
|
|
GEOSSTRtree_iterate(tree, GeosSTRtree_mark_item, NULL);
|
|
}
|
|
%}
|
|
|
|
%markfunc GeosSTRtree "mark_GeosSTRtree";
|
|
|