Imported Upstream version 1.72.0
[platform/upstream/boost.git] / boost / geometry / algorithms / detail / equals / implementation.hpp
index f39ae0b..4088478 100644 (file)
@@ -5,8 +5,8 @@
 // Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
 // Copyright (c) 2014-2015 Adam Wulkiewicz, Lodz, Poland.
 
-// This file was modified by Oracle on 2014, 2015, 2016, 2017, 2018.
-// Modifications copyright (c) 2014-2018 Oracle and/or its affiliates.
+// This file was modified by Oracle on 2014, 2015, 2016, 2017, 2018, 2019.
+// Modifications copyright (c) 2014-2019 Oracle and/or its affiliates.
 
 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
@@ -275,6 +275,15 @@ private:
     }
 };
 
+struct equals_always_false
+{
+    template <typename Geometry1, typename Geometry2, typename Strategy>
+    static inline bool apply(Geometry1 const& , Geometry2 const& , Strategy const& )
+    {
+        return false;
+    }
+};
+
 
 }} // namespace detail::equals
 #endif // DOXYGEN_NO_DETAIL
@@ -285,81 +294,92 @@ namespace dispatch
 {
 
 template <typename P1, typename P2, std::size_t DimensionCount, bool Reverse>
-struct equals<P1, P2, point_tag, point_tag, DimensionCount, Reverse>
+struct equals<P1, P2, point_tag, point_tag, pointlike_tag, pointlike_tag, DimensionCount, Reverse>
     : detail::equals::point_point<0, DimensionCount>
 {};
 
 template <typename MultiPoint1, typename MultiPoint2, std::size_t DimensionCount, bool Reverse>
-struct equals<MultiPoint1, MultiPoint2, multi_point_tag, multi_point_tag, DimensionCount, Reverse>
+struct equals<MultiPoint1, MultiPoint2, multi_point_tag, multi_point_tag, pointlike_tag, pointlike_tag, DimensionCount, Reverse>
     : detail::equals::equals_by_relate<MultiPoint1, MultiPoint2>
 {};
 
 template <typename MultiPoint, typename Point, std::size_t DimensionCount, bool Reverse>
-struct equals<Point, MultiPoint, point_tag, multi_point_tag, DimensionCount, Reverse>
+struct equals<Point, MultiPoint, point_tag, multi_point_tag, pointlike_tag, pointlike_tag, DimensionCount, Reverse>
     : detail::equals::equals_by_relate<Point, MultiPoint>
 {};
 
 template <typename Box1, typename Box2, std::size_t DimensionCount, bool Reverse>
-struct equals<Box1, Box2, box_tag, box_tag, DimensionCount, Reverse>
+struct equals<Box1, Box2, box_tag, box_tag, areal_tag, areal_tag, DimensionCount, Reverse>
     : detail::equals::box_box<0, DimensionCount>
 {};
 
 
 template <typename Ring1, typename Ring2, bool Reverse>
-struct equals<Ring1, Ring2, ring_tag, ring_tag, 2, Reverse>
+struct equals<Ring1, Ring2, ring_tag, ring_tag, areal_tag, areal_tag, 2, Reverse>
     : detail::equals::equals_by_collection_or_relate<detail::equals::area_check>
 {};
 
 
 template <typename Polygon1, typename Polygon2, bool Reverse>
-struct equals<Polygon1, Polygon2, polygon_tag, polygon_tag, 2, Reverse>
+struct equals<Polygon1, Polygon2, polygon_tag, polygon_tag, areal_tag, areal_tag, 2, Reverse>
     : detail::equals::equals_by_collection_or_relate<detail::equals::area_check>
 {};
 
 
 template <typename Polygon, typename Ring, bool Reverse>
-struct equals<Polygon, Ring, polygon_tag, ring_tag, 2, Reverse>
+struct equals<Polygon, Ring, polygon_tag, ring_tag, areal_tag, areal_tag, 2, Reverse>
     : detail::equals::equals_by_collection_or_relate<detail::equals::area_check>
 {};
 
 
 template <typename Ring, typename Box, bool Reverse>
-struct equals<Ring, Box, ring_tag, box_tag, 2, Reverse>
+struct equals<Ring, Box, ring_tag, box_tag, areal_tag, areal_tag, 2, Reverse>
     : detail::equals::equals_by_collection<detail::equals::area_check>
 {};
 
 
 template <typename Polygon, typename Box, bool Reverse>
-struct equals<Polygon, Box, polygon_tag, box_tag, 2, Reverse>
+struct equals<Polygon, Box, polygon_tag, box_tag, areal_tag, areal_tag, 2, Reverse>
     : detail::equals::equals_by_collection<detail::equals::area_check>
 {};
 
 template <typename Segment1, typename Segment2, std::size_t DimensionCount, bool Reverse>
-struct equals<Segment1, Segment2, segment_tag, segment_tag, DimensionCount, Reverse>
+struct equals<Segment1, Segment2, segment_tag, segment_tag, linear_tag, linear_tag, DimensionCount, Reverse>
     : detail::equals::segment_segment
 {};
 
 template <typename LineString1, typename LineString2, bool Reverse>
-struct equals<LineString1, LineString2, linestring_tag, linestring_tag, 2, Reverse>
+struct equals<LineString1, LineString2, linestring_tag, linestring_tag, linear_tag, linear_tag, 2, Reverse>
     : detail::equals::equals_by_relate<LineString1, LineString2>
 {};
 
 template <typename LineString, typename MultiLineString, bool Reverse>
-struct equals<LineString, MultiLineString, linestring_tag, multi_linestring_tag, 2, Reverse>
+struct equals<LineString, MultiLineString, linestring_tag, multi_linestring_tag, linear_tag, linear_tag, 2, Reverse>
     : detail::equals::equals_by_relate<LineString, MultiLineString>
 {};
 
 template <typename MultiLineString1, typename MultiLineString2, bool Reverse>
-struct equals<MultiLineString1, MultiLineString2, multi_linestring_tag, multi_linestring_tag, 2, Reverse>
+struct equals<MultiLineString1, MultiLineString2, multi_linestring_tag, multi_linestring_tag, linear_tag, linear_tag, 2, Reverse>
     : detail::equals::equals_by_relate<MultiLineString1, MultiLineString2>
 {};
 
+template <typename LineString, typename Segment, bool Reverse>
+struct equals<LineString, Segment, linestring_tag, segment_tag, linear_tag, linear_tag, 2, Reverse>
+    : detail::equals::equals_by_relate<LineString, Segment>
+{};
+
+template <typename MultiLineString, typename Segment, bool Reverse>
+struct equals<MultiLineString, Segment, multi_linestring_tag, segment_tag, linear_tag, linear_tag, 2, Reverse>
+    : detail::equals::equals_by_relate<MultiLineString, Segment>
+{};
+
 
 template <typename MultiPolygon1, typename MultiPolygon2, bool Reverse>
 struct equals
     <
         MultiPolygon1, MultiPolygon2,
         multi_polygon_tag, multi_polygon_tag,
+        areal_tag, areal_tag, 
         2,
         Reverse
     >
@@ -372,6 +392,7 @@ struct equals
     <
         Polygon, MultiPolygon,
         polygon_tag, multi_polygon_tag,
+        areal_tag, areal_tag, 
         2,
         Reverse
     >
@@ -383,6 +404,7 @@ struct equals
     <
         MultiPolygon, Ring,
         multi_polygon_tag, ring_tag,
+        areal_tag, areal_tag, 
         2,
         Reverse
     >
@@ -390,6 +412,42 @@ struct equals
 {};
 
 
+// NOTE: degenerated linear geometries, e.g. segment or linestring containing
+//   2 equal points, are considered to be invalid. Though theoretically
+//   degenerated segments and linestrings could be treated as points and
+//   multi-linestrings as multi-points.
+//   This reasoning could also be applied to boxes.
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, pointlike_tag, linear_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, linear_tag, pointlike_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, pointlike_tag, areal_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, areal_tag, pointlike_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, linear_tag, areal_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
+template <typename Geometry1, typename Geometry2, typename Tag1, typename Tag2, std::size_t DimensionCount>
+struct equals<Geometry1, Geometry2, Tag1, Tag2, areal_tag, linear_tag, DimensionCount, false>
+    : detail::equals::equals_always_false
+{};
+
 } // namespace dispatch
 #endif // DOXYGEN_NO_DISPATCH