// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2020 Digvijay Janartha, Hamirpur, India. // This file was modified by Oracle on 2020. // Modifications copyright (c) 2020, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // 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_POINT_XYZ_HPP #define BOOST_GEOMETRY_GEOMETRIES_POINT_XYZ_HPP #include #include #include #include namespace boost { namespace geometry { namespace model { namespace d3 { /*! \brief 3D point in Cartesian coordinate system \tparam CoordinateType numeric type, for example, double, float, int \tparam CoordinateSystem coordinate system, defaults to cs::cartesian \qbk{[include reference/geometries/point_xyz.qbk]} \qbk{before.synopsis, [heading Model of] [link geometry.reference.concepts.concept_point Point Concept] } \qbk{[include reference/geometries/point_assign_warning.qbk]} */ template class point_xyz : public model::point { public: /// \constructor_default_no_init constexpr point_xyz() = default; /// Constructor with x/y/z values constexpr point_xyz(CoordinateType const& x, CoordinateType const& y, CoordinateType const& z) : model::point(x, y, z) {} /// Get x-value constexpr CoordinateType const& x() const { return this->template get<0>(); } /// Get y-value constexpr CoordinateType const& y() const { return this->template get<1>(); } /// Get z-value constexpr CoordinateType const& z() const { return this->template get<2>(); } /// Set x-value void x(CoordinateType const& v) { this->template set<0>(v); } /// Set y-value void y(CoordinateType const& v) { this->template set<1>(v); } /// Set z-value void z(CoordinateType const& v) { this->template set<2>(v); } }; }} // namespace model::d3 // Adapt the point_xyz to the concept #ifndef DOXYGEN_NO_TRAITS_SPECIALIZATIONS namespace traits { template struct tag > { typedef point_tag type; }; template struct coordinate_type > { typedef CoordinateType type; }; template struct coordinate_system > { typedef CoordinateSystem type; }; template struct dimension > : std::integral_constant {}; template struct access, Dimension> { static constexpr CoordinateType get( model::d3::point_xyz const& p) { return p.template get(); } static void set(model::d3::point_xyz& p, CoordinateType const& value) { p.template set(value); } }; template struct make > { typedef model::d3::point_xyz point_type; static const bool is_specialized = true; static constexpr point_type apply(CoordinateType const& x, CoordinateType const& y, CoordinateType const& z) { return point_type(x, y, z); } }; } // namespace traits #endif // DOXYGEN_NO_TRAITS_SPECIALIZATIONS }} // namespace boost::geometry #endif // BOOST_GEOMETRY_GEOMETRIES_POINT_XYZ_HPP