in sql/gis/functor.h [120:566]
static inline T apply(F &f, const Geometry *g1, const Geometry *g2) {
DBUG_ASSERT(g1->coordinate_system() == g2->coordinate_system());
switch (g1->coordinate_system()) {
case Coordinate_system::kCartesian:
switch (g1->type()) {
case Geometry_type::kPoint:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_point *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kLinestring:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_linestring *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kPolygon:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_polygon *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kGeometrycollection:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(
down_cast<const Cartesian_geometrycollection *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultipoint:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_multipoint *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultilinestring:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_multilinestring *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultipolygon:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Cartesian_multipolygon *>(g1),
down_cast<const Cartesian_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
} // switch (g1->type())
case Coordinate_system::kGeographic:
switch (g1->type()) {
case Geometry_type::kPoint:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_point *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kLinestring:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_linestring *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kPolygon:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_polygon *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kGeometrycollection:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(
down_cast<const Geographic_geometrycollection *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultipoint:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_multipoint *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultilinestring:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_multilinestring *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kMultipolygon:
switch (g2->type()) {
case Geometry_type::kPoint:
return f.eval(down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_point *>(g2));
case Geometry_type::kLinestring:
return f.eval(down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_linestring *>(g2));
case Geometry_type::kPolygon:
return f.eval(down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_polygon *>(g2));
case Geometry_type::kGeometrycollection:
return f.eval(
down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_geometrycollection *>(g2));
case Geometry_type::kMultipoint:
return f.eval(down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_multipoint *>(g2));
case Geometry_type::kMultilinestring:
return f.eval(
down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_multilinestring *>(g2));
case Geometry_type::kMultipolygon:
return f.eval(down_cast<const Geographic_multipolygon *>(g1),
down_cast<const Geographic_multipolygon *>(g2));
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
}
case Geometry_type::kGeometry:
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(),
g1->type(), g2->type());
} // switch (g1->type())
} // switch (g1->coordinate_system())
DBUG_ASSERT(false); /* purecov: inspected */
throw new not_implemented_exception(g1->coordinate_system(), g1->type(),
g2->type());
}