1
/* =========================================================================
2
* $Id: ruby.i,v 1.4.2.1 2006/04/04 09:50:17 strk Exp $
6
* Copyright 2005 Charlie Savage, cfis@interserv.com
8
* Interface for a SWIG generated geos module.
10
* This is free software; you can redistribute and/or modify it under
11
* the terms of the GNU Lesser General Public Licence as published
12
* by the Free Software Foundation.
13
* See the COPYING file for more information.
15
* ========================================================================= */
21
/* Next conflicts with a Ruby keyword */
22
%rename(next_) geos::GeometryCollectionIterator::next();
24
/* Need to deal with these ignores by renaming them */
25
%rename("build_geometry!") geos::GeometryFactory::buildGeometry(vector<Geometry * > *) const;
26
%rename("create_geometry_collection!") geos::GeometryFactory::createGeometryCollection(vector<Geometry * > *) const;
27
%rename("create_linear_ring!") geos::GeometryFactory::createLinearRing(CoordinateSequence *) const;
28
%rename("create_line_string!") geos::GeometryFactory::createLineString(CoordinateSequence *) const;
29
%rename("create_multi_line_string!") geos::GeometryFactory::createMultiLineString(vector<Geometry * > *) const;
30
%rename("create_multi_point!") geos::GeometryFactory::createMultiPoint(vector<Geometry * > *) const;
31
%rename("create_multi_polygon!") geos::GeometryFactory::createMultiPolygon(vector<Geometry * > *) const;
32
%rename("create_point!") geos::GeometryFactory::createPoint(CoordinateSequence *) const;
33
%rename("create_polygon!") geos::GeometryFactory::createPolygon(LinearRing *,vector<Geometry * > *) const;
35
/* All these classes do not follow the Ruby naming convention */
36
%rename("PlanarGraphComponent") geos::planarGraphComponent;
37
%rename("PlanarDirectedEdge") geos::planarDirectedEdge;
38
%rename("PlanarDirectedEdgeStar") geos::planarDirectedEdgeStar;
39
%rename("PlanarNode") geos::planarNode;
40
%rename("PlanarEdge") geos::planarEdge;
41
%rename("PlanarCoordLT") geos::planarCoordLT;
42
%rename("PlanarNodeMap") geos::planarNodeMap;
43
%rename("PlanarPlanarGraph") geos::planarPlanarGraph;
46
/* Ruby defines a macro called select in its win32.h header file. However,
47
the object geos::MonotoneChainSelectAction also defines a select method,
48
thus causing compilation problems. So #undef the macro. */
59
std::ostringstream os;
61
os << self->toString();
67
%extend CoordinateSequence {
70
std::ostringstream os;
71
os << "<CoordinateSequence ";
72
os << self->toString();
81
std::ostringstream os;
83
os << self->toString();
93
std::ostringstream os;
95
os << self->toString();
103
/* Geos uses vectors of pointers to pass around geometries. These will be
104
wrapped by SWIG - but we have to be careful. The problem is
105
if we put a C++ object into the vector that a Ruby object owns, when
106
that Ruby object goes out of scope the C++ object will be freed. Thus
107
the pointer inside the vector becomes corrupt. To stop this from happening
108
we have to implement a Ruby mark function, which in turn requires turning
109
on SWIG Ruby Object tracking for these containers.*/
111
// First declare mark functions for the containers
112
%markfunc std::vector<geos::Geometry *> "mark_GeometryVector";
113
%markfunc std::vector<geos::LineString *> "mark_LineStringVector";
114
%markfunc std::vector<geos::Polygon *> "mark_PolygonVector";
116
// Manually rename methods on vector to get around SWIG 1.3.29 bug
117
%rename(__len__) std::vector<geos::Geometry *>::size;
118
%rename("empty?") std::vector<geos::Geometry *>::empty;
119
%rename(push) std::vector<geos::Geometry *>::push_back;
121
%rename(__len__) std::vector<geos::LineString *>::size;
122
%rename("empty?") std::vector<geos::LineString *>::empty;
123
%rename(push) std::vector<geos::LineString *>::push_back;
125
%rename(__len__) std::vector<geos::Polygon *>::size;
126
%rename("empty?") std::vector<geos::Polygon *>::empty;
127
%rename(push) std::vector<geos::Polygon *>::push_back;
129
// Now define the containers
130
%template("GeometryVector") std::vector<geos::Geometry *>;
131
%template("LineStringVector") std::vector<geos::LineString *>;
132
%template("PolygonVector") std::vector<geos::Polygon *>;
135
// Now track the objects that go go into the containers, which
136
// is Geometry or any class inherited from Geometry
137
%trackobjects geos::Geometry;
138
%trackobjects geos::Point;
139
%trackobjects geos::LineString;
140
%trackobjects geos::LinearRing;
141
%trackobjects geos::Polygon;
142
%trackobjects geos::GeometryCollection;
143
%trackobjects geos::MultiPoint;
144
%trackobjects geos::MultiLineString;
145
%trackobjects geos::MultiPolygon;
147
// Last define the mark functions
149
static void mark_GeometryVector(void* ptr)
151
typedef std::vector<geos::Geometry *> GeometryVector;
152
typedef GeometryVector::iterator GeometryVectorIter;
154
GeometryVector *vec = reinterpret_cast<GeometryVector*>(ptr);
155
GeometryVectorIter iter = vec->begin();
156
GeometryVectorIter last = vec->end();
158
for(; iter != last; ++iter)
160
geos::Geometry *geometry = *iter;
161
VALUE object = SWIG_RubyInstanceFor(geometry);
168
// This should not happen
169
rb_raise(rb_eRuntimeError, "Unknown object stored in vector");
174
static void mark_LineStringVector(void* ptr)
176
typedef std::vector<geos::LineString *> LineStringVector;
177
typedef LineStringVector::iterator LineStringVectorIter;
179
LineStringVector *vec = reinterpret_cast<LineStringVector*>(ptr);
180
LineStringVectorIter iter = vec->begin();
181
LineStringVectorIter last = vec->end();
183
for(; iter != last; ++iter)
185
geos::LineString *geometry = *iter;
186
VALUE object = SWIG_RubyInstanceFor(geometry);
193
// This should not happen
194
rb_raise(rb_eRuntimeError, "Unknown object stored in vector");
199
static void mark_PolygonVector(void* ptr)
201
typedef std::vector<geos::Polygon *> PolygonVector;
202
typedef PolygonVector::iterator PolygonVectorIter;
204
PolygonVector *vec = reinterpret_cast<PolygonVector*>(ptr);
205
PolygonVectorIter iter = vec->begin();
206
PolygonVectorIter last = vec->end();
208
for(; iter != last; ++iter)
210
geos::Polygon *geometry = *iter;
211
VALUE object = SWIG_RubyInstanceFor(geometry);
218
// This should not happen
219
rb_raise(rb_eRuntimeError, "Unknown object stored in vector");