rgeo 2.3.1 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,58 +10,13 @@
10
10
 
11
11
  RGEO_BEGIN_C
12
12
 
13
- /*
14
- Per-interpreter globals.
15
- Most of these are cached references to commonly used classes, modules,
16
- and symbols so we don't have to do a lot of constant lookups and calls
17
- to rb_intern.
18
- */
19
- typedef struct {
20
- VALUE feature_module;
21
- VALUE feature_geometry;
22
- VALUE feature_point;
23
- VALUE feature_line_string;
24
- VALUE feature_linear_ring;
25
- VALUE feature_line;
26
- VALUE feature_polygon;
27
- VALUE feature_geometry_collection;
28
- VALUE feature_multi_point;
29
- VALUE feature_multi_line_string;
30
- VALUE feature_multi_polygon;
31
- VALUE geos_module;
32
- VALUE geos_geometry;
33
- VALUE geos_point;
34
- VALUE geos_line_string;
35
- VALUE geos_linear_ring;
36
- VALUE geos_line;
37
- VALUE geos_polygon;
38
- VALUE geos_geometry_collection;
39
- VALUE geos_multi_point;
40
- VALUE geos_multi_line_string;
41
- VALUE geos_multi_polygon;
42
- ID id_cast;
43
- ID id_eql;
44
- ID id_generate;
45
- ID id_enum_for;
46
- ID id_hash;
47
- VALUE sym_force_new;
48
- VALUE sym_keep_subtype;
49
- #ifndef RGEO_GEOS_SUPPORTS_SETOUTPUTDIMENSION
50
- VALUE psych_wkt_generator;
51
- VALUE marshal_wkb_generator;
52
- #endif
53
- } RGeo_Globals;
54
-
55
-
56
13
  /*
57
14
  Wrapped structure for Factory objects.
58
15
  A factory encapsulates the GEOS context, and GEOS serializer settings.
59
16
  It also stores the SRID for all geometries created by this factory,
60
17
  and the resolution for buffers created for this factory's geometries.
61
- Finally, it provides easy access to the globals.
62
18
  */
