// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // 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_INTERIOR_RINGS_HPP #define BOOST_GEOMETRY_CORE_INTERIOR_RINGS_HPP #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace traits { /*! \brief Traits class defining access to interior_rings of a polygon \details defines access (const and non const) to interior ring \ingroup traits \par Geometries: - polygon \par Specializations should provide: - static inline INTERIOR& get(POLY&) - static inline const INTERIOR& get(POLY const&) \tparam Geometry geometry */ template struct interior_rings { BOOST_MPL_ASSERT_MSG ( false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE , (types) ); }; } // namespace traits #ifndef DOXYGEN_NO_DISPATCH namespace core_dispatch { template < typename GeometryTag, typename Geometry > struct interior_rings {}; template struct interior_rings { static inline typename geometry::interior_return_type::type apply(Polygon& polygon) { return traits::interior_rings < typename boost::remove_const::type >::get(polygon); } }; template struct interior_type { typedef typename core_dispatch::interior_type < polygon_tag, typename boost::range_value::type >::type type; }; } // namespace core_dispatch #endif /*! \brief Function to get the interior rings of a polygon (non const version) \ingroup interior_rings \note OGC compliance: instead of InteriorRingN \tparam Polygon polygon type \param polygon the polygon to get the interior rings from \return the interior rings (possibly a reference) */ template inline typename interior_return_type::type interior_rings(Polygon& polygon) { return core_dispatch::interior_rings < typename tag::type, Polygon >::apply(polygon); } /*! \brief Function to get the interior rings of a polygon (const version) \ingroup interior_rings \note OGC compliance: instead of InteriorRingN \tparam Polygon polygon type \param polygon the polygon to get the interior rings from \return the interior rings (possibly a const reference) \qbk{distinguish,const version} */ template inline typename interior_return_type::type interior_rings( Polygon const& polygon) { return core_dispatch::interior_rings < typename tag::type, Polygon const >::apply(polygon); } }} // namespace boost::geometry #endif // BOOST_GEOMETRY_CORE_INTERIOR_RINGS_HPP