/* ========================================================================= * 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";