63
19
  typedef struct {
64
- RGeo_Globals* globals;
65
20
  GEOSContextHandle_t geos_context;
66
21
  GEOSWKTReader* wkt_reader;
67
22
  GEOSWKBReader* wkb_reader;
@@ -119,18 +74,30 @@ typedef struct {
119
74
  } RGeo_GeometryData;
120
75
 
121
76
 
77
+ // Data types which indicate how RGeo types should be managed by Ruby.
78
+ extern const rb_data_type_t rgeo_factory_type;
79
+
80
+ extern const rb_data_type_t rgeo_geometry_type;
81
+
82
+
83
+ // Convenient macros for checking the type of data from Ruby
84
+ #define RGEO_FACTORY_TYPEDDATA_P(object) (_RGEO_TYPEDDATA_P(object, &rgeo_factory_type))
85
+ #define RGEO_GEOMETRY_TYPEDDATA_P(object) (_RGEO_TYPEDDATA_P(object, &rgeo_geometry_type))
86
+
87
+ #define _RGEO_TYPEDDATA_P(object, data_type) (TYPE(object) == T_DATA && RTYPEDDATA(object)->typed_flag == 1 && RTYPEDDATA(object)->type == data_type)
88
+
122
89
  // Returns the RGeo_FactoryData* given a ruby Factory object
123
- #define RGEO_FACTORY_DATA_PTR(factory) ((RGeo_FactoryData*)DATA_PTR(factory))
90
+ #define RGEO_FACTORY_DATA_PTR(factory) ((RGeo_FactoryData*)RTYPEDDATA_DATA(factory))
124
91
 
125
92
  // Returns the RGeo_GeometryData* given a ruby Geometry object
126
- #define RGEO_GEOMETRY_DATA_PTR(geometry) ((RGeo_GeometryData*)DATA_PTR(geometry))
93
+ #define RGEO_GEOMETRY_DATA_PTR(geometry) ((RGeo_GeometryData*)RTYPEDDATA_DATA(geometry))
127
94
 
128
95
 
129
96
  /*
130
97
  Initializes the factory module. This should be called first in the
131
98
  initialization process.
132
99
  */
133
- RGeo_Globals* rgeo_init_geos_factory();
100
+ void rgeo_init_geos_factory();
134
101
 
135
102
  /*
136
103
  Given a GEOS geometry handle, wraps it in a ruby Geometry object of the
@@ -11,6 +11,8 @@
11
11
  #include <ruby.h>
12
12
  #include <geos_c.h>
13
13
 
14
+ #include "globals.h"
15
+
14
16
  #include "factory.h"
15
17
  #include "geometry.h"
16
18
 
@@ -180,13 +182,11 @@ static VALUE method_geometry_geometry_type(VALUE self)
180
182
  {
181
183
  VALUE result;
182
184
  RGeo_GeometryData* self_data;
183
- const GEOSGeometry* self_geom;
184
185
 
185
186
  result = Qnil;
186
187
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
187
- self_geom = self_data->geom;
188
- if (self_geom) {
189
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_geometry;
188
+ if (self_data->geom) {
189
+ result = rgeo_feature_geometry_module;
190
190
  }
191
191
  return result;
192
192
  }
@@ -271,7 +271,7 @@ static VALUE method_geometry_as_text(VALUE self)
271
271
  factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
272
272
  wkt_generator = factory_data->wkrep_wkt_generator;
273
273
  if (!NIL_P(wkt_generator)) {
274
- result = rb_funcall(wkt_generator, factory_data->globals->id_generate, 1, self);
274
+ result = rb_funcall(wkt_generator, rb_intern("generate"), 1, self);
275
275
  }
276
276
  else {
277
277
  wkt_writer = factory_data->wkt_writer;
@@ -310,7 +310,7 @@ static VALUE method_geometry_as_binary(VALUE self)
310
310
  factory_data = RGEO_FACTORY_DATA_PTR(self_data->factory);
311
311
  wkb_generator = factory_data->wkrep_wkb_generator;
312
312
  if (!NIL_P(wkb_generator)) {
313
- result = rb_funcall(wkb_generator, factory_data->globals->id_generate, 1, self);
313
+ result = rb_funcall(wkb_generator, rb_intern("generate"), 1, self);
314
314
  }
315
315
  else {
316
316
  wkb_writer = factory_data->wkb_writer;
@@ -1075,11 +1075,11 @@ static VALUE method_geometry_point_on_surface(VALUE self)
1075
1075
  /**** INITIALIZATION FUNCTION ****/
1076
1076
 
1077
1077
 
1078
- void rgeo_init_geos_geometry(RGeo_Globals* globals)
1078
+ void rgeo_init_geos_geometry()
1079
1079
  {
1080
1080
  VALUE geos_geometry_methods;
1081
1081
 
1082
- geos_geometry_methods = rb_define_module_under(globals->geos_module, "CAPIGeometryMethods");
1082
+ geos_geometry_methods = rb_define_module_under(rgeo_geos_module, "CAPIGeometryMethods");
1083
1083
 
1084
1084
  rb_define_method(geos_geometry_methods, "factory=", method_geometry_set_factory, 1);
1085
1085
  rb_define_method(geos_geometry_methods, "initialize_copy", method_geometry_initialize_copy, 1);
@@ -6,8 +6,6 @@
6
6
  #ifndef RGEO_GEOS_GEOMETRY_INCLUDED
7
7
  #define RGEO_GEOS_GEOMETRY_INCLUDED
8
8
 
9
- #include "factory.h"
10
-
11
9
  RGEO_BEGIN_C
12
10
 
13
11
 
@@ -15,7 +13,7 @@ RGEO_BEGIN_C
15
13
  Initializes the geometry module. This should be called after the factory
16
14
  module is initialized, but before any of the other modules.
17
15
  */
18
- void rgeo_init_geos_geometry(RGeo_Globals* globals);
16
+ void rgeo_init_geos_geometry();
19
17
 
20
18
 
21
19
  RGEO_END_C
@@ -10,6 +10,8 @@
10
10
  #include <ruby.h>
11
11
  #include <geos_c.h>
12
12
 
13
+ #include "globals.h"
14
+
13
15
  #include "factory.h"
14
16
  #include "geometry.h"
15
17
  #include "line_string.h"
@@ -56,13 +58,13 @@ static VALUE create_geometry_collection(VALUE module, int type, VALUE factory, V
56
58
  cast_type = Qnil;
57
59
  switch (type) {
58
60
  case GEOS_MULTIPOINT:
59
- cast_type = factory_data->globals->feature_point;
61
+ cast_type = rgeo_feature_point_module;
60
62
  break;
61
63
  case GEOS_MULTILINESTRING:
62
- cast_type = factory_data->globals->feature_line_string;
64
+ cast_type = rgeo_feature_line_string_module;
63
65
  break;
64
66
  case GEOS_MULTIPOLYGON:
65
- cast_type = factory_data->globals->feature_polygon;
67
+ cast_type = rgeo_feature_polygon_module;
66
68
  break;
67
69
  }
68
70
  for (i=0; i<len; ++i) {
@@ -156,8 +158,7 @@ static VALUE method_geometry_collection_hash(VALUE self)
156
158
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
157
159
  factory = self_data->factory;
158
160
  hash = rb_hash_start(0);
159
- hash = rgeo_geos_objbase_hash(factory,
160
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_geometry_collection, hash);
161
+ hash = rgeo_geos_objbase_hash(factory, rgeo_feature_geometry_collection_module, hash);
161
162
  hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
162
163
  return LONG2FIX(rb_hash_end(hash));
163
164
  }
@@ -171,7 +172,7 @@ static VALUE method_geometry_collection_geometry_type(VALUE self)
171
172
  result = Qnil;
172
173
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
173
174
  if (self_data->geom) {
174
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_geometry_collection;
175
+ result = rgeo_feature_geometry_collection_module;
175
176
  }
176
177
  return result;
177
178
  }
@@ -239,6 +240,8 @@ static VALUE method_geometry_collection_brackets(VALUE self, VALUE n)
239
240
 
240
241
  static VALUE method_geometry_collection_each(VALUE self)
241
242
  {
243
+ RETURN_ENUMERATOR(self, 0, 0); /* return enum_for(__callee__) unless block_given? */
244
+
242
245
  RGeo_GeometryData* self_data;
243
246
  const GEOSGeometry* self_geom;
244
247
  int len;
@@ -249,27 +252,22 @@ static VALUE method_geometry_collection_each(VALUE self)
249
252
 
250
253
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
251
254
 
252
- if (rb_block_given_p()) {
253
- self_geom = self_data->geom;
254
- if (self_geom) {
255
- GEOSContextHandle_t self_context = self_data->geos_context;
256
- len = GEOSGetNumGeometries_r(self_context, self_geom);
257
- if (len > 0) {
258
- klasses = self_data->klasses;
259
- for (i=0; i<len; ++i) {
260
- elem_geom = GEOSGetGeometryN_r(self_context, self_geom, i);
261
- elem = rgeo_wrap_geos_geometry_clone(self_data->factory, elem_geom, NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
262
- if (!NIL_P(elem)) {
263
- rb_yield(elem);
264
- }
255
+ self_geom = self_data->geom;
256
+ if (self_geom) {
257
+ GEOSContextHandle_t self_context = self_data->geos_context;
258
+ len = GEOSGetNumGeometries_r(self_context, self_geom);
259
+ if (len > 0) {
260
+ klasses = self_data->klasses;
261
+ for (i=0; i<len; ++i) {
262
+ elem_geom = GEOSGetGeometryN_r(self_context, self_geom, i);
263
+ elem = rgeo_wrap_geos_geometry_clone(self_data->factory, elem_geom, NIL_P(klasses) ? Qnil : rb_ary_entry(klasses, i));
264
+ if (!NIL_P(elem)) {
265
+ rb_yield(elem);
265
266
  }
266
267
  }
267
268
  }
268
- return self;
269
- }
270
- else {
271
- return rb_funcall(self, RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->id_enum_for, 0);
272
269
  }
270
+ return self;
273
271
  }
274
272
 
275
273
  static VALUE method_multi_point_geometry_type(VALUE self)
@@ -280,7 +278,7 @@ static VALUE method_multi_point_geometry_type(VALUE self)
280
278
  result = Qnil;
281
279
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
282
280
  if (self_data->geom) {
283
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_point;
281
+ result = rgeo_feature_multi_point_module;
284
282
  }
285
283
  return result;
286
284
  }
@@ -295,8 +293,7 @@ static VALUE method_multi_point_hash(VALUE self)
295
293
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
296
294
  factory = self_data->factory;
297
295
  hash = rb_hash_start(0);
298
- hash = rgeo_geos_objbase_hash(factory,
299
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_point, hash);
296
+ hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_point_module, hash);
300
297
  hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
301
298
  return LONG2FIX(rb_hash_end(hash));
302
299
  }
@@ -342,7 +339,7 @@ static VALUE method_multi_line_string_geometry_type(VALUE self)
342
339
  result = Qnil;
343
340
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
344
341
  if (self_data->geom) {
345
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_line_string;
342
+ result = rgeo_feature_multi_line_string_module;
346
343
  }
347
344
  return result;
348
345
  }
@@ -357,8 +354,7 @@ static VALUE method_multi_line_string_hash(VALUE self)
357
354
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
358
355
  factory = self_data->factory;
359
356
  hash = rb_hash_start(0);
360
- hash = rgeo_geos_objbase_hash(factory,
361
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_line_string, hash);
357
+ hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_line_string_module, hash);
362
358
  hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
363
359
  return LONG2FIX(rb_hash_end(hash));
364
360
  }
@@ -396,7 +392,7 @@ static VALUE method_multi_line_string_coordinates(VALUE self)
396
392
 
397
393
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
398
394
  self_geom = self_data->geom;
399
-
395
+
400
396
  if(self_geom) {
401
397
  zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
402
398
  context = self_data->geos_context;
@@ -472,7 +468,7 @@ static VALUE method_multi_polygon_geometry_type(VALUE self)
472
468
  result = Qnil;
473
469
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
474
470
  if (self_data->geom) {
475
- result = RGEO_FACTORY_DATA_PTR(self_data->factory)->globals->feature_multi_polygon;
471
+ result = rgeo_feature_multi_polygon_module;
476
472
  }
477
473
  return result;
478
474
  }
@@ -487,8 +483,7 @@ static VALUE method_multi_polygon_hash(VALUE self)
487
483
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
488
484
  factory = self_data->factory;
489
485
  hash = rb_hash_start(0);
490
- hash = rgeo_geos_objbase_hash(factory,
491
- RGEO_FACTORY_DATA_PTR(factory)->globals->feature_multi_polygon, hash);
486
+ hash = rgeo_geos_objbase_hash(factory, rgeo_feature_multi_polygon_module, hash);
492
487
  hash = rgeo_geos_geometry_collection_hash(self_data->geos_context, self_data->geom, hash);
493
488
  return LONG2FIX(rb_hash_end(hash));
494
489
  }
