]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/boost/boost/geometry/srs/projections/proj/bonne.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / geometry / srs / projections / proj / bonne.hpp
index 52120a905fbcfa0e7d2b9cdcb3352db6aef3256c..dcbf0e001f8b75dba3e65db94b3d4981a69e0261 100644 (file)
@@ -1,13 +1,9 @@
-#ifndef BOOST_GEOMETRY_PROJECTIONS_BONNE_HPP
-#define BOOST_GEOMETRY_PROJECTIONS_BONNE_HPP
-
-// Boost.Geometry - extensions-gis-projections (based on PROJ4)
-// This file is automatically generated. DO NOT EDIT.
+// Boost.Geometry - gis-projections (based on PROJ4)
 
 // Copyright (c) 2008-2015 Barend Gehrels, Amsterdam, the Netherlands.
 
-// This file was modified by Oracle on 2017.
-// Modifications copyright (c) 2017, Oracle and/or its affiliates.
+// This file was modified by Oracle on 2017, 2018, 2019.
+// Modifications copyright (c) 2017-2019, 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,
@@ -19,7 +15,7 @@
 // PROJ4 is maintained by Frank Warmerdam
 // PROJ4 is converted to Boost.Geometry by Barend Gehrels
 
-// Last updated version of proj: 4.9.1
+// Last updated version of proj: 5.0.0
 
 // Original copyright notice:
 
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-#include <boost/geometry/util/math.hpp>
-#include <boost/math/special_functions/hypot.hpp>
+#ifndef BOOST_GEOMETRY_PROJECTIONS_BONNE_HPP
+#define BOOST_GEOMETRY_PROJECTIONS_BONNE_HPP
 
 #include <boost/geometry/srs/projections/impl/base_static.hpp>
 #include <boost/geometry/srs/projections/impl/base_dynamic.hpp>
-#include <boost/geometry/srs/projections/impl/projects.hpp>
 #include <boost/geometry/srs/projections/impl/factory_entry.hpp>
 #include <boost/geometry/srs/projections/impl/pj_mlfn.hpp>
+#include <boost/geometry/srs/projections/impl/pj_param.hpp>
+#include <boost/geometry/srs/projections/impl/projects.hpp>
 
