You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
176 lines
4.6 KiB
176 lines
4.6 KiB
// Boost.Geometry (aka GGL, Generic Geometry Library) |
|
// |
|
// Copyright (c) 2008-2011 Bruno Lalande, Paris, France. |
|
// Copyright (c) 2008-2011 Barend Gehrels, Amsterdam, the Netherlands. |
|
// Copyright (c) 2009-2011 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_POINT_CONCEPT_HPP |
|
#define BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POINT_CONCEPT_HPP |
|
|
|
#include <cstddef> |
|
|
|
#include <boost/concept_check.hpp> |
|
|
|
#include <boost/geometry/core/access.hpp> |
|
#include <boost/geometry/core/coordinate_dimension.hpp> |
|
#include <boost/geometry/core/coordinate_system.hpp> |
|
|
|
|
|
|
|
|
|
namespace boost { namespace geometry { namespace concept |
|
{ |
|
|
|
/*! |
|
\brief Point concept. |
|
\ingroup concepts |
|
|
|
\par Formal definition: |
|
The point concept is defined as following: |
|
- there must be a specialization of traits::tag defining point_tag as type |
|
- there must be a specialization of traits::coordinate_type defining the type |
|
of its coordinates |
|
- there must be a specialization of traits::coordinate_system defining its |
|
coordinate system (cartesian, spherical, etc) |
|
- there must be a specialization of traits::dimension defining its number |
|
of dimensions (2, 3, ...) (derive it conveniently |
|
from boost::mpl::int_<X> for X-D) |
|
- there must be a specialization of traits::access, per dimension, |
|
with two functions: |
|
- \b get to get a coordinate value |
|
- \b set to set a coordinate value (this one is not checked for ConstPoint) |
|
|
|
\par Example: |
|
|
|
A legacy point, defining the necessary specializations to fulfil to the concept. |
|
|
|
Suppose that the following point is defined: |
|
\dontinclude doxygen_5.cpp |
|
\skip legacy_point1 |
|
\until }; |
|
|
|
It can then be adapted to the concept as following: |
|
\dontinclude doxygen_5.cpp |
|
\skip adapt legacy_point1 |
|
\until }} |
|
|
|
Note that it is done like above to show the system. Users will normally use the registration macro. |
|
|
|
\par Example: |
|
|
|
A read-only legacy point, using a macro to fulfil to the ConstPoint concept. |
|
It cannot be modified by the library but can be used in all algorithms where |
|
points are not modified. |
|
|
|
The point looks like the following: |
|
|
|
\dontinclude doxygen_5.cpp |
|
\skip legacy_point2 |
|
\until }; |
|
|
|
It uses the macro as following: |
|
\dontinclude doxygen_5.cpp |
|
\skip adapt legacy_point2 |
|
\until end adaptation |
|
|
|
*/ |
|
|
|
template <typename Geometry> |
|
class Point |
|
{ |
|
#ifndef DOXYGEN_NO_CONCEPT_MEMBERS |
|
|
|
typedef typename coordinate_type<Geometry>::type ctype; |
|
typedef typename coordinate_system<Geometry>::type csystem; |
|
|
|
enum { ccount = dimension<Geometry>::value }; |
|
|
|
|
|
template <typename P, std::size_t Dimension, std::size_t DimensionCount> |
|
struct dimension_checker |
|
{ |
|
static void apply() |
|
{ |
|
P* p = 0; |
|
geometry::set<Dimension>(*p, geometry::get<Dimension>(*p)); |
|
dimension_checker<P, Dimension+1, DimensionCount>::apply(); |
|
} |
|
}; |
|
|
|
|
|
template <typename P, std::size_t DimensionCount> |
|
struct dimension_checker<P, DimensionCount, DimensionCount> |
|
{ |
|
static void apply() {} |
|
}; |
|
|
|
public: |
|
|
|
/// BCCL macro to apply the Point concept |
|
BOOST_CONCEPT_USAGE(Point) |
|
{ |
|
dimension_checker<Geometry, 0, ccount>::apply(); |
|
} |
|
#endif |
|
}; |
|
|
|
|
|
/*! |
|
\brief point concept (const version). |
|
|
|
\ingroup const_concepts |
|
|
|
\details The ConstPoint concept apply the same as the Point concept, |
|
but does not apply write access. |
|
|
|
*/ |
|
template <typename Geometry> |
|
class ConstPoint |
|
{ |
|
#ifndef DOXYGEN_NO_CONCEPT_MEMBERS |
|
|
|
typedef typename coordinate_type<Geometry>::type ctype; |
|
typedef typename coordinate_system<Geometry>::type csystem; |
|
|
|
enum { ccount = dimension<Geometry>::value }; |
|
|
|
|
|
template <typename P, std::size_t Dimension, std::size_t DimensionCount> |
|
struct dimension_checker |
|
{ |
|
static void apply() |
|
{ |
|
const P* p = 0; |
|
ctype coord(geometry::get<Dimension>(*p)); |
|
boost::ignore_unused_variable_warning(coord); |
|
dimension_checker<P, Dimension+1, DimensionCount>::apply(); |
|
} |
|
}; |
|
|
|
|
|
template <typename P, std::size_t DimensionCount> |
|
struct dimension_checker<P, DimensionCount, DimensionCount> |
|
{ |
|
static void apply() {} |
|
}; |
|
|
|
public: |
|
|
|
/// BCCL macro to apply the ConstPoint concept |
|
BOOST_CONCEPT_USAGE(ConstPoint) |
|
{ |
|
dimension_checker<Geometry, 0, ccount>::apply(); |
|
} |
|
#endif |
|
}; |
|
|
|
}}} // namespace boost::geometry::concept |
|
|
|
#endif // BOOST_GEOMETRY_GEOMETRIES_CONCEPTS_POINT_CONCEPT_HPP
|
|
|