// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2014, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace is_simple { template struct is_simple_ring { static inline bool apply(Ring const& ring) { return !detail::is_valid::has_duplicates < Ring, geometry::closure::value >::apply(ring); } }; template class is_simple_polygon { private: template static inline bool are_simple_interior_rings(InteriorRings const& interior_rings) { return detail::check_iterator_range < is_simple_ring < typename boost::range_value::type > >::apply(boost::begin(interior_rings), boost::end(interior_rings)); } public: static inline bool apply(Polygon const& polygon) { return is_simple_ring < typename ring_type::type >::apply(exterior_ring(polygon)) && are_simple_interior_rings(geometry::interior_rings(polygon)); } }; }} // namespace detail::is_simple #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { // A Ring is a Polygon. // A Polygon is always a simple geometric object provided that it is valid. // // Reference (for polygon validity): OGC 06-103r4 (6.1.11.1) template struct is_simple : detail::is_simple::is_simple_ring {}; // A Polygon is always a simple geometric object provided that it is valid. // // Reference (for validity of Polygons): OGC 06-103r4 (6.1.11.1) template struct is_simple : detail::is_simple::is_simple_polygon {}; // Not clear what the definition is. // Right now we consider a MultiPolygon as simple if it is valid. // // Reference (for validity of MultiPolygons): OGC 06-103r4 (6.1.14) template struct is_simple { static inline bool apply(MultiPolygon const& multipolygon) { return detail::check_iterator_range < detail::is_simple::is_simple_polygon < typename boost::range_value::type >, false // do not allow empty multi-polygon >::apply(boost::begin(multipolygon), boost::end(multipolygon)); } }; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_IS_SIMPLE_AREAL_HPP