Chris@16: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@16: Chris@101: // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. Chris@101: // Copyright (c) 2008-2014 Bruno Lalande, Paris, France. Chris@101: // Copyright (c) 2009-2014 Mateusz Loskot, London, UK. Chris@101: // Copyright (c) 2014 Adam Wulkiewicz, Lodz, Poland. Chris@101: Chris@101: // This file was modified by Oracle on 2014. Chris@101: // Modifications copyright (c) 2014, Oracle and/or its affiliates. Chris@101: Chris@101: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 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_POINT_HPP Chris@16: #define BOOST_GEOMETRY_GEOMETRIES_POINT_HPP Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace geometry Chris@16: { Chris@16: Chris@16: // Silence warning C4127: conditional expression is constant Chris@16: #if defined(_MSC_VER) Chris@101: #pragma warning(push) Chris@16: #pragma warning(disable : 4127) Chris@16: #endif Chris@16: Chris@16: Chris@16: namespace model Chris@16: { Chris@16: Chris@101: namespace detail Chris@101: { Chris@101: Chris@101: template Chris@101: struct array_assign Chris@101: { Chris@101: template Chris@101: static inline void apply(T values[], T const& value) Chris@101: { Chris@101: values[Index] = value; Chris@101: } Chris@101: }; Chris@101: Chris@101: // Specialization avoiding assigning element [2] for only 2 dimensions Chris@101: template <> struct array_assign<2, 2> Chris@101: { Chris@101: template static inline void apply(T [], T const& ) {} Chris@101: }; Chris@101: Chris@101: // Specialization avoiding assigning elements for (rarely used) points in 1 dim Chris@101: template <> struct array_assign<1, 1> Chris@101: { Chris@101: template static inline void apply(T [], T const& ) {} Chris@101: }; Chris@101: Chris@101: template <> struct array_assign<1, 2> Chris@101: { Chris@101: template static inline void apply(T [], T const& ) {} Chris@101: }; Chris@101: Chris@101: } Chris@16: /*! Chris@16: \brief Basic point class, having coordinates defined in a neutral way Chris@16: \details Defines a neutral point class, fulfilling the Point Concept. Chris@16: Library users can use this point class, or use their own point classes. Chris@16: This point class is used in most of the samples and tests of Boost.Geometry Chris@16: This point class is used occasionally within the library, where a temporary Chris@16: point class is necessary. Chris@16: \ingroup geometries Chris@16: \tparam CoordinateType \tparam_numeric Chris@16: \tparam DimensionCount number of coordinates, usually 2 or 3 Chris@16: \tparam CoordinateSystem coordinate system, for example cs::cartesian Chris@16: Chris@16: \qbk{[include reference/geometries/point.qbk]} Chris@16: \qbk{before.synopsis, [heading Model of]} Chris@16: \qbk{before.synopsis, [link geometry.reference.concepts.concept_point Point Concept]} Chris@16: Chris@16: Chris@16: */ Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem Chris@16: > Chris@16: class point Chris@16: { Chris@101: private: Chris@101: // The following enum is used to fully instantiate the Chris@101: // CoordinateSystem class and check the correctness of the units Chris@101: // passed for non-Cartesian coordinate systems. Chris@101: enum { cs_check = sizeof(CoordinateSystem) }; Chris@101: Chris@16: public: Chris@16: Chris@16: /// @brief Default constructor, no initialization Chris@16: inline point() Chris@101: { Chris@101: BOOST_STATIC_ASSERT(DimensionCount >= 1); Chris@101: } Chris@16: Chris@101: /// @brief Constructor to set one value Chris@101: explicit inline point(CoordinateType const& v0) Chris@16: { Chris@101: detail::array_assign::apply(m_values, v0); Chris@101: detail::array_assign::apply(m_values, CoordinateType()); Chris@101: detail::array_assign::apply(m_values, CoordinateType()); Chris@101: } Chris@101: Chris@101: /// @brief Constructor to set two values Chris@101: inline point(CoordinateType const& v0, CoordinateType const& v1) Chris@101: { Chris@101: detail::array_assign::apply(m_values, v0); Chris@101: detail::array_assign::apply(m_values, v1); Chris@101: detail::array_assign::apply(m_values, CoordinateType()); Chris@101: } Chris@101: Chris@101: /// @brief Constructor to set three values Chris@101: inline point(CoordinateType const& v0, CoordinateType const& v1, Chris@101: CoordinateType const& v2) Chris@101: { Chris@101: detail::array_assign::apply(m_values, v0); Chris@101: detail::array_assign::apply(m_values, v1); Chris@101: detail::array_assign::apply(m_values, v2); Chris@16: } Chris@16: Chris@16: /// @brief Get a coordinate Chris@16: /// @tparam K coordinate to get Chris@16: /// @return the coordinate Chris@16: template Chris@16: inline CoordinateType const& get() const Chris@16: { Chris@16: BOOST_STATIC_ASSERT(K < DimensionCount); Chris@16: return m_values[K]; Chris@16: } Chris@16: Chris@16: /// @brief Set a coordinate Chris@16: /// @tparam K coordinate to set Chris@16: /// @param value value to set Chris@16: template Chris@16: inline void set(CoordinateType const& value) Chris@16: { Chris@16: BOOST_STATIC_ASSERT(K < DimensionCount); Chris@16: m_values[K] = value; Chris@16: } Chris@16: Chris@16: private: Chris@16: Chris@16: CoordinateType m_values[DimensionCount]; Chris@16: }; Chris@16: Chris@16: Chris@16: } // namespace model Chris@16: Chris@16: // Adapt the point to the concept Chris@16: #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS Chris@16: namespace traits Chris@16: { Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem Chris@16: > Chris@16: struct tag > Chris@16: { Chris@16: typedef point_tag type; Chris@16: }; Chris@16: Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem Chris@16: > Chris@16: struct coordinate_type > Chris@16: { Chris@16: typedef CoordinateType type; Chris@16: }; Chris@16: Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem Chris@16: > Chris@16: struct coordinate_system > Chris@16: { Chris@16: typedef CoordinateSystem type; Chris@16: }; Chris@16: Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem Chris@16: > Chris@16: struct dimension > Chris@16: : boost::mpl::int_ Chris@16: {}; Chris@16: Chris@16: template Chris@16: < Chris@16: typename CoordinateType, Chris@16: std::size_t DimensionCount, Chris@16: typename CoordinateSystem, Chris@16: std::size_t Dimension Chris@16: > Chris@16: struct access, Dimension> Chris@16: { Chris@16: static inline CoordinateType get( Chris@16: model::point const& p) Chris@16: { Chris@16: return p.template get(); Chris@16: } Chris@16: Chris@16: static inline void set( Chris@16: model::point& p, Chris@16: CoordinateType const& value) Chris@16: { Chris@16: p.template set(value); Chris@16: } Chris@16: }; Chris@16: Chris@16: } // namespace traits Chris@16: #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS Chris@16: Chris@16: #if defined(_MSC_VER) Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: }} // namespace boost::geometry Chris@16: Chris@16: #endif // BOOST_GEOMETRY_GEOMETRIES_POINT_HPP