1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. 4 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. 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 15 #ifndef BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP 16 #define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP 17 18 19 #include <boost/concept_check.hpp> 20 #include <boost/range/concepts.hpp> 21 #include <boost/range/metafunctions.hpp> 22 23 24 #include <boost/geometry/geometries/concepts/point_concept.hpp> 25 26 27 namespace boost { namespace geometry { namespace concepts 28 { 29 30 31 /*! 32 \brief MultiPoint concept 33 \ingroup concepts 34 \par Formal definition: 35 The multi point concept is defined as following: 36 - there must be a specialization of traits::tag defining multi_point_tag as type 37 - it must behave like a Boost.Range 38 - its range value must fulfil the Point concept 39 40 */ 41 template <typename Geometry> 42 class MultiPoint 43 { 44 #ifndef DOXYGEN_NO_CONCEPT_MEMBERS 45 typedef typename boost::range_value<Geometry>::type point_type; 46 47 BOOST_CONCEPT_ASSERT( (concepts::Point<point_type>) ); 48 BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) ); 49 50 51 public : 52 BOOST_CONCEPT_USAGE(MultiPoint)53 BOOST_CONCEPT_USAGE(MultiPoint) 54 { 55 Geometry* mp = 0; 56 traits::clear<Geometry>::apply(*mp); 57 traits::resize<Geometry>::apply(*mp, 0); 58 point_type* point = 0; 59 traits::push_back<Geometry>::apply(*mp, *point); 60 } 61 #endif 62 }; 63 64 65 /*! 66 \brief concept for multi-point (const version) 67 \ingroup const_concepts 68 */ 69 template <typename Geometry> 70 class ConstMultiPoint 71 { 72 #ifndef DOXYGEN_NO_CONCEPT_MEMBERS 73 typedef typename boost::range_value<Geometry>::type point_type; 74 75 BOOST_CONCEPT_ASSERT( (concepts::ConstPoint<point_type>) ); 76 BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept<Geometry>) ); 77 78 79 public : 80 BOOST_CONCEPT_USAGE(ConstMultiPoint)81 BOOST_CONCEPT_USAGE(ConstMultiPoint) 82 { 83 } 84 #endif 85 }; 86 87 }}} // namespace boost::geometry::concepts 88 89 90 #endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_MULTI_POINT_CONCEPT_HPP 91