Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@16: // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. Chris@16: // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. Chris@16: // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. Chris@16: Chris@16: // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library Chris@16: // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. Chris@16: Chris@16: // Use, modification and distribution is subject to the Boost Software License, Chris@16: // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP Chris@16: #define BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: #ifndef DOXYGEN_NO_SPECIALIZATIONS Chris@16: Chris@16: // Starting point, specialize basic traits necessary to register a point Chris@16: #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, Dim, CoordinateType, CoordinateSystem) \ Chris@16: template<> struct tag { typedef point_tag type; }; \ Chris@16: template<> struct dimension : boost::mpl::int_ {}; \ Chris@16: template<> struct coordinate_type { typedef CoordinateType type; }; \ Chris@16: template<> struct coordinate_system { typedef CoordinateSystem type; }; Chris@16: Chris@16: // Specialize access class per dimension Chris@16: #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, Dim, CoordinateType, Get, Set) \ Chris@16: template<> struct access \ Chris@16: { \ Chris@16: static inline CoordinateType get(Point const& p) { return p. Get; } \ Chris@16: static inline void set(Point& p, CoordinateType const& value) { p. Set = value; } \ Chris@16: }; Chris@16: Chris@16: // Const version Chris@16: #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, Dim, CoordinateType, Get) \ Chris@16: template<> struct access \ Chris@16: { \ Chris@16: static inline CoordinateType get(Point const& p) { return p. Get; } \ Chris@16: }; Chris@16: Chris@16: Chris@16: // Getter/setter version Chris@16: #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, Dim, CoordinateType, Get, Set) \ Chris@16: template<> struct access \ Chris@16: { \ Chris@16: static inline CoordinateType get(Point const& p) \ Chris@16: { return p. Get (); } \ Chris@16: static inline void set(Point& p, CoordinateType const& value) \ Chris@16: { p. Set ( value ); } \ Chris@16: }; Chris@16: Chris@16: #endif // DOXYGEN_NO_SPECIALIZATIONS Chris@16: Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{2D point type} Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D, two-dimensional point type} Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Field0 \param_macro_member{\macro_x} Chris@16: \param Field1 \param_macro_member{\macro_y} Chris@16: Chris@16: \qbk{[include reference/geometries/register/point.qbk]} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_2D(Point, CoordinateType, CoordinateSystem, Field0, Field1) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \ Chris@16: }}} Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{3D point type} Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D, three-dimensional point type} Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Field0 \param_macro_member{\macro_x} Chris@16: \param Field1 \param_macro_member{\macro_y} Chris@16: \param Field2 \param_macro_member{\macro_z} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_3D(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 2, CoordinateType, Field2, Field2) \ Chris@16: }}} Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{2D point type} \brief_macro_const Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_CONST, two-dimensional point type}. \details_macro_const Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Field0 \param_macro_member{\macro_x} Chris@16: \param Field1 \param_macro_member{\macro_y} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_2D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \ Chris@16: }}} Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{3D point type} \brief_macro_const Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_CONST, three-dimensional point type}. \details_macro_const Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Field0 \param_macro_member{\macro_x} Chris@16: \param Field1 \param_macro_member{\macro_y} Chris@16: \param Field2 \param_macro_member{\macro_z} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_3D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 2, CoordinateType, Field2) \ Chris@16: }}} Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{2D point type} \brief_macro_getset Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET, two-dimensional point type}. \details_macro_getset Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Get0 \param_macro_getset{get, \macro_x} Chris@16: \param Get1 \param_macro_getset{get, \macro_y} Chris@16: \param Set0 \param_macro_getset{set, \macro_x} Chris@16: \param Set1 \param_macro_getset{set, \macro_y} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Set0, Set1) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \ Chris@16: }}} Chris@16: Chris@16: /*! Chris@16: \brief \brief_macro{3D point type} \brief_macro_getset Chris@16: \ingroup register Chris@16: \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET, three-dimensional point type}. \details_macro_getset Chris@16: \param Point \param_macro_type{Point} Chris@16: \param CoordinateType \param_macro_coortype{point} Chris@16: \param CoordinateSystem \param_macro_coorsystem Chris@16: \param Get0 \param_macro_getset{get, \macro_x} Chris@16: \param Get1 \param_macro_getset{get, \macro_y} Chris@16: \param Get2 \param_macro_getset{get, \macro_z} Chris@16: \param Set0 \param_macro_getset{set, \macro_x} Chris@16: \param Set1 \param_macro_getset{set, \macro_y} Chris@16: \param Set2 \param_macro_getset{set, \macro_z} Chris@16: */ Chris@16: #define BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Get2, Set0, Set1, Set2) \ Chris@16: namespace boost { namespace geometry { namespace traits { \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \ Chris@16: BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 2, CoordinateType, Get2, Set2) \ Chris@16: }}} Chris@16: Chris@16: #endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP