diff --git a/include/boost/geometry/core/tags.hpp b/include/boost/geometry/core/tags.hpp index f5bebbacb..6c33042f5 100644 --- a/include/boost/geometry/core/tags.hpp +++ b/include/boost/geometry/core/tags.hpp @@ -4,9 +4,8 @@ // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. -// This file was modified by Oracle on 2014, 2018. -// Modifications copyright (c) 2014-2018 Oracle and/or its affiliates. - +// This file was modified by Oracle on 2014-2020. +// Modifications copyright (c) 2014-2020 Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library @@ -69,6 +68,9 @@ struct pointlike_tag {}; /// For linear types (linestring, multi-linestring, segment) struct linear_tag {}; +// Subset of linear types (polygon, multi_polygon) +struct polylinear_tag : linear_tag {}; + /// For areal types (polygon, multi_polygon, box, ring) struct areal_tag {}; @@ -89,7 +91,7 @@ struct geometry_not_recognized_tag {}; struct point_tag : single_tag, pointlike_tag {}; /// OGC Linestring identifying tag -struct linestring_tag : single_tag, linear_tag {}; +struct linestring_tag : single_tag, polylinear_tag {}; /// OGC Polygon identifying tag struct polygon_tag : single_tag, polygonal_tag {}; @@ -108,7 +110,7 @@ struct segment_tag : single_tag, linear_tag {}; struct multi_point_tag : multi_tag, pointlike_tag {}; /// OGC Multi linestring identifying tag -struct multi_linestring_tag : multi_tag, linear_tag {}; +struct multi_linestring_tag : multi_tag, polylinear_tag {}; /// OGC Multi polygon identifying tag struct multi_polygon_tag : multi_tag, polygonal_tag {}; diff --git a/include/boost/geometry/strategies/cartesian.hpp b/include/boost/geometry/strategies/cartesian.hpp index 68e6a96b2..5a4dc96a3 100644 --- a/include/boost/geometry/strategies/cartesian.hpp +++ b/include/boost/geometry/strategies/cartesian.hpp @@ -39,35 +39,35 @@ struct cartesian : strategies::detail::cartesian_base template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::cartesian_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::cartesian_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::cartesian_box(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::envelope::cartesian_segment(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) + typename geometry::detail::enable_if_polysegmental_t * = nullptr) { return strategy::envelope::cartesian(); } @@ -76,21 +76,21 @@ struct cartesian : strategies::detail::cartesian_base template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::cartesian_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::cartesian_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::cartesian_segment(); } diff --git a/include/boost/geometry/strategies/detail.hpp b/include/boost/geometry/strategies/detail.hpp index 605b7fef9..410423d46 100644 --- a/include/boost/geometry/strategies/detail.hpp +++ b/include/boost/geometry/strategies/detail.hpp @@ -11,13 +11,12 @@ #define BOOST_GEOMETRY_STRATEGIES_DETAIL_HPP -#include - #include #include #include #include #include +#include namespace boost { namespace geometry @@ -120,81 +119,6 @@ protected: }; -template -struct enable_if_pointlike - : std::enable_if - < - std::is_base_of::type>::value, - T - > -{}; - -template -struct enable_if_linear - : std::enable_if - < - std::is_base_of::type>::value, - T - > -{}; - -template -struct enable_if_polygonal - : std::enable_if - < - std::is_base_of::type>::value, - T - > -{}; - -template -struct enable_if_non_trivial_linear_or_polygonal - : std::enable_if - < - ((std::is_base_of::type>::value - || std::is_base_of::type>::value) - && (!std::is_same::type>::value)), - T - > -{}; - -template -struct enable_if_point - : std::enable_if - < - std::is_same::type>::value, - T - > -{}; - -template -struct enable_if_multi_point - : std::enable_if - < - std::is_same::type>::value, - T - > -{}; - -template -struct enable_if_box - : std::enable_if - < - std::is_same::type>::value, - T - > -{}; - -template -struct enable_if_segment - : std::enable_if - < - std::is_same::type>::value, - T - > -{}; - - } // namespace detail #endif // DOXYGEN_NO_DETAIL diff --git a/include/boost/geometry/strategies/envelope/cartesian.hpp b/include/boost/geometry/strategies/envelope/cartesian.hpp index 73acd4c77..0f278bd72 100644 --- a/include/boost/geometry/strategies/envelope/cartesian.hpp +++ b/include/boost/geometry/strategies/envelope/cartesian.hpp @@ -38,42 +38,42 @@ struct cartesian : strategies::detail::cartesian_base { template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::cartesian_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::cartesian_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::cartesian_box(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::envelope::cartesian_segment(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) + typename geometry::detail::enable_if_polysegmental_t * = nullptr) { return strategy::envelope::cartesian(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::cartesian_point(); } @@ -81,14 +81,14 @@ struct cartesian : strategies::detail::cartesian_base // TEMP template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::cartesian_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::cartesian_segment(); } diff --git a/include/boost/geometry/strategies/envelope/geographic.hpp b/include/boost/geometry/strategies/envelope/geographic.hpp index 2030e2ce4..ac949858b 100644 --- a/include/boost/geometry/strategies/envelope/geographic.hpp +++ b/include/boost/geometry/strategies/envelope/geographic.hpp @@ -48,28 +48,28 @@ public: template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::spherical_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::spherical_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::spherical_box(); } template auto envelope(Geometry const&, Box const&, - typename detail::enable_if_segment::type * = nullptr) const + typename geometry::detail::enable_if_segment_t * = nullptr) const { return strategy::envelope::geographic_segment < @@ -79,7 +79,7 @@ public: template auto envelope(Geometry const&, Box const&, - typename detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) const + typename geometry::detail::enable_if_polysegmental_t * = nullptr) const { return strategy::envelope::geographic < @@ -89,7 +89,7 @@ public: template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } @@ -97,14 +97,14 @@ public: // TEMP template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template auto expand(Box const&, Geometry const&, - typename detail::enable_if_segment::type * = nullptr) const + typename geometry::detail::enable_if_segment_t * = nullptr) const { return strategy::expand::geographic_segment < diff --git a/include/boost/geometry/strategies/envelope/spherical.hpp b/include/boost/geometry/strategies/envelope/spherical.hpp index 8971c1a27..bdfae7f88 100644 --- a/include/boost/geometry/strategies/envelope/spherical.hpp +++ b/include/boost/geometry/strategies/envelope/spherical.hpp @@ -44,42 +44,42 @@ class spherical : strategies::detail::spherical_base public: template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::spherical_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::spherical_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::spherical_box(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::envelope::spherical_segment(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) + typename geometry::detail::enable_if_polysegmental_t * = nullptr) { return strategy::envelope::spherical(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } @@ -87,14 +87,14 @@ public: // TEMP template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::spherical_segment(); } diff --git a/include/boost/geometry/strategies/expand/cartesian.hpp b/include/boost/geometry/strategies/expand/cartesian.hpp index 8b5d34ad9..b1ff4c051 100644 --- a/include/boost/geometry/strategies/expand/cartesian.hpp +++ b/include/boost/geometry/strategies/expand/cartesian.hpp @@ -34,21 +34,21 @@ struct cartesian : strategies::detail::cartesian_base { template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::cartesian_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::cartesian_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::cartesian_segment(); } diff --git a/include/boost/geometry/strategies/expand/geographic.hpp b/include/boost/geometry/strategies/expand/geographic.hpp index 3d062e1d9..086154548 100644 --- a/include/boost/geometry/strategies/expand/geographic.hpp +++ b/include/boost/geometry/strategies/expand/geographic.hpp @@ -46,21 +46,21 @@ public: template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template auto expand(Box const&, Geometry const&, - typename detail::enable_if_segment::type * = nullptr) const + typename geometry::detail::enable_if_segment_t * = nullptr) const { return strategy::expand::geographic_segment < diff --git a/include/boost/geometry/strategies/expand/spherical.hpp b/include/boost/geometry/strategies/expand/spherical.hpp index c605c62ef..8410412ae 100644 --- a/include/boost/geometry/strategies/expand/spherical.hpp +++ b/include/boost/geometry/strategies/expand/spherical.hpp @@ -39,21 +39,21 @@ class spherical : strategies::detail::spherical_base public: template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::spherical_segment(); } diff --git a/include/boost/geometry/strategies/geographic.hpp b/include/boost/geometry/strategies/geographic.hpp index 642fcd798..1f925eca3 100644 --- a/include/boost/geometry/strategies/geographic.hpp +++ b/include/boost/geometry/strategies/geographic.hpp @@ -59,28 +59,28 @@ public: template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::spherical_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::spherical_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::spherical_box(); } template auto envelope(Geometry const&, Box const&, - typename detail::enable_if_segment::type * = nullptr) const + typename geometry::detail::enable_if_segment_t * = nullptr) const { return strategy::envelope::geographic_segment < @@ -90,7 +90,7 @@ public: template auto envelope(Geometry const&, Box const&, - typename detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) const + typename geometry::detail::enable_if_polysegmental_t * = nullptr) const { return strategy::envelope::geographic < @@ -102,21 +102,21 @@ public: template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template auto expand(Box const&, Geometry const&, - typename detail::enable_if_segment::type * = nullptr) const + typename geometry::detail::enable_if_segment_t * = nullptr) const { return strategy::expand::geographic_segment < diff --git a/include/boost/geometry/strategies/spherical.hpp b/include/boost/geometry/strategies/spherical.hpp index 9d7ff7dfa..bea8b8c3a 100644 --- a/include/boost/geometry/strategies/spherical.hpp +++ b/include/boost/geometry/strategies/spherical.hpp @@ -58,35 +58,35 @@ public: template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::envelope::spherical_point(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_multi_point::type * = nullptr) + typename geometry::detail::enable_if_multi_point_t * = nullptr) { return strategy::envelope::spherical_multipoint(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::envelope::spherical_box(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::envelope::spherical_segment(); } template static auto envelope(Geometry const&, Box const&, - typename strategies::detail::enable_if_non_trivial_linear_or_polygonal::type * = nullptr) + typename geometry::detail::enable_if_polysegmental_t * = nullptr) { return strategy::envelope::spherical(); } @@ -95,21 +95,21 @@ public: template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_point::type * = nullptr) + typename geometry::detail::enable_if_point_t * = nullptr) { return strategy::expand::spherical_point(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_box::type * = nullptr) + typename geometry::detail::enable_if_box_t * = nullptr) { return strategy::expand::spherical_box(); } template static auto expand(Box const&, Geometry const&, - typename strategies::detail::enable_if_segment::type * = nullptr) + typename geometry::detail::enable_if_segment_t * = nullptr) { return strategy::expand::spherical_segment(); } diff --git a/include/boost/geometry/util/type_traits.hpp b/include/boost/geometry/util/type_traits.hpp new file mode 100644 index 000000000..ecd1bc785 --- /dev/null +++ b/include/boost/geometry/util/type_traits.hpp @@ -0,0 +1,202 @@ +// Boost.Geometry + +// Copyright (c) 2020, Oracle and/or its affiliates. + +// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_GEOMETRY_UTIL_TYPE_TRAITS_HPP +#define BOOST_GEOMETRY_UTIL_TYPE_TRAITS_HPP + + +#include + +#include +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail +{ + + +template +struct is_point + : std::is_same::type> +{}; + +template +struct is_multi_point + : std::is_same::type> +{}; + +template +struct is_pointlike + : std::is_base_of::type> +{}; + + +template +struct is_segment + : std::is_same::type> +{}; + +template +struct is_linestring + : std::is_same::type> +{}; + +template +struct is_multi_linestring + : std::is_same::type> +{}; + +template +struct is_polylinear + : std::is_base_of::type> +{}; + +template +struct is_linear + : std::is_base_of::type> +{}; + + +template +struct is_box + : std::is_same::type> +{}; + +template +struct is_ring + : std::is_same::type> +{}; + +template +struct is_polygon + : std::is_same::type> +{}; + +template +struct is_multi_polygon + : std::is_same::type> +{}; + +template +struct is_polygonal + : std::is_base_of::type> +{}; + +template +struct is_areal + : std::is_base_of::type> +{}; + + +template +< + typename Geometry, + bool Enable = (is_polylinear::value || is_polygonal::value) +> +struct is_polysegmental + : std::true_type +{}; +template +struct is_polysegmental + : std::false_type +{}; + + +template +struct enable_if_point + : std::enable_if::value, T> +{}; + +template +using enable_if_point_t = typename enable_if_point::type; + + +template +struct enable_if_multi_point + : std::enable_if::value, T> +{}; + +template +using enable_if_multi_point_t = typename enable_if_multi_point::type; + +template +struct enable_if_pointlike + : std::enable_if::value, T> +{}; + +template +using enable_if_pointlike_t = typename enable_if_pointlike::type; + + +template +struct enable_if_segment + : std::enable_if::value, T> +{}; + +template +using enable_if_segment_t = typename enable_if_segment::type; + + +template +struct enable_if_polylinear + : std::enable_if::value, T> +{}; + +template +using enable_if_polylinear_t = typename enable_if_polylinear::type; + + +template +struct enable_if_linear + : std::enable_if::value, T> +{}; + +template +using enable_if_linear_t = typename enable_if_linear::type; + + +template +struct enable_if_box + : std::enable_if::value, T> +{}; + +template +using enable_if_box_t = typename enable_if_box::type; + + +template +struct enable_if_polygonal + : std::enable_if::value, T> +{}; + +template +using enable_if_polygonal_t = typename enable_if_polygonal::type; + + +template +struct enable_if_polysegmental + : std::enable_if::value, T> +{}; + +template +using enable_if_polysegmental_t = typename enable_if_polysegmental::type; + + +} // namespace detail +#endif // DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + +#endif // BOOST_GEOMETRY_STRATEGIES_DETAIL_HPP