@@ -508,7 +503,7 @@ static VALUE method_multi_polygon_coordinates(VALUE self)
508
503
 
509
504
  self_data = RGEO_GEOMETRY_DATA_PTR(self);
510
505
  self_geom = self_data->geom;
511
-
506
+
512
507
  if(self_geom) {
513
508
  zCoordinate = RGEO_FACTORY_DATA_PTR(self_data->factory)->flags & RGEO_FACTORYFLAGS_SUPPORTS_Z_OR_M;
514
509
  context = self_data->geos_context;
@@ -586,7 +581,7 @@ static VALUE cmethod_multi_polygon_create(VALUE module, VALUE factory, VALUE arr
586
581
  /**** INITIALIZATION FUNCTION ****/
587
582
 
588
583
 
589
- void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
584
+ void rgeo_init_geos_geometry_collection()
590
585
  {
591
586
  VALUE geos_geometry_collection_methods;
592
587
  VALUE geos_multi_point_methods;
@@ -594,13 +589,13 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
594
589
  VALUE geos_multi_polygon_methods;
595
590
 
596
591
  // Class methods for geometry collection classes
597
- rb_define_module_function(globals->geos_geometry_collection, "create", cmethod_geometry_collection_create, 2);
598
- rb_define_module_function(globals->geos_multi_point, "create", cmethod_multi_point_create, 2);
599
- rb_define_module_function(globals->geos_multi_line_string, "create", cmethod_multi_line_string_create, 2);
600
- rb_define_module_function(globals->geos_multi_polygon, "create", cmethod_multi_polygon_create, 2);
592
+ rb_define_module_function(rgeo_geos_geometry_collection_class, "create", cmethod_geometry_collection_create, 2);
593
+ rb_define_module_function(rgeo_geos_multi_point_class, "create", cmethod_multi_point_create, 2);
594
+ rb_define_module_function(rgeo_geos_multi_line_string_class, "create", cmethod_multi_line_string_create, 2);
595
+ rb_define_module_function(rgeo_geos_multi_polygon_class, "create", cmethod_multi_polygon_create, 2);
601
596
 
602
597
  // Methods for GeometryCollectionImpl
603
- geos_geometry_collection_methods = rb_define_module_under(globals->geos_module, "CAPIGeometryCollectionMethods");
598
+ geos_geometry_collection_methods = rb_define_module_under(rgeo_geos_module, "CAPIGeometryCollectionMethods");
604
599
  rb_define_method(geos_geometry_collection_methods, "rep_equals?", method_geometry_collection_eql, 1);
605
600
  rb_define_method(geos_geometry_collection_methods, "eql?", method_geometry_collection_eql, 1);
606
601
  rb_define_method(geos_geometry_collection_methods, "hash", method_geometry_collection_hash, 0);
@@ -614,13 +609,13 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
614
609
 
615
610
 
616
611
  // Methods for MultiPointImpl
617
- geos_multi_point_methods = rb_define_module_under(globals->geos_module, "CAPIMultiPointMethods");
612
+ geos_multi_point_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiPointMethods");
618
613
  rb_define_method(geos_multi_point_methods, "geometry_type", method_multi_point_geometry_type, 0);
619
614
  rb_define_method(geos_multi_point_methods, "hash", method_multi_point_hash, 0);
620
615
  rb_define_method(geos_multi_point_methods, "coordinates", method_multi_point_coordinates, 0);
621
616
 
622
617
  // Methods for MultiLineStringImpl
623
- geos_multi_line_string_methods = rb_define_module_under(globals->geos_module, "CAPIMultiLineStringMethods");
618
+ geos_multi_line_string_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiLineStringMethods");
624
619
  rb_define_method(geos_multi_line_string_methods, "geometry_type", method_multi_line_string_geometry_type, 0);
625
620
  rb_define_method(geos_multi_line_string_methods, "length", method_multi_line_string_length, 0);
626
621
  rb_define_method(geos_multi_line_string_methods, "closed?", method_multi_line_string_is_closed, 0);
@@ -628,7 +623,7 @@ void rgeo_init_geos_geometry_collection(RGeo_Globals* globals)
628
623
  rb_define_method(geos_multi_line_string_methods, "coordinates", method_multi_line_string_coordinates, 0);
629
624
 
630
625
  // Methods for MultiPolygonImpl
631
- geos_multi_polygon_methods = rb_define_module_under(globals->geos_module, "CAPIMultiPolygonMethods");
626
+ geos_multi_polygon_methods = rb_define_module_under(rgeo_geos_module, "CAPIMultiPolygonMethods");
632
627
  rb_define_method(geos_multi_polygon_methods, "geometry_type", method_multi_polygon_geometry_type, 0);
633
628
  rb_define_method(geos_multi_polygon_methods, "area", method_multi_polygon_area, 0);
634
629
  rb_define_method(geos_multi_polygon_methods, "centroid", method_multi_polygon_centroid, 0);
@@ -9,8 +9,6 @@
9
9
  #include <ruby.h>
10
10
  #include <geos_c.h>
11
11
 
12
- #include "factory.h"
13
-
14
12
  RGEO_BEGIN_C
15
13
 
16
14
 
@@ -18,7 +16,7 @@ RGEO_BEGIN_C
18
16
  Initializes the geometry collection module. This should be called after
19
17
  the geometry module is initialized.
20
18
  */
21
- void rgeo_init_geos_geometry_collection(RGeo_Globals* globals);
19
+ void rgeo_init_geos_geometry_collection();
22
20
 
23
21
  /*
24
22
  Comopares the contents of two geometry collections. Does not test the
@@ -0,0 +1,91 @@
1
+ #include "preface.h"
2
+
3
+ #ifdef RGEO_GEOS_SUPPORTED
4
+
5
+ #include <ruby.h>
6
+
7
+ #include "globals.h"
8
+
9
+ RGEO_BEGIN_C
10
+
11
+ VALUE rgeo_module;
12
+
13
+ VALUE rgeo_feature_module;
14
+ VALUE rgeo_feature_geometry_module;
15
+ VALUE rgeo_feature_point_module;
16
+ VALUE rgeo_feature_line_string_module;
17
+ VALUE rgeo_feature_linear_ring_module;
18
+ VALUE rgeo_feature_line_module;
19
+ VALUE rgeo_feature_polygon_module;
20
+ VALUE rgeo_feature_geometry_collection_module;
21
+ VALUE rgeo_feature_multi_point_module;
22
+ VALUE rgeo_feature_multi_line_string_module;
23
+ VALUE rgeo_feature_multi_polygon_module;
24
+
25
+ VALUE rgeo_geos_module;
26
+ VALUE rgeo_geos_geometry_class;
27
+ VALUE rgeo_geos_point_class;
28
+ VALUE rgeo_geos_line_string_class;
29
+ VALUE rgeo_geos_linear_ring_class;
30
+ VALUE rgeo_geos_line_class;
31
+ VALUE rgeo_geos_polygon_class;
32
+ VALUE rgeo_geos_geometry_collection_class;
33
+ VALUE rgeo_geos_multi_point_class;
34
+ VALUE rgeo_geos_multi_line_string_class;
35
+ VALUE rgeo_geos_multi_polygon_class;
36
+
37
+ void rgeo_init_geos_globals()
38
+ {
39
+ rgeo_module = rb_define_module("RGeo");
40
+ rb_gc_register_mark_object(rgeo_module);
41
+
42
+ rgeo_feature_module = rb_define_module_under(rgeo_module, "Feature");
43
+ rb_gc_register_mark_object(rgeo_feature_module);
44
+ rgeo_feature_geometry_module = rb_const_get_at(rgeo_feature_module, rb_intern("Geometry"));
45
+ rb_gc_register_mark_object(rgeo_feature_geometry_module);
46
+ rgeo_feature_point_module = rb_const_get_at(rgeo_feature_module, rb_intern("Point"));
47
+ rb_gc_register_mark_object(rgeo_feature_point_module);
48
+ rgeo_feature_line_string_module = rb_const_get_at(rgeo_feature_module, rb_intern("LineString"));
49
+ rb_gc_register_mark_object(rgeo_feature_line_string_module);
50
+ rgeo_feature_linear_ring_module = rb_const_get_at(rgeo_feature_module, rb_intern("LinearRing"));
51
+ rb_gc_register_mark_object(rgeo_feature_linear_ring_module);
52
+ rgeo_feature_line_module = rb_const_get_at(rgeo_feature_module, rb_intern("Line"));
53
+ rb_gc_register_mark_object(rgeo_feature_line_module);
54
+ rgeo_feature_polygon_module = rb_const_get_at(rgeo_feature_module, rb_intern("Polygon"));
55
+ rb_gc_register_mark_object(rgeo_feature_polygon_module);
56
+ rgeo_feature_geometry_collection_module = rb_const_get_at(rgeo_feature_module, rb_intern("GeometryCollection"));
57
+ rb_gc_register_mark_object(rgeo_feature_geometry_collection_module);
58
+ rgeo_feature_multi_point_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiPoint"));
59
+ rb_gc_register_mark_object(rgeo_feature_multi_point_module);
60
+ rgeo_feature_multi_line_string_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiLineString"));
61
+ rb_gc_register_mark_object(rgeo_feature_multi_line_string_module);
62
+ rgeo_feature_multi_polygon_module = rb_const_get_at(rgeo_feature_module, rb_intern("MultiPolygon"));
63
+ rb_gc_register_mark_object(rgeo_feature_multi_polygon_module);
64
+
65
+ rgeo_geos_module = rb_define_module_under(rgeo_module, "Geos");
66
+ rb_gc_register_mark_object(rgeo_geos_module);
67
+ rgeo_geos_geometry_class = rb_define_class_under(rgeo_geos_module, "CAPIGeometryImpl", rb_cObject);
68
+ rb_gc_register_mark_object(rgeo_geos_geometry_class);
69
+ rgeo_geos_point_class = rb_define_class_under(rgeo_geos_module, "CAPIPointImpl", rb_cObject);
70
+ rb_gc_register_mark_object(rgeo_geos_point_class);
71
+ rgeo_geos_line_string_class = rb_define_class_under(rgeo_geos_module, "CAPILineStringImpl", rb_cObject);
72
+ rb_gc_register_mark_object(rgeo_geos_line_string_class);
73
+ rgeo_geos_linear_ring_class = rb_define_class_under(rgeo_geos_module, "CAPILinearRingImpl", rb_cObject);
74
+ rb_gc_register_mark_object(rgeo_geos_linear_ring_class);
75
+ rgeo_geos_line_class = rb_define_class_under(rgeo_geos_module, "CAPILineImpl", rb_cObject);
76
+ rb_gc_register_mark_object(rgeo_geos_line_class);
77
+ rgeo_geos_polygon_class = rb_define_class_under(rgeo_geos_module, "CAPIPolygonImpl", rb_cObject);
78
+ rb_gc_register_mark_object(rgeo_geos_polygon_class);
79
+ rgeo_geos_geometry_collection_class = rb_define_class_under(rgeo_geos_module, "CAPIGeometryCollectionImpl", rb_cObject);
80
+ rb_gc_register_mark_object(rgeo_geos_geometry_collection_class);
81
+ rgeo_geos_multi_point_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiPointImpl", rb_cObject);
82
+ rb_gc_register_mark_object(rgeo_geos_multi_point_class);
83
+ rgeo_geos_multi_line_string_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiLineStringImpl", rb_cObject);
84
+ rb_gc_register_mark_object(rgeo_geos_multi_line_string_class);
85
+ rgeo_geos_multi_polygon_class = rb_define_class_under(rgeo_geos_module, "CAPIMultiPolygonImpl", rb_cObject);
86
+ rb_gc_register_mark_object(rgeo_geos_multi_polygon_class);
87
+ }
88
+
89
+ RGEO_END_C
90
+
91
+ #endif
@@ -0,0 +1,45 @@
1
+ /*
2
+ Per-interpreter globals.
3
+ Most of these are cached references to commonly used classes, modules,
4
+ and symbols so we don't have to do a lot of constant lookups and calls
5
+ to rb_intern.
6
+ */
7
+
8
+ #ifndef RGEO_GEOS_GLOBALS_INCLUDED
9
+ #define RGEO_GEOS_GLOBALS_INCLUDED
10
+
11
+ #include <ruby.h>
12
+
13
+ RGEO_BEGIN_C
14
+
15
+ extern VALUE rgeo_module;
16
+
17
+ extern VALUE rgeo_feature_module;
18
+ extern VALUE rgeo_feature_geometry_module;
19
+ extern VALUE rgeo_feature_point_module;
20
+ extern VALUE rgeo_feature_line_string_module;
21
+ extern VALUE rgeo_feature_linear_ring_module;
22
+ extern VALUE rgeo_feature_line_module;
23
+ extern VALUE rgeo_feature_polygon_module;
24
+ extern VALUE rgeo_feature_geometry_collection_module;
25
+ extern VALUE rgeo_feature_multi_point_module;
26
+ extern VALUE rgeo_feature_multi_line_string_module;
27
+ extern VALUE rgeo_feature_multi_polygon_module;
28
+
29
+ extern VALUE rgeo_geos_module;
30
+ extern VALUE rgeo_geos_geometry_class;
31
+ extern VALUE rgeo_geos_point_class;
32
+ extern VALUE rgeo_geos_line_string_class;
33
+ extern VALUE rgeo_geos_linear_ring_class;
34
+ extern VALUE rgeo_geos_line_class;
35
+ extern VALUE rgeo_geos_polygon_class;
36
+ extern VALUE rgeo_geos_geometry_collection_class;
37
+ extern VALUE rgeo_geos_multi_point_class;
38
+ extern VALUE rgeo_geos_multi_line_string_class;
39
+ extern VALUE rgeo_geos_multi_polygon_class;
40
+
41
+ void rgeo_init_geos_globals();
42
+
43
+ RGEO_END_C
44
+
45
+ #endif