// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2015 Bruno Lalande, Paris, France. // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. // This file was modified by Oracle on 2015. // Modifications copyright (c) 2015, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_CORE_RING_TYPE_HPP #define BOOST_GEOMETRY_CORE_RING_TYPE_HPP #include #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace traits { /*! \brief Traits class to indicate ring-type of a polygon's exterior ring/interior rings \ingroup traits \par Geometries: - polygon \par Specializations should provide: - typedef XXX type ( e.g. ring

) \tparam Geometry geometry */ template struct ring_const_type { BOOST_MPL_ASSERT_MSG ( false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE , (types) ); }; template struct ring_mutable_type { BOOST_MPL_ASSERT_MSG ( false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE , (types) ); }; } // namespace traits #ifndef DOXYGEN_NO_DISPATCH namespace core_dispatch { template struct ring_return_type {}; template struct ring_return_type { typedef LineString& type; }; template struct ring_return_type { typedef Ring& type; }; template struct ring_return_type { typedef typename boost::remove_const::type nc_polygon_type; typedef typename boost::mpl::if_ < boost::is_const, typename traits::ring_const_type::type, typename traits::ring_mutable_type::type >::type type; }; template struct ring_return_type { typedef typename ring_return_type < linestring_tag, typename boost::mpl::if_ < boost::is_const, typename boost::range_value::type const, typename boost::range_value::type >::type >::type type; }; template struct ring_return_type { typedef typename ring_return_type < polygon_tag, typename boost::mpl::if_ < boost::is_const, typename boost::range_value::type const, typename boost::range_value::type >::type >::type type; }; template struct ring_type {}; template struct ring_type { typedef Ring type; }; template struct ring_type { typedef typename boost::remove_reference < typename ring_return_type::type >::type type; }; template struct ring_type { typedef typename boost::remove_reference < typename ring_return_type::type >::type type; }; template struct ring_type { typedef typename boost::remove_reference < typename ring_return_type::type >::type type; }; } // namespace core_dispatch #endif /*! \brief \brief_meta{type, ring_type, \meta_geometry_type} \details A polygon contains one exterior ring and zero or more interior rings (holes). This metafunction retrieves the type of the rings. Exterior ring and each of the interior rings all have the same ring_type. \tparam Geometry A type fullfilling the Ring, Polygon or MultiPolygon concept. \ingroup core \qbk{[include reference/core/ring_type.qbk]} */ template struct ring_type { typedef typename core_dispatch::ring_type < typename tag::type, Geometry >::type type; }; template struct ring_return_type { typedef typename core_dispatch::ring_return_type < typename tag::type, Geometry >::type type; }; }} // namespace boost::geometry #endif // BOOST_GEOMETRY_CORE_RING_TYPE_HPP