// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2015, 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_IS_EMPTY_HPP #define BOOST_GEOMETRY_ALGORITHMS_IS_EMPTY_HPP #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace is_empty { struct always_not_empty { template static inline bool apply(Geometry const&) { return false; } }; struct range_is_empty { template static inline bool apply(Range const& range) { return boost::empty(range); } }; class polygon_is_empty { template static inline bool check_interior_rings(InteriorRings const& interior_rings) { return check_iterator_range < range_is_empty, true // allow empty range >::apply(boost::begin(interior_rings), boost::end(interior_rings)); } public: template static inline bool apply(Polygon const& polygon) { return boost::empty(exterior_ring(polygon)) && check_interior_rings(interior_rings(polygon)); } }; template struct multi_is_empty { template static inline bool apply(MultiGeometry const& multigeometry) { return check_iterator_range < Policy, true // allow empty range >::apply(boost::begin(multigeometry), boost::end(multigeometry)); } }; }} // namespace detail::is_empty #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { template ::type> struct is_empty : not_implemented {}; template struct is_empty : detail::is_empty::always_not_empty {}; template struct is_empty : detail::is_empty::always_not_empty {}; template struct is_empty : detail::is_empty::always_not_empty {}; template struct is_empty : detail::is_empty::range_is_empty {}; template struct is_empty : detail::is_empty::range_is_empty {}; template struct is_empty : detail::is_empty::polygon_is_empty {}; template struct is_empty : detail::is_empty::range_is_empty {}; template struct is_empty : detail::is_empty::multi_is_empty<> {}; template struct is_empty : detail::is_empty::multi_is_empty {}; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH namespace resolve_variant { template struct is_empty { static inline bool apply(Geometry const& geometry) { concepts::check(); return dispatch::is_empty::apply(geometry); } }; template struct is_empty > { struct visitor : boost::static_visitor { template inline bool operator()(Geometry const& geometry) const { return is_empty::apply(geometry); } }; static bool apply(boost::variant const& geometry) { return boost::apply_visitor(visitor(), geometry); } }; } // namespace resolve_variant /*! \brief \brief_check{is the empty set} \ingroup is_empty \tparam Geometry \tparam_geometry \param geometry \param_geometry \return \return_check{is the empty set} \qbk{[include reference/algorithms/is_empty.qbk]} */ template inline bool is_empty(Geometry const& geometry) { return resolve_variant::is_empty::apply(geometry); } }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_IS_EMPTY_HPP