1#ifndef SQL_GIS_FUNCTOR_H_INCLUDED
2#define SQL_GIS_FUNCTOR_H_INCLUDED
105 std::stringstream ss;
170 template <
typename F>
175 switch (g1->
type()) {
177 switch (g2->
type()) {
179 return f.eval(down_cast<const Cartesian_point *>(g1),
180 down_cast<const Cartesian_point *>(g2));
182 return f.eval(down_cast<const Cartesian_point *>(g1),
183 down_cast<const Cartesian_linestring *>(g2));
185 return f.eval(down_cast<const Cartesian_point *>(g1),
186 down_cast<const Cartesian_polygon *>(g2));
189 down_cast<const Cartesian_point *>(g1),
190 down_cast<const Cartesian_geometrycollection *>(g2));
192 return f.eval(down_cast<const Cartesian_point *>(g1),
193 down_cast<const Cartesian_multipoint *>(g2));
195 return f.eval(down_cast<const Cartesian_point *>(g1),
196 down_cast<const Cartesian_multilinestring *>(g2));
198 return f.eval(down_cast<const Cartesian_point *>(g1),
199 down_cast<const Cartesian_multipolygon *>(g2));
205 switch (g2->
type()) {
207 return f.eval(down_cast<const Cartesian_linestring *>(g1),
208 down_cast<const Cartesian_point *>(g2));
210 return f.eval(down_cast<const Cartesian_linestring *>(g1),
211 down_cast<const Cartesian_linestring *>(g2));
213 return f.eval(down_cast<const Cartesian_linestring *>(g1),
214 down_cast<const Cartesian_polygon *>(g2));
217 down_cast<const Cartesian_linestring *>(g1),
218 down_cast<const Cartesian_geometrycollection *>(g2));
220 return f.eval(down_cast<const Cartesian_linestring *>(g1),
221 down_cast<const Cartesian_multipoint *>(g2));
223 return f.eval(down_cast<const Cartesian_linestring *>(g1),
224 down_cast<const Cartesian_multilinestring *>(g2));
226 return f.eval(down_cast<const Cartesian_linestring *>(g1),
227 down_cast<const Cartesian_multipolygon *>(g2));
233 switch (g2->
type()) {
235 return f.eval(down_cast<const Cartesian_polygon *>(g1),
236 down_cast<const Cartesian_point *>(g2));
238 return f.eval(down_cast<const Cartesian_polygon *>(g1),
239 down_cast<const Cartesian_linestring *>(g2));
241 return f.eval(down_cast<const Cartesian_polygon *>(g1),
242 down_cast<const Cartesian_polygon *>(g2));
245 down_cast<const Cartesian_polygon *>(g1),
246 down_cast<const Cartesian_geometrycollection *>(g2));
248 return f.eval(down_cast<const Cartesian_polygon *>(g1),
249 down_cast<const Cartesian_multipoint *>(g2));
251 return f.eval(down_cast<const Cartesian_polygon *>(g1),
252 down_cast<const Cartesian_multilinestring *>(g2));
254 return f.eval(down_cast<const Cartesian_polygon *>(g1),
255 down_cast<const Cartesian_multipolygon *>(g2));
261 switch (g2->
type()) {
264 down_cast<const Cartesian_geometrycollection *>(g1),
265 down_cast<const Cartesian_point *>(g2));
268 down_cast<const Cartesian_geometrycollection *>(g1),
269 down_cast<const Cartesian_linestring *>(g2));
272 down_cast<const Cartesian_geometrycollection *>(g1),
273 down_cast<const Cartesian_polygon *>(g2));
276 down_cast<const Cartesian_geometrycollection *>(g1),
277 down_cast<const Cartesian_geometrycollection *>(g2));
280 down_cast<const Cartesian_geometrycollection *>(g1),
281 down_cast<const Cartesian_multipoint *>(g2));
284 down_cast<const Cartesian_geometrycollection *>(g1),
285 down_cast<const Cartesian_multilinestring *>(g2));
288 down_cast<const Cartesian_geometrycollection *>(g1),
289 down_cast<const Cartesian_multipolygon *>(g2));
295 switch (g2->
type()) {
297 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
298 down_cast<const Cartesian_point *>(g2));
300 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
301 down_cast<const Cartesian_linestring *>(g2));
303 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
304 down_cast<const Cartesian_polygon *>(g2));
307 down_cast<const Cartesian_multipoint *>(g1),
308 down_cast<const Cartesian_geometrycollection *>(g2));
310 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
311 down_cast<const Cartesian_multipoint *>(g2));
313 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
314 down_cast<const Cartesian_multilinestring *>(g2));
316 return f.eval(down_cast<const Cartesian_multipoint *>(g1),
317 down_cast<const Cartesian_multipolygon *>(g2));
323 switch (g2->
type()) {
325 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
326 down_cast<const Cartesian_point *>(g2));
328 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
329 down_cast<const Cartesian_linestring *>(g2));
331 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
332 down_cast<const Cartesian_polygon *>(g2));
335 down_cast<const Cartesian_multilinestring *>(g1),
336 down_cast<const Cartesian_geometrycollection *>(g2));
338 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
339 down_cast<const Cartesian_multipoint *>(g2));
341 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
342 down_cast<const Cartesian_multilinestring *>(g2));
344 return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
345 down_cast<const Cartesian_multipolygon *>(g2));
351 switch (g2->
type()) {
353 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
354 down_cast<const Cartesian_point *>(g2));
356 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
357 down_cast<const Cartesian_linestring *>(g2));
359 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
360 down_cast<const Cartesian_polygon *>(g2));
363 down_cast<const Cartesian_multipolygon *>(g1),
364 down_cast<const Cartesian_geometrycollection *>(g2));
366 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
367 down_cast<const Cartesian_multipoint *>(g2));
369 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
370 down_cast<const Cartesian_multilinestring *>(g2));
372 return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
373 down_cast<const Cartesian_multipolygon *>(g2));
383 switch (g1->
type()) {
385 switch (g2->
type()) {
387 return f.eval(down_cast<const Geographic_point *>(g1),
388 down_cast<const Geographic_point *>(g2));
390 return f.eval(down_cast<const Geographic_point *>(g1),
391 down_cast<const Geographic_linestring *>(g2));
393 return f.eval(down_cast<const Geographic_point *>(g1),
394 down_cast<const Geographic_polygon *>(g2));
397 down_cast<const Geographic_point *>(g1),
398 down_cast<const Geographic_geometrycollection *>(g2));
400 return f.eval(down_cast<const Geographic_point *>(g1),
401 down_cast<const Geographic_multipoint *>(g2));
404 down_cast<const Geographic_point *>(g1),
405 down_cast<const Geographic_multilinestring *>(g2));
407 return f.eval(down_cast<const Geographic_point *>(g1),
408 down_cast<const Geographic_multipolygon *>(g2));
414 switch (g2->
type()) {
416 return f.eval(down_cast<const Geographic_linestring *>(g1),
417 down_cast<const Geographic_point *>(g2));
419 return f.eval(down_cast<const Geographic_linestring *>(g1),
420 down_cast<const Geographic_linestring *>(g2));
422 return f.eval(down_cast<const Geographic_linestring *>(g1),
423 down_cast<const Geographic_polygon *>(g2));
426 down_cast<const Geographic_linestring *>(g1),
427 down_cast<const Geographic_geometrycollection *>(g2));
429 return f.eval(down_cast<const Geographic_linestring *>(g1),
430 down_cast<const Geographic_multipoint *>(g2));
433 down_cast<const Geographic_linestring *>(g1),
434 down_cast<const Geographic_multilinestring *>(g2));
436 return f.eval(down_cast<const Geographic_linestring *>(g1),
437 down_cast<const Geographic_multipolygon *>(g2));
443 switch (g2->
type()) {
445 return f.eval(down_cast<const Geographic_polygon *>(g1),
446 down_cast<const Geographic_point *>(g2));
448 return f.eval(down_cast<const Geographic_polygon *>(g1),
449 down_cast<const Geographic_linestring *>(g2));
451 return f.eval(down_cast<const Geographic_polygon *>(g1),
452 down_cast<const Geographic_polygon *>(g2));
455 down_cast<const Geographic_polygon *>(g1),
456 down_cast<const Geographic_geometrycollection *>(g2));
458 return f.eval(down_cast<const Geographic_polygon *>(g1),
459 down_cast<const Geographic_multipoint *>(g2));
462 down_cast<const Geographic_polygon *>(g1),
463 down_cast<const Geographic_multilinestring *>(g2));
465 return f.eval(down_cast<const Geographic_polygon *>(g1),
466 down_cast<const Geographic_multipolygon *>(g2));
472 switch (g2->
type()) {
475 down_cast<const Geographic_geometrycollection *>(g1),
476 down_cast<const Geographic_point *>(g2));
479 down_cast<const Geographic_geometrycollection *>(g1),
480 down_cast<const Geographic_linestring *>(g2));
483 down_cast<const Geographic_geometrycollection *>(g1),
484 down_cast<const Geographic_polygon *>(g2));
487 down_cast<const Geographic_geometrycollection *>(g1),
488 down_cast<const Geographic_geometrycollection *>(g2));
491 down_cast<const Geographic_geometrycollection *>(g1),
492 down_cast<const Geographic_multipoint *>(g2));
495 down_cast<const Geographic_geometrycollection *>(g1),
496 down_cast<const Geographic_multilinestring *>(g2));
499 down_cast<const Geographic_geometrycollection *>(g1),
500 down_cast<const Geographic_multipolygon *>(g2));
506 switch (g2->
type()) {
508 return f.eval(down_cast<const Geographic_multipoint *>(g1),
509 down_cast<const Geographic_point *>(g2));
511 return f.eval(down_cast<const Geographic_multipoint *>(g1),
512 down_cast<const Geographic_linestring *>(g2));
514 return f.eval(down_cast<const Geographic_multipoint *>(g1),
515 down_cast<const Geographic_polygon *>(g2));
518 down_cast<const Geographic_multipoint *>(g1),
519 down_cast<const Geographic_geometrycollection *>(g2));
521 return f.eval(down_cast<const Geographic_multipoint *>(g1),
522 down_cast<const Geographic_multipoint *>(g2));
525 down_cast<const Geographic_multipoint *>(g1),
526 down_cast<const Geographic_multilinestring *>(g2));
528 return f.eval(down_cast<const Geographic_multipoint *>(g1),
529 down_cast<const Geographic_multipolygon *>(g2));
535 switch (g2->
type()) {
537 return f.eval(down_cast<const Geographic_multilinestring *>(g1),
538 down_cast<const Geographic_point *>(g2));
540 return f.eval(down_cast<const Geographic_multilinestring *>(g1),
541 down_cast<const Geographic_linestring *>(g2));
543 return f.eval(down_cast<const Geographic_multilinestring *>(g1),
544 down_cast<const Geographic_polygon *>(g2));
547 down_cast<const Geographic_multilinestring *>(g1),
548 down_cast<const Geographic_geometrycollection *>(g2));
550 return f.eval(down_cast<const Geographic_multilinestring *>(g1),
551 down_cast<const Geographic_multipoint *>(g2));
554 down_cast<const Geographic_multilinestring *>(g1),
555 down_cast<const Geographic_multilinestring *>(g2));
557 return f.eval(down_cast<const Geographic_multilinestring *>(g1),
558 down_cast<const Geographic_multipolygon *>(g2));
564 switch (g2->
type()) {
566 return f.eval(down_cast<const Geographic_multipolygon *>(g1),
567 down_cast<const Geographic_point *>(g2));
569 return f.eval(down_cast<const Geographic_multipolygon *>(g1),
570 down_cast<const Geographic_linestring *>(g2));
572 return f.eval(down_cast<const Geographic_multipolygon *>(g1),
573 down_cast<const Geographic_polygon *>(g2));
576 down_cast<const Geographic_multipolygon *>(g1),
577 down_cast<const Geographic_geometrycollection *>(g2));
579 return f.eval(down_cast<const Geographic_multipolygon *>(g1),
580 down_cast<const Geographic_multipoint *>(g2));
583 down_cast<const Geographic_multipolygon *>(g1),
584 down_cast<const Geographic_multilinestring *>(g2));
586 return f.eval(down_cast<const Geographic_multipolygon *>(g1),
587 down_cast<const Geographic_multipolygon *>(g2));
626 return f.eval(down_cast<const Cartesian_point &>(g));
628 return f.eval(down_cast<const Cartesian_linestring &>(g));
630 return f.eval(down_cast<const Cartesian_polygon &>(g));
632 return f.eval(down_cast<const Cartesian_geometrycollection &>(g));
634 return f.eval(down_cast<const Cartesian_multipoint &>(g));
636 return f.eval(down_cast<const Cartesian_multilinestring &>(g));
638 return f.eval(down_cast<const Cartesian_multipolygon &>(g));
649 return f.eval(down_cast<const Geographic_point &>(g));
651 return f.eval(down_cast<const Geographic_linestring &>(g));
653 return f.eval(down_cast<const Geographic_polygon &>(g));
655 return f.eval(down_cast<const Geographic_geometrycollection &>(g));
657 return f.eval(down_cast<const Geographic_multipoint &>(g));
659 return f.eval(down_cast<const Geographic_multilinestring &>(g));
661 return f.eval(down_cast<const Geographic_multipolygon &>(g));
The base class of all functors that takes two geometry arguments.
Definition: functor.h:164
virtual T operator()(const Geometry *g1, const Geometry *g2) const =0
virtual ~Functor()=default
static T apply(F &f, const Geometry *g1, const Geometry *g2)
Definition: functor.h:171
Abstract superclass for all geometric objects.
Definition: geometries.h:99
virtual Coordinate_system coordinate_system() const =0
Gets the coordinate system.
virtual Geometry_type type() const =0
Gets the geometry type of the object.
The base class of all functors that take one geometry argument.
Definition: functor.h:614
virtual T operator()(const Geometry &) const =0
virtual ~Unary_functor()=default
static T apply(F &f, const Geometry &g)
Definition: functor.h:621
Function/parameter combination not implemented exception.
Definition: functor.h:87
Srs_type
Definition: functor.h:89
@ kCartesian
Definition: functor.h:89
@ kProjected
Definition: functor.h:89
@ kGeographic
Definition: functor.h:89
const char * typenames() const
Definition: functor.h:112
Srs_type m_srs_type
Definition: functor.h:92
std::string m_typenames
Definition: functor.h:94
static not_implemented_exception for_projected(const Geometry &g1, const Geometry &g2)
Definition: functor.h:118
Srs_type srs_type() const
Definition: functor.h:111
static not_implemented_exception for_non_projected(const Geometry &g)
Definition: functor.h:123
not_implemented_exception(Srs_type srs_type, const Geometry &g1, const Geometry &g2)
Definition: functor.h:101
static not_implemented_exception for_non_projected(const Geometry &g1, const Geometry &g2)
Definition: functor.h:134
static not_implemented_exception for_projected(const Geometry &g)
Definition: functor.h:114
not_implemented_exception(Srs_type srs_type, const Geometry &g)
Definition: functor.h:96
NULL value exception.
Definition: functor.h:151
This file declares the geometry class hierarchy used by the server as the internal representation of ...
This file declares the coordinate system specific subclasses of the geometry class hierarchy.
@ kCartesian
A Cartesian plane with the same unit in both directions.
@ kGeographic
An ellipsoidal system with longitude and latitude coordinates, both in the same unit.
const char * type_to_name(Geometry_type type)
Get the type name string corresponding to a geometry type.
Definition: geometries.cc:687
Latitude out of range exception.
Definition: functor.h:69
double range_min
Definition: functor.h:71
double range_max
Definition: functor.h:72
latitude_out_of_range_exception(double value, double range_min, double range_max)
Definition: functor.h:74
double value
Definition: functor.h:70
Longitude out of range exception.
Definition: functor.h:55
longitude_out_of_range_exception(double value, double range_min, double range_max)
Definition: functor.h:60
double value
Definition: functor.h:56
double range_min
Definition: functor.h:57
double range_max
Definition: functor.h:58