annotate DEPENDENCIES/generic/include/boost/geometry/geometries/point.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost.Geometry (aka GGL, Generic Geometry Library)
Chris@16 2
Chris@101 3 // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
Chris@101 4 // Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
Chris@101 5 // Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
Chris@101 6 // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland.
Chris@101 7
Chris@101 8 // This file was modified by Oracle on 2014.
Chris@101 9 // Modifications copyright (c) 2014, Oracle and/or its affiliates.
Chris@101 10
Chris@101 11 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
Chris@16 12
Chris@16 13 // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
Chris@16 14 // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
Chris@16 15
Chris@16 16 // Use, modification and distribution is subject to the Boost Software License,
Chris@16 17 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 18 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 19
Chris@16 20 #ifndef BOOST_GEOMETRY_GEOMETRIES_POINT_HPP
Chris@16 21 #define BOOST_GEOMETRY_GEOMETRIES_POINT_HPP
Chris@16 22
Chris@16 23 #include <cstddef>
Chris@16 24
Chris@16 25 #include <boost/mpl/int.hpp>
Chris@16 26 #include <boost/static_assert.hpp>
Chris@16 27
Chris@16 28 #include <boost/geometry/core/access.hpp>
Chris@16 29 #include <boost/geometry/core/coordinate_type.hpp>
Chris@16 30 #include <boost/geometry/core/coordinate_system.hpp>
Chris@16 31 #include <boost/geometry/core/coordinate_dimension.hpp>
Chris@16 32
Chris@16 33 namespace boost { namespace geometry
Chris@16 34 {
Chris@16 35
Chris@16 36 // Silence warning C4127: conditional expression is constant
Chris@16 37 #if defined(_MSC_VER)
Chris@101 38 #pragma warning(push)
Chris@16 39 #pragma warning(disable : 4127)
Chris@16 40 #endif
Chris@16 41
Chris@16 42
Chris@16 43 namespace model
Chris@16 44 {
Chris@16 45
Chris@101 46 namespace detail
Chris@101 47 {
Chris@101 48
Chris@101 49 template <std::size_t DimensionCount, std::size_t Index>
Chris@101 50 struct array_assign
Chris@101 51 {
Chris@101 52 template <typename T>
Chris@101 53 static inline void apply(T values[], T const& value)
Chris@101 54 {
Chris@101 55 values[Index] = value;
Chris@101 56 }
Chris@101 57 };
Chris@101 58
Chris@101 59 // Specialization avoiding assigning element [2] for only 2 dimensions
Chris@101 60 template <> struct array_assign<2, 2>
Chris@101 61 {
Chris@101 62 template <typename T> static inline void apply(T [], T const& ) {}
Chris@101 63 };
Chris@101 64
Chris@101 65 // Specialization avoiding assigning elements for (rarely used) points in 1 dim
Chris@101 66 template <> struct array_assign<1, 1>
Chris@101 67 {
Chris@101 68 template <typename T> static inline void apply(T [], T const& ) {}
Chris@101 69 };
Chris@101 70
Chris@101 71 template <> struct array_assign<1, 2>
Chris@101 72 {
Chris@101 73 template <typename T> static inline void apply(T [], T const& ) {}
Chris@101 74 };
Chris@101 75
Chris@101 76 }
Chris@16 77 /*!
Chris@16 78 \brief Basic point class, having coordinates defined in a neutral way
Chris@16 79 \details Defines a neutral point class, fulfilling the Point Concept.
Chris@16 80 Library users can use this point class, or use their own point classes.
Chris@16 81 This point class is used in most of the samples and tests of Boost.Geometry
Chris@16 82 This point class is used occasionally within the library, where a temporary
Chris@16 83 point class is necessary.
Chris@16 84 \ingroup geometries
Chris@16 85 \tparam CoordinateType \tparam_numeric
Chris@16 86 \tparam DimensionCount number of coordinates, usually 2 or 3
Chris@16 87 \tparam CoordinateSystem coordinate system, for example cs::cartesian
Chris@16 88
Chris@16 89 \qbk{[include reference/geometries/point.qbk]}
Chris@16 90 \qbk{before.synopsis, [heading Model of]}
Chris@16 91 \qbk{before.synopsis, [link geometry.reference.concepts.concept_point Point Concept]}
Chris@16 92
Chris@16 93
Chris@16 94 */
Chris@16 95 template
Chris@16 96 <
Chris@16 97 typename CoordinateType,
Chris@16 98 std::size_t DimensionCount,
Chris@16 99 typename CoordinateSystem
Chris@16 100 >
Chris@16 101 class point
Chris@16 102 {
Chris@101 103 private:
Chris@101 104 // The following enum is used to fully instantiate the
Chris@101 105 // CoordinateSystem class and check the correctness of the units
Chris@101 106 // passed for non-Cartesian coordinate systems.
Chris@101 107 enum { cs_check = sizeof(CoordinateSystem) };
Chris@101 108
Chris@16 109 public:
Chris@16 110
Chris@16 111 /// @brief Default constructor, no initialization
Chris@16 112 inline point()
Chris@101 113 {
Chris@101 114 BOOST_STATIC_ASSERT(DimensionCount >= 1);
Chris@101 115 }
Chris@16 116
Chris@101 117 /// @brief Constructor to set one value
Chris@101 118 explicit inline point(CoordinateType const& v0)
Chris@16 119 {
Chris@101 120 detail::array_assign<DimensionCount, 0>::apply(m_values, v0);
Chris@101 121 detail::array_assign<DimensionCount, 1>::apply(m_values, CoordinateType());
Chris@101 122 detail::array_assign<DimensionCount, 2>::apply(m_values, CoordinateType());
Chris@101 123 }
Chris@101 124
Chris@101 125 /// @brief Constructor to set two values
Chris@101 126 inline point(CoordinateType const& v0, CoordinateType const& v1)
Chris@101 127 {
Chris@101 128 detail::array_assign<DimensionCount, 0>::apply(m_values, v0);
Chris@101 129 detail::array_assign<DimensionCount, 1>::apply(m_values, v1);
Chris@101 130 detail::array_assign<DimensionCount, 2>::apply(m_values, CoordinateType());
Chris@101 131 }
Chris@101 132
Chris@101 133 /// @brief Constructor to set three values
Chris@101 134 inline point(CoordinateType const& v0, CoordinateType const& v1,
Chris@101 135 CoordinateType const& v2)
Chris@101 136 {
Chris@101 137 detail::array_assign<DimensionCount, 0>::apply(m_values, v0);
Chris@101 138 detail::array_assign<DimensionCount, 1>::apply(m_values, v1);
Chris@101 139 detail::array_assign<DimensionCount, 2>::apply(m_values, v2);
Chris@16 140 }
Chris@16 141
Chris@16 142 /// @brief Get a coordinate
Chris@16 143 /// @tparam K coordinate to get
Chris@16 144 /// @return the coordinate
Chris@16 145 template <std::size_t K>
Chris@16 146 inline CoordinateType const& get() const
Chris@16 147 {
Chris@16 148 BOOST_STATIC_ASSERT(K < DimensionCount);
Chris@16 149 return m_values[K];
Chris@16 150 }
Chris@16 151
Chris@16 152 /// @brief Set a coordinate
Chris@16 153 /// @tparam K coordinate to set
Chris@16 154 /// @param value value to set
Chris@16 155 template <std::size_t K>
Chris@16 156 inline void set(CoordinateType const& value)
Chris@16 157 {
Chris@16 158 BOOST_STATIC_ASSERT(K < DimensionCount);
Chris@16 159 m_values[K] = value;
Chris@16 160 }
Chris@16 161
Chris@16 162 private:
Chris@16 163
Chris@16 164 CoordinateType m_values[DimensionCount];
Chris@16 165 };
Chris@16 166
Chris@16 167
Chris@16 168 } // namespace model
Chris@16 169
Chris@16 170 // Adapt the point to the concept
Chris@16 171 #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS
Chris@16 172 namespace traits
Chris@16 173 {
Chris@16 174 template
Chris@16 175 <
Chris@16 176 typename CoordinateType,
Chris@16 177 std::size_t DimensionCount,
Chris@16 178 typename CoordinateSystem
Chris@16 179 >
Chris@16 180 struct tag<model::point<CoordinateType, DimensionCount, CoordinateSystem> >
Chris@16 181 {
Chris@16 182 typedef point_tag type;
Chris@16 183 };
Chris@16 184
Chris@16 185 template
Chris@16 186 <
Chris@16 187 typename CoordinateType,
Chris@16 188 std::size_t DimensionCount,
Chris@16 189 typename CoordinateSystem
Chris@16 190 >
Chris@16 191 struct coordinate_type<model::point<CoordinateType, DimensionCount, CoordinateSystem> >
Chris@16 192 {
Chris@16 193 typedef CoordinateType type;
Chris@16 194 };
Chris@16 195
Chris@16 196 template
Chris@16 197 <
Chris@16 198 typename CoordinateType,
Chris@16 199 std::size_t DimensionCount,
Chris@16 200 typename CoordinateSystem
Chris@16 201 >
Chris@16 202 struct coordinate_system<model::point<CoordinateType, DimensionCount, CoordinateSystem> >
Chris@16 203 {
Chris@16 204 typedef CoordinateSystem type;
Chris@16 205 };
Chris@16 206
Chris@16 207 template
Chris@16 208 <
Chris@16 209 typename CoordinateType,
Chris@16 210 std::size_t DimensionCount,
Chris@16 211 typename CoordinateSystem
Chris@16 212 >
Chris@16 213 struct dimension<model::point<CoordinateType, DimensionCount, CoordinateSystem> >
Chris@16 214 : boost::mpl::int_<DimensionCount>
Chris@16 215 {};
Chris@16 216
Chris@16 217 template
Chris@16 218 <
Chris@16 219 typename CoordinateType,
Chris@16 220 std::size_t DimensionCount,
Chris@16 221 typename CoordinateSystem,
Chris@16 222 std::size_t Dimension
Chris@16 223 >
Chris@16 224 struct access<model::point<CoordinateType, DimensionCount, CoordinateSystem>, Dimension>
Chris@16 225 {
Chris@16 226 static inline CoordinateType get(
Chris@16 227 model::point<CoordinateType, DimensionCount, CoordinateSystem> const& p)
Chris@16 228 {
Chris@16 229 return p.template get<Dimension>();
Chris@16 230 }
Chris@16 231
Chris@16 232 static inline void set(
Chris@16 233 model::point<CoordinateType, DimensionCount, CoordinateSystem>& p,
Chris@16 234 CoordinateType const& value)
Chris@16 235 {
Chris@16 236 p.template set<Dimension>(value);
Chris@16 237 }
Chris@16 238 };
Chris@16 239
Chris@16 240 } // namespace traits
Chris@16 241 #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS
Chris@16 242
Chris@16 243 #if defined(_MSC_VER)
Chris@16 244 #pragma warning(pop)
Chris@16 245 #endif
Chris@16 246
Chris@16 247 }} // namespace boost::geometry
Chris@16 248
Chris@16 249 #endif // BOOST_GEOMETRY_GEOMETRIES_POINT_HPP