// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // 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, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_PROJECTIONS_IMPL_BASE_STATIC_HPP #define BOOST_GEOMETRY_PROJECTIONS_IMPL_BASE_STATIC_HPP #if defined(_MSC_VER) // For CRTP, *this is acceptable in constructor -> turn warning off #pragma warning( disable : 4355 ) #endif // defined(_MSC_VER) #include #include #include #include #include #include namespace boost { namespace geometry { namespace projections { #ifndef DOXYGEN_NO_DETAIL namespace detail { template struct static_projection_type { BOOST_MPL_ASSERT_MSG((false), NOT_IMPLEMENTED_FOR_THIS_PROJECTION_OR_CSTAG, (Prj, CSTag)); }; #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_F(PROJ, P_SPHXXX) \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_f, P> type; \ }; \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_f, P> type; \ }; \ #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI(PROJ, P_SPHXXX) \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_fi, P> type; \ }; \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_fi, P> type; \ }; \ #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_STATIC_PROJECTION_FI2(PROJ, P_SPHERE, P_SPHEROID) \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_fi, P> type; \ }; \ template \ struct static_projection_type \ { \ typedef projections::detail::static_wrapper_fi, P> type; \ }; \ template struct static_wrapper_b { inline explicit static_wrapper_b(P const& par) : m_par(par) {} std::string name() const { return m_par.id.name; } P const& params() const { return m_par; } P& mutable_params() { return m_par; } protected: P m_par; }; // Forward template struct static_wrapper_f : public static_wrapper_b

, public Prj { public: template inline static_wrapper_f(Params const& params, P const& par) : static_wrapper_b

(par) , Prj(params, this->m_par) // prj can modify parameters {} template inline bool forward(LL const& lp, XY& xy) const { try { pj_fwd(*this, this->m_par, lp, xy); return true; } catch (...) { return false; } } template inline bool inverse(XY const&, LL&) const { BOOST_MPL_ASSERT_MSG((false), PROJECTION_IS_NOT_INVERTABLE, (Prj)); return false; } }; // Forward/inverse template struct static_wrapper_fi : public static_wrapper_f { public: template inline static_wrapper_fi(Params const& params, P const& par) : static_wrapper_f(params, par) {} template inline bool inverse(XY const& xy, LL& lp) const { try { pj_inv(*this, this->m_par, xy, lp); return true; } catch (...) { return false; } } }; } // namespace detail #endif // DOXYGEN_NO_DETAIL }}} // namespace boost::geometry::projections #endif // BOOST_GEOMETRY_PROJECTIONS_IMPL_BASE_STATIC_HPP