// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. // 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_GEOMETRIES_CONCEPTS_LINESTRING_CONCEPT_HPP #define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_LINESTRING_CONCEPT_HPP #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace concept { /*! \brief Linestring concept \ingroup concepts \par Formal definition: The linestring concept is defined as following: - there must be a specialization of traits::tag defining linestring_tag as type - it must behave like a Boost.Range - it must implement a std::back_insert_iterator - either by implementing push_back - or by specializing std::back_insert_iterator \note to fulfill the concepts, no traits class has to be specialized to define the point type. \par Example: A custom linestring, defining the necessary specializations to fulfill to the concept. Suppose that the following linestring is defined: \dontinclude doxygen_5.cpp \skip custom_linestring1 \until }; It can then be adapted to the concept as following: \dontinclude doxygen_5.cpp \skip adapt custom_linestring1 \until }} \note - There is also the registration macro BOOST_GEOMETRY_REGISTER_LINESTRING - For registration of std::vector

(and deque, and list) it is enough to include the header-file geometries/adapted/std_as_linestring.hpp. That registers a vector as a linestring (so it cannot be registered as a linear ring then, in the same source code). */ template class Linestring { #ifndef DOXYGEN_NO_CONCEPT_MEMBERS typedef typename point_type::type point_type; BOOST_CONCEPT_ASSERT( (concept::Point) ); BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept) ); public : BOOST_CONCEPT_USAGE(Linestring) { Geometry* ls = 0; traits::clear::apply(*ls); traits::resize::apply(*ls, 0); point_type* point = 0; traits::push_back::apply(*ls, *point); } #endif }; /*! \brief Linestring concept (const version) \ingroup const_concepts \details The ConstLinestring concept check the same as the Linestring concept, but does not check write access. */ template class ConstLinestring { #ifndef DOXYGEN_NO_CONCEPT_MEMBERS typedef typename point_type::type point_type; BOOST_CONCEPT_ASSERT( (concept::ConstPoint) ); //BOOST_CONCEPT_ASSERT( (boost::RandomAccessRangeConcept) ); // Relaxed the concept. BOOST_CONCEPT_ASSERT( (boost::ForwardRangeConcept) ); public : BOOST_CONCEPT_USAGE(ConstLinestring) { } #endif }; }}} // namespace boost::geometry::concept #endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_LINESTRING_CONCEPT_HPP