// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. // This file was modified by Oracle on 2017-2020. // Modifications copyright (c) 2017-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_PROJECTIONS_FACTORY_HPP #define BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { namespace projections { namespace detail { template struct factory_key { BOOST_GEOMETRY_STATIC_ASSERT_FALSE( "Invalid parameters type.", Params); }; template <> struct factory_key { typedef std::string type; template static type const& get(ProjParams const& par) { return par.id.name; } static const char* get(const char* name, srs::dpar::value_proj id) { return name; } }; template struct factory_key > { typedef srs::dpar::value_proj type; template static type const& get(ProjParams const& par) { return par.id.id; } static srs::dpar::value_proj get(const char* name, srs::dpar::value_proj id) { return id; } }; template class factory { private: typedef detail::factory_entry < Params, CT, ProjParams > entry_base; typedef factory_key key; typedef typename key::type key_type; typedef boost::shared_ptr entry_ptr; typedef std::map entries_map; entries_map m_entries; public: factory() { detail::aea_init(*this); detail::aeqd_init(*this); detail::airy_init(*this); detail::aitoff_init(*this); detail::august_init(*this); detail::bacon_init(*this); detail::bipc_init(*this); detail::boggs_init(*this); detail::bonne_init(*this); detail::cass_init(*this); detail::cc_init(*this); detail::cea_init(*this); detail::chamb_init(*this); detail::collg_init(*this); detail::crast_init(*this); detail::denoy_init(*this); detail::eck1_init(*this); detail::eck2_init(*this); detail::eck3_init(*this); detail::eck4_init(*this); detail::eck5_init(*this); detail::eqc_init(*this); detail::eqdc_init(*this); detail::etmerc_init(*this); detail::fahey_init(*this); detail::fouc_s_init(*this); detail::gall_init(*this); detail::geocent_init(*this); detail::geos_init(*this); detail::gins8_init(*this); detail::gn_sinu_init(*this); detail::gnom_init(*this); detail::goode_init(*this); detail::gstmerc_init(*this); detail::hammer_init(*this); detail::hatano_init(*this); detail::healpix_init(*this); detail::krovak_init(*this); detail::igh_init(*this); detail::imw_p_init(*this); detail::isea_init(*this); detail::labrd_init(*this); detail::laea_init(*this); detail::lagrng_init(*this); detail::larr_init(*this); detail::lask_init(*this); detail::latlong_init(*this); detail::lcc_init(*this); detail::lcca_init(*this); detail::loxim_init(*this); detail::lsat_init(*this); detail::mbtfpp_init(*this); detail::mbtfpq_init(*this); detail::mbt_fps_init(*this); detail::merc_init(*this); detail::mill_init(*this); detail::mod_ster_init(*this); detail::moll_init(*this); detail::natearth_init(*this); detail::nell_init(*this); detail::nell_h_init(*this); detail::nocol_init(*this); detail::nsper_init(*this); detail::nzmg_init(*this); detail::ob_tran_init(*this); detail::ocea_init(*this); detail::oea_init(*this); detail::omerc_init(*this); detail::ortho_init(*this); detail::qsc_init(*this); detail::poly_init(*this); detail::putp2_init(*this); detail::putp3_init(*this); detail::putp4p_init(*this); detail::putp5_init(*this); detail::putp6_init(*this); detail::robin_init(*this); detail::rouss_init(*this); detail::rpoly_init(*this); detail::sconics_init(*this); detail::somerc_init(*this); detail::stere_init(*this); detail::sterea_init(*this); detail::sts_init(*this); detail::tcc_init(*this); detail::tcea_init(*this); detail::tmerc_init(*this); detail::tpeqd_init(*this); detail::urm5_init(*this); detail::urmfps_init(*this); detail::vandg_init(*this); detail::vandg2_init(*this); detail::vandg4_init(*this); detail::wag2_init(*this); detail::wag3_init(*this); detail::wag7_init(*this); detail::wink1_init(*this); detail::wink2_init(*this); } void add_to_factory(const char* name, srs::dpar::value_proj id, entry_base* entry) { // The pointer has to be owned before std::map::operator[] in case it thrown an exception. entry_ptr ptr(entry); m_entries[key::get(name, id)] = ptr; } detail::dynamic_wrapper_b* create_new(Params const& params, ProjParams const& proj_par) const { typedef typename entries_map::const_iterator const_iterator; const_iterator it = m_entries.find(key::get(proj_par)); if (it != m_entries.end()) { return it->second->create_new(params, proj_par); } return 0; } }; template inline detail::dynamic_wrapper_b >* create_new(srs::detail::proj4_parameters const& params, projections::parameters const& parameters) { static factory > const fac; return fac.create_new(params, parameters); } template inline detail::dynamic_wrapper_b >* create_new(srs::dpar::parameters const& params, projections::parameters const& parameters) { static factory, T, projections::parameters > const fac; return fac.create_new(params, parameters); } } // namespace detail }}} // namespace boost::geometry::projections #endif // BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP