1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. 4 // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. 5 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. 6 7 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library 8 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. 9 10 // Use, modification and distribution is subject to the Boost Software License, 11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 12 // http://www.boost.org/LICENSE_1_0.txt) 13 14 #ifndef BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POLYGON_CONCEPT_HPP 15 #define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POLYGON_CONCEPT_HPP 16 17 #include <boost/concept_check.hpp> 18 #include <boost/range/concepts.hpp> 19 20 #include <boost/geometry/core/access.hpp> 21 #include <boost/geometry/core/exterior_ring.hpp> 22 #include <boost/geometry/core/interior_rings.hpp> 23 #include <boost/geometry/core/point_type.hpp> 24 #include <boost/geometry/core/ring_type.hpp> 25 26 #include <boost/geometry/geometries/concepts/point_concept.hpp> 27 #include <boost/geometry/geometries/concepts/ring_concept.hpp> 28 29 30 namespace boost { namespace geometry { namespace concepts 31 { 32 33 /*! 34 \brief Checks polygon concept 35 \ingroup concepts 36 */ 37 template <typename PolygonType> 38 class Polygon 39 { 40 #ifndef DOXYGEN_NO_CONCEPT_MEMBERS 41 typedef typename boost::remove_const<PolygonType>::type polygon_type; 42 43 typedef typename traits::ring_const_type<polygon_type>::type ring_const_type; 44 typedef typename traits::ring_mutable_type<polygon_type>::type ring_mutable_type; 45 typedef typename traits::interior_const_type<polygon_type>::type interior_const_type; 46 typedef typename traits::interior_mutable_type<polygon_type>::type interior_mutable_type; 47 48 typedef typename point_type<PolygonType>::type point_type; 49 typedef typename ring_type<PolygonType>::type ring_type; 50 51 BOOST_CONCEPT_ASSERT( (concepts::Point<point_type>) ); 52 BOOST_CONCEPT_ASSERT( (concepts::Ring<ring_type>) ); 53 54 //BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<interior_type>) ); 55 56 struct checker 57 { applyboost::geometry::concepts::Polygon::checker58 static inline void apply() 59 { 60 polygon_type* poly = 0; 61 polygon_type const* cpoly = poly; 62 63 ring_mutable_type e = traits::exterior_ring<PolygonType>::get(*poly); 64 interior_mutable_type i = traits::interior_rings<PolygonType>::get(*poly); 65 ring_const_type ce = traits::exterior_ring<PolygonType>::get(*cpoly); 66 interior_const_type ci = traits::interior_rings<PolygonType>::get(*cpoly); 67 68 boost::ignore_unused_variable_warning(e); 69 boost::ignore_unused_variable_warning(i); 70 boost::ignore_unused_variable_warning(ce); 71 boost::ignore_unused_variable_warning(ci); 72 boost::ignore_unused_variable_warning(poly); 73 boost::ignore_unused_variable_warning(cpoly); 74 } 75 }; 76 77 public: 78 BOOST_CONCEPT_USAGE(Polygon)79 BOOST_CONCEPT_USAGE(Polygon) 80 { 81 checker::apply(); 82 } 83 #endif 84 }; 85 86 87 /*! 88 \brief Checks polygon concept (const version) 89 \ingroup const_concepts 90 */ 91 template <typename PolygonType> 92 class ConstPolygon 93 { 94 #ifndef DOXYGEN_NO_CONCEPT_MEMBERS 95 96 typedef typename boost::remove_const<PolygonType>::type const_polygon_type; 97 98 typedef typename traits::ring_const_type<const_polygon_type>::type ring_const_type; 99 typedef typename traits::interior_const_type<const_polygon_type>::type interior_const_type; 100 101 typedef typename point_type<const_polygon_type>::type point_type; 102 typedef typename ring_type<const_polygon_type>::type ring_type; 103 104 BOOST_CONCEPT_ASSERT( (concepts::ConstPoint<point_type>) ); 105 BOOST_CONCEPT_ASSERT( (concepts::ConstRing<ring_type>) ); 106 107 ////BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<interior_type>) ); 108 109 struct checker 110 { applyboost::geometry::concepts::ConstPolygon::checker111 static inline void apply() 112 { 113 const_polygon_type const* cpoly = 0; 114 115 ring_const_type ce = traits::exterior_ring<const_polygon_type>::get(*cpoly); 116 interior_const_type ci = traits::interior_rings<const_polygon_type>::get(*cpoly); 117 118 boost::ignore_unused_variable_warning(ce); 119 boost::ignore_unused_variable_warning(ci); 120 boost::ignore_unused_variable_warning(cpoly); 121 } 122 }; 123 124 public: 125 BOOST_CONCEPT_USAGE(ConstPolygon)126 BOOST_CONCEPT_USAGE(ConstPolygon) 127 { 128 checker::apply(); 129 } 130 #endif 131 }; 132 133 }}} // namespace boost::geometry::concepts 134 135 #endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POLYGON_CONCEPT_HPP 136