-namespace boost { namespace geometry
-{
+#include <boost/geometry/util/math.hpp>
 
-namespace srs { namespace par4
-{
-    struct bonne {};
+#include <boost/math/special_functions/hypot.hpp>
 
-}} //namespace srs::par4
+namespace boost { namespace geometry
+{
 
 namespace projections
 {
@@ -65,7 +60,7 @@ namespace projections
     namespace detail { namespace bonne
     {
 
-            static const double EPS10 = 1e-10;
+            static const double epsilon10 = 1e-10;
 
             template <typename T>
             struct par_bonne
@@ -74,54 +69,44 @@ namespace projections
                 T cphi1;
                 T am1;
                 T m1;
-                T en[EN_SIZE];
+                detail::en<T> en;
             };
 
-            // template class, using CRTP to implement forward/inverse
-            template <typename CalculationType, typename Parameters>
-            struct base_bonne_ellipsoid : public base_t_fi<base_bonne_ellipsoid<CalculationType, Parameters>,
-                     CalculationType, Parameters>
+            template <typename T, typename Parameters>
+            struct base_bonne_ellipsoid
             {
-
-                typedef CalculationType geographic_type;
-                typedef CalculationType cartesian_type;
-
-                par_bonne<CalculationType> m_proj_parm;
-
-                inline base_bonne_ellipsoid(const Parameters& par)
-                    : base_t_fi<base_bonne_ellipsoid<CalculationType, Parameters>,
-                     CalculationType, Parameters>(*this, par) {}
+                par_bonne<T> m_proj_parm;
 
                 // FORWARD(e_forward)  ellipsoid
                 // Project coordinates from geographic (lon, lat) to cartesian (x, y)
-                inline void fwd(geographic_type& lp_lon, geographic_type& lp_lat, cartesian_type& xy_x, cartesian_type& xy_y) const
+                inline void fwd(Parameters const& par, T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const
                 {
-                    CalculationType rh, E, c;
+                    T rh, E, c;
 
                     rh = this->m_proj_parm.am1 + this->m_proj_parm.m1 - pj_mlfn(lp_lat, E = sin(lp_lat), c = cos(lp_lat), this->m_proj_parm.en);
-                    E = c * lp_lon / (rh * sqrt(1. - this->m_par.es * E * E));
+                    E = c * lp_lon / (rh * sqrt(1. - par.es * E * E));
                     xy_x = rh * sin(E);
                     xy_y = this->m_proj_parm.am1 - rh * cos(E);
                 }
 
                 // INVERSE(e_inverse)  ellipsoid
                 // Project coordinates from cartesian (x, y) to geographic (lon, lat)
-                inline void inv(cartesian_type& xy_x, cartesian_type& xy_y, geographic_type& lp_lon, geographic_type& lp_lat) const
+                inline void inv(Parameters const& par, T const& xy_x, T xy_y, T& lp_lon, T& lp_lat) const
                 {
-                    static const CalculationType HALFPI = detail::HALFPI<CalculationType>();
+                    static const T half_pi = detail::half_pi<T>();
 
-                    CalculationType s, rh;
+                    T s, rh;
 
                     rh = boost::math::hypot(xy_x, xy_y = this->m_proj_parm.am1 - xy_y);
-                    lp_lat = pj_inv_mlfn(this->m_proj_parm.am1 + this->m_proj_parm.m1 - rh, this->m_par.es, this->m_proj_parm.en);
-                    if ((s = fabs(lp_lat)) < HALFPI) {
+                    lp_lat = pj_inv_mlfn(this->m_proj_parm.am1 + this->m_proj_parm.m1 - rh, par.es, this->m_proj_parm.en);
+                    if ((s = fabs(lp_lat)) < half_pi) {
                         s = sin(lp_lat);
                         lp_lon = rh * atan2(xy_x, xy_y) *
-                           sqrt(1. - this->m_par.es * s * s) / cos(lp_lat);
-                    } else if (fabs(s - HALFPI) <= EPS10)
+                           sqrt(1. - par.es * s * s) / cos(lp_lat);
+                    } else if (fabs(s - half_pi) <= epsilon10)
                         lp_lon = 0.;
                     else
-                        BOOST_THROW_EXCEPTION( projection_exception(-20) );
+                        BOOST_THROW_EXCEPTION( projection_exception(error_tolerance_condition) );
                 }
 
                 static inline std::string get_name()
@@ -131,29 +116,19 @@ namespace projections
 
             };
 
-            // template class, using CRTP to implement forward/inverse
-            template <typename CalculationType, typename Parameters>
-            struct base_bonne_spheroid : public base_t_fi<base_bonne_spheroid<CalculationType, Parameters>,
-                     CalculationType, Parameters>
+            template <typename T, typename Parameters>
+            struct base_bonne_spheroid
             {
-
-                typedef CalculationType geographic_type;
-                typedef CalculationType cartesian_type;
-
-                par_bonne<CalculationType> m_proj_parm;
-
-                inline base_bonne_spheroid(const Parameters& par)
-                    : base_t_fi<base_bonne_spheroid<CalculationType, Parameters>,
-                     CalculationType, Parameters>(*this, par) {}
+                par_bonne<T> m_proj_parm;
 
                 // FORWARD(s_forward)  spheroid
                 // Project coordinates from geographic (lon, lat) to cartesian (x, y)
-                inline void fwd(geographic_type& lp_lon, geographic_type& lp_lat, cartesian_type& xy_x, cartesian_type& xy_y) const
+                inline void fwd(Parameters const& , T const& lp_lon, T const& lp_lat, T& xy_x, T& xy_y) const
                 {
-                    CalculationType E, rh;
+                    T E, rh;
 
                     rh = this->m_proj_parm.cphi1 + this->m_proj_parm.phi1 - lp_lat;
-                    if (fabs(rh) > EPS10) {
+                    if (fabs(rh) > epsilon10) {
                         xy_x = rh * sin(E = lp_lon * cos(lp_lat) / rh);
                         xy_y = this->m_proj_parm.cphi1 - rh * cos(E);
                     } else
@@ -162,17 +137,18 @@ namespace projections
 
                 // INVERSE(s_inverse)  spheroid
                 // Project coordinates from cartesian (x, y) to geographic (lon, lat)
-                inline void inv(cartesian_type& xy_x, cartesian_type& xy_y, geographic_type& lp_lon, geographic_type& lp_lat) const
+                inline void inv(Parameters const& , T const& xy_x, T xy_y, T& lp_lon, T& lp_lat) const
                 {
-                    static const CalculationType HALFPI = detail::HALFPI<CalculationType>();
+                    static const T half_pi = detail::half_pi<T>();
 
-                    CalculationType rh;
+                    T rh;
 
                     rh = boost::math::hypot(xy_x, xy_y = this->m_proj_parm.cphi1 - xy_y);
                     lp_lat = this->m_proj_parm.cphi1 + this->m_proj_parm.phi1 - rh;
-                    if (fabs(lp_lat) > HALFPI)
-                        BOOST_THROW_EXCEPTION( projection_exception(-20) );
-                    if (fabs(fabs(lp_lat) - HALFPI) <= EPS10)
+                    if (fabs(lp_lat) > half_pi) {
+                        BOOST_THROW_EXCEPTION( projection_exception(error_tolerance_condition) );
+                    }
+                    if (fabs(fabs(lp_lat) - half_pi) <= epsilon10)
                         lp_lon = 0.;
                     else
                         lp_lon = rh * atan2(xy_x, xy_y) / cos(lp_lat);
@@ -186,23 +162,24 @@ namespace projections
             };
 
             // Bonne (Werner lat_1=90)
-            template <typename Parameters, typename T>
-            inline void setup_bonne(Parameters& par, par_bonne<T>& proj_parm)
+            template <typename Params, typename Parameters, typename T>
+            inline void setup_bonne(Params const& params, Parameters const& par, par_bonne<T>& proj_parm)
             {
-                static const T HALFPI = detail::HALFPI<T>();
+                static const T half_pi = detail::half_pi<T>();
 
                 T c;
 
-                proj_parm.phi1 = pj_param(par.params, "rlat_1").f;
-                if (fabs(proj_parm.phi1) < EPS10)
-                    BOOST_THROW_EXCEPTION( projection_exception(-23) );
-                if (par.es) {
-                    pj_enfn(par.es, proj_parm.en);
+                proj_parm.phi1 = pj_get_param_r<T, srs::spar::lat_1>(params, "lat_1", srs::dpar::lat_1);
+                if (fabs(proj_parm.phi1) < epsilon10)
+                    BOOST_THROW_EXCEPTION( projection_exception(error_lat1_is_zero) );
+
+                if (par.es != 0.0) {
+                    proj_parm.en = pj_enfn<T>(par.es);
                     proj_parm.m1 = pj_mlfn(proj_parm.phi1, proj_parm.am1 = sin(proj_parm.phi1),
                         c = cos(proj_parm.phi1), proj_parm.en);
                     proj_parm.am1 = c / (sqrt(1. - par.es * proj_parm.am1 * proj_parm.am1) * proj_parm.am1);
                 } else {
-                    if (fabs(proj_parm.phi1) + EPS10 >= HALFPI)
+                    if (fabs(proj_parm.phi1) + epsilon10 >= half_pi)
                         proj_parm.cphi1 = 0.;
                     else
                         proj_parm.cphi1 = 1. / tan(proj_parm.phi1);
@@ -227,12 +204,13 @@ namespace projections
         \par Example
         \image html ex_bonne.gif
     */
-    template <typename CalculationType, typename Parameters>
-    struct bonne_ellipsoid : public detail::bonne::base_bonne_ellipsoid<CalculationType, Parameters>
+    template <typename T, typename Parameters>
+    struct bonne_ellipsoid : public detail::bonne::base_bonne_ellipsoid<T, Parameters>
     {
-        inline bonne_ellipsoid(const Parameters& par) : detail::bonne::base_bonne_ellipsoid<CalculationType, Parameters>(par)
+        template <typename Params>
+        inline bonne_ellipsoid(Params const& params, Parameters const& par)
         {
-            detail::bonne::setup_bonne(this->m_par, this->m_proj_parm);
+            detail::bonne::setup_bonne(params, par, this->m_proj_parm);
         }
     };
 
@@ -251,12 +229,13 @@ namespace projections
         \par Example
         \image html ex_bonne.gif
     */
-    template <typename CalculationType, typename Parameters>
-    struct bonne_spheroid : public detail::bonne::base_bonne_spheroid<CalculationType, Parameters>
+    template <typename T, typename Parameters>
+    struct bonne_spheroid : public detail::bonne::base_bonne_spheroid<T, Parameters>
     {
-        inline bonne_spheroid(const Parameters& par) : detail::bonne::base_bonne_spheroid<CalculationType, Parameters>(par)
+        template <typename Params>
+        inline bonne_spheroid(Params const& params, Parameters const& par)
         {
-            detail::bonne::setup_bonne(this->m_par, this->m_proj_parm);
+            detail::bonne::setup_bonne(params, par, this->m_proj_parm);
         }
     };
 
@@ -265,26 +244,14 @@ namespace projections
     {
 
         // Static projection
-        BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION(srs::par4::bonne, bonne_spheroid, bonne_ellipsoid)
+        BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI2(srs::spar::proj_bonne, bonne_spheroid, bonne_ellipsoid)
 
         // Factory entry(s)
-        template <typename CalculationType, typename Parameters>
-        class bonne_entry : public detail::factory_entry<CalculationType, Parameters>
-        {
-            public :
-                virtual base_v<CalculationType, Parameters>* create_new(const Parameters& par) const
-                {
-                    if (par.es)
-                        return new base_v_fi<bonne_ellipsoid<CalculationType, Parameters>, CalculationType, Parameters>(par);
-                    else
-                        return new base_v_fi<bonne_spheroid<CalculationType, Parameters>, CalculationType, Parameters>(par);
-                }
-        };
+        BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI2(bonne_entry, bonne_spheroid, bonne_ellipsoid)
 
-        template <typename CalculationType, typename Parameters>
-        inline void bonne_init(detail::base_factory<CalculationType, Parameters>& factory)
+        BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(bonne_init)
         {
-            factory.add_to_factory("bonne", new bonne_entry<CalculationType, Parameters>);
+            BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(bonne, bonne_entry);
         }
 
     } // namespace detail