Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-11-01 08:17:45

0001 // Boost.Geometry (aka GGL, Generic Geometry Library)
0002 
0003 // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
0004 // Copyright (c) 2008-2012 Bruno Lalande, Paris, France.
0005 // Copyright (c) 2009-2012 Mateusz Loskot, London, UK.
0006 
0007 // This file was modified by Oracle on 2020.
0008 // Modifications copyright (c) 2020, Oracle and/or its affiliates.
0009 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
0010 
0011 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
0012 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
0013 
0014 // Use, modification and distribution is subject to the Boost Software License,
0015 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
0016 // http://www.boost.org/LICENSE_1_0.txt)
0017 
0018 #ifndef BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
0019 #define BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP
0020 
0021 #include <boost/geometry/core/access.hpp>
0022 #include <boost/geometry/core/coordinate_dimension.hpp>
0023 #include <boost/geometry/core/coordinate_system.hpp>
0024 #include <boost/geometry/core/coordinate_type.hpp>
0025 #include <boost/geometry/core/cs.hpp>
0026 
0027 #include <cstddef>
0028 #include <type_traits>
0029 
0030 #ifndef DOXYGEN_NO_SPECIALIZATIONS
0031 
0032 // Starting point, specialize basic traits necessary to register a point
0033 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, Dim, CoordinateType, CoordinateSystem) \
0034     template<> struct tag<Point> { using type = point_tag; }; \
0035     template<> struct dimension<Point> : std::integral_constant<std::size_t, Dim> {}; \
0036     template<> struct coordinate_type<Point> { using type = CoordinateType; }; \
0037     template<> struct coordinate_system<Point> { using type = CoordinateSystem; };
0038 
0039 // Specialize access class per dimension
0040 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, Dim, CoordinateType, Get, Set) \
0041     template<> struct access<Point, Dim> \
0042     { \
0043         static inline CoordinateType get(Point const& p) { return p. Get; } \
0044         static inline void set(Point& p, CoordinateType const& value) { p. Set = value; } \
0045     };
0046 
0047 // Const version
0048 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, Dim, CoordinateType, Get) \
0049     template<> struct access<Point, Dim> \
0050     { \
0051         static inline CoordinateType get(Point const& p) { return p. Get; } \
0052     };
0053 
0054 
0055 // Getter/setter version
0056 #define BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, Dim, CoordinateType, Get, Set) \
0057     template<> struct access<Point, Dim> \
0058     { \
0059         static inline CoordinateType get(Point const& p) \
0060         { return  p. Get (); } \
0061         static inline void set(Point& p, CoordinateType const& value) \
0062         { p. Set ( value ); } \
0063     };
0064 
0065 #endif // DOXYGEN_NO_SPECIALIZATIONS
0066 
0067 
0068 /*!
0069 \brief \brief_macro{2D point type}
0070 \ingroup register
0071 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D, two-dimensional point type}
0072     \details_macro_lola
0073 \param Point \param_macro_type{Point}
0074 \param CoordinateType \param_macro_coortype{point}
0075 \param CoordinateSystem \param_macro_coorsystem
0076 \param Field0 \param_macro_member{\macro_x_lon}
0077 \param Field1 \param_macro_member{\macro_y_lat}
0078 
0079 \qbk{[include reference/geometries/register/point.qbk]}
0080 */
0081 #define BOOST_GEOMETRY_REGISTER_POINT_2D(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
0082 namespace boost { namespace geometry { namespace traits {  \
0083     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
0084     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
0085     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
0086 }}}
0087 
0088 /*!
0089 \brief \brief_macro{3D point type}
0090 \ingroup register
0091 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D, three-dimensional point type}
0092 \param Point \param_macro_type{Point}
0093 \param CoordinateType \param_macro_coortype{point}
0094 \param CoordinateSystem \param_macro_coorsystem
0095 \param Field0 \param_macro_member{\macro_x}
0096 \param Field1 \param_macro_member{\macro_y}
0097 \param Field2 \param_macro_member{\macro_z}
0098 */
0099 #define BOOST_GEOMETRY_REGISTER_POINT_3D(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
0100 namespace boost { namespace geometry { namespace traits {  \
0101     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
0102     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 0, CoordinateType, Field0, Field0) \
0103     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 1, CoordinateType, Field1, Field1) \
0104     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS(Point, 2, CoordinateType, Field2, Field2) \
0105 }}}
0106 
0107 /*!
0108 \brief \brief_macro{2D point type} \brief_macro_const
0109 \ingroup register
0110 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_CONST, two-dimensional point type}
0111     \details_macro_const
0112     \details_macro_lola
0113 \param Point \param_macro_type{Point}
0114 \param CoordinateType \param_macro_coortype{point}
0115 \param CoordinateSystem \param_macro_coorsystem
0116 \param Field0 \param_macro_member{\macro_x_lon}
0117 \param Field1 \param_macro_member{\macro_y_lat}
0118 */
0119 #define BOOST_GEOMETRY_REGISTER_POINT_2D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1) \
0120 namespace boost { namespace geometry { namespace traits {  \
0121     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
0122     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
0123     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
0124 }}}
0125 
0126 /*!
0127 \brief \brief_macro{3D point type} \brief_macro_const
0128 \ingroup register
0129 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_CONST, three-dimensional point type} \details_macro_const
0130 \param Point \param_macro_type{Point}
0131 \param CoordinateType \param_macro_coortype{point}
0132 \param CoordinateSystem \param_macro_coorsystem
0133 \param Field0 \param_macro_member{\macro_x}
0134 \param Field1 \param_macro_member{\macro_y}
0135 \param Field2 \param_macro_member{\macro_z}
0136 */
0137 #define BOOST_GEOMETRY_REGISTER_POINT_3D_CONST(Point, CoordinateType, CoordinateSystem, Field0, Field1, Field2) \
0138 namespace boost { namespace geometry { namespace traits {  \
0139     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
0140     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 0, CoordinateType, Field0) \
0141     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 1, CoordinateType, Field1) \
0142     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_CONST(Point, 2, CoordinateType, Field2) \
0143 }}}
0144 
0145 /*!
0146 \brief \brief_macro{2D point type} \brief_macro_getset
0147 \ingroup register
0148 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET, two-dimensional point type}
0149     \details_macro_getset
0150     \details_macro_lola
0151 \param Point \param_macro_type{Point}
0152 \param CoordinateType \param_macro_coortype{point}
0153 \param CoordinateSystem \param_macro_coorsystem
0154 \param Get0 \param_macro_getset{get, \macro_x_lon}
0155 \param Get1 \param_macro_getset{get, \macro_y_lat}
0156 \param Set0 \param_macro_getset{set, \macro_x_lon}
0157 \param Set1 \param_macro_getset{set, \macro_y_lat}
0158 */
0159 #define BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Set0, Set1) \
0160 namespace boost { namespace geometry { namespace traits {  \
0161     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 2, CoordinateType, CoordinateSystem) \
0162     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
0163     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
0164 }}}
0165 
0166 /*!
0167 \brief \brief_macro{3D point type} \brief_macro_getset
0168 \ingroup register
0169 \details \details_macro{BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET, three-dimensional point type}
0170     \details_macro_getset
0171 \param Point \param_macro_type{Point}
0172 \param CoordinateType \param_macro_coortype{point}
0173 \param CoordinateSystem \param_macro_coorsystem
0174 \param Get0 \param_macro_getset{get, \macro_x}
0175 \param Get1 \param_macro_getset{get, \macro_y}
0176 \param Get2 \param_macro_getset{get, \macro_z}
0177 \param Set0 \param_macro_getset{set, \macro_x}
0178 \param Set1 \param_macro_getset{set, \macro_y}
0179 \param Set2 \param_macro_getset{set, \macro_z}
0180 */
0181 #define BOOST_GEOMETRY_REGISTER_POINT_3D_GET_SET(Point, CoordinateType, CoordinateSystem, Get0, Get1, Get2, Set0, Set1, Set2) \
0182 namespace boost { namespace geometry { namespace traits {  \
0183     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_TRAITS(Point, 3, CoordinateType, CoordinateSystem) \
0184     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 0, CoordinateType, Get0, Set0) \
0185     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 1, CoordinateType, Get1, Set1) \
0186     BOOST_GEOMETRY_DETAIL_SPECIALIZE_POINT_ACCESS_GET_SET(Point, 2, CoordinateType, Get2, Set2) \
0187 }}}
0188 
0189 #endif // BOOST_GEOMETRY_GEOMETRIES_REGISTER_POINT_HPP