1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands. 4 5 // This file was modified by Oracle on 2017, 2019. 6 // Modifications copyright (c) 2017, 2019, Oracle and/or its affiliates. 7 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle 8 9 // Use, modification and distribution is subject to the Boost Software License, 10 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 11 // http://www.boost.org/LICENSE_1_0.txt) 12 13 #ifndef BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 14 #define BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 15 16 #include <map> 17 #include <string> 18 19 #include <boost/shared_ptr.hpp> 20 21 #include <boost/geometry/srs/projections/dpar.hpp> 22 #include <boost/geometry/srs/projections/proj4.hpp> 23 #include <boost/geometry/srs/projections/impl/factory_entry.hpp> 24 #include <boost/geometry/srs/projections/proj/aea.hpp> 25 #include <boost/geometry/srs/projections/proj/aeqd.hpp> 26 #include <boost/geometry/srs/projections/proj/airy.hpp> 27 #include <boost/geometry/srs/projections/proj/aitoff.hpp> 28 #include <boost/geometry/srs/projections/proj/august.hpp> 29 #include <boost/geometry/srs/projections/proj/bacon.hpp> 30 #include <boost/geometry/srs/projections/proj/bipc.hpp> 31 #include <boost/geometry/srs/projections/proj/boggs.hpp> 32 #include <boost/geometry/srs/projections/proj/bonne.hpp> 33 #include <boost/geometry/srs/projections/proj/cass.hpp> 34 #include <boost/geometry/srs/projections/proj/cc.hpp> 35 #include <boost/geometry/srs/projections/proj/cea.hpp> 36 #include <boost/geometry/srs/projections/proj/chamb.hpp> 37 #include <boost/geometry/srs/projections/proj/collg.hpp> 38 #include <boost/geometry/srs/projections/proj/crast.hpp> 39 #include <boost/geometry/srs/projections/proj/denoy.hpp> 40 #include <boost/geometry/srs/projections/proj/eck1.hpp> 41 #include <boost/geometry/srs/projections/proj/eck2.hpp> 42 #include <boost/geometry/srs/projections/proj/eck3.hpp> 43 #include <boost/geometry/srs/projections/proj/eck4.hpp> 44 #include <boost/geometry/srs/projections/proj/eck5.hpp> 45 #include <boost/geometry/srs/projections/proj/eqc.hpp> 46 #include <boost/geometry/srs/projections/proj/eqdc.hpp> 47 #include <boost/geometry/srs/projections/proj/etmerc.hpp> 48 #include <boost/geometry/srs/projections/proj/fahey.hpp> 49 #include <boost/geometry/srs/projections/proj/fouc_s.hpp> 50 #include <boost/geometry/srs/projections/proj/gall.hpp> 51 #include <boost/geometry/srs/projections/proj/geocent.hpp> 52 #include <boost/geometry/srs/projections/proj/geos.hpp> 53 #include <boost/geometry/srs/projections/proj/gins8.hpp> 54 #include <boost/geometry/srs/projections/proj/gn_sinu.hpp> 55 #include <boost/geometry/srs/projections/proj/gnom.hpp> 56 #include <boost/geometry/srs/projections/proj/goode.hpp> 57 #include <boost/geometry/srs/projections/proj/gstmerc.hpp> 58 #include <boost/geometry/srs/projections/proj/hammer.hpp> 59 #include <boost/geometry/srs/projections/proj/hatano.hpp> 60 #include <boost/geometry/srs/projections/proj/healpix.hpp> 61 #include <boost/geometry/srs/projections/proj/krovak.hpp> 62 #include <boost/geometry/srs/projections/proj/igh.hpp> 63 #include <boost/geometry/srs/projections/proj/imw_p.hpp> 64 #include <boost/geometry/srs/projections/proj/isea.hpp> 65 #include <boost/geometry/srs/projections/proj/laea.hpp> 66 #include <boost/geometry/srs/projections/proj/labrd.hpp> 67 #include <boost/geometry/srs/projections/proj/lagrng.hpp> 68 #include <boost/geometry/srs/projections/proj/larr.hpp> 69 #include <boost/geometry/srs/projections/proj/lask.hpp> 70 #include <boost/geometry/srs/projections/proj/latlong.hpp> 71 #include <boost/geometry/srs/projections/proj/lcc.hpp> 72 #include <boost/geometry/srs/projections/proj/lcca.hpp> 73 #include <boost/geometry/srs/projections/proj/loxim.hpp> 74 #include <boost/geometry/srs/projections/proj/lsat.hpp> 75 #include <boost/geometry/srs/projections/proj/mbtfpp.hpp> 76 #include <boost/geometry/srs/projections/proj/mbtfpq.hpp> 77 #include <boost/geometry/srs/projections/proj/mbt_fps.hpp> 78 #include <boost/geometry/srs/projections/proj/merc.hpp> 79 #include <boost/geometry/srs/projections/proj/mill.hpp> 80 #include <boost/geometry/srs/projections/proj/mod_ster.hpp> 81 #include <boost/geometry/srs/projections/proj/moll.hpp> 82 #include <boost/geometry/srs/projections/proj/natearth.hpp> 83 #include <boost/geometry/srs/projections/proj/nell.hpp> 84 #include <boost/geometry/srs/projections/proj/nell_h.hpp> 85 #include <boost/geometry/srs/projections/proj/nocol.hpp> 86 #include <boost/geometry/srs/projections/proj/nsper.hpp> 87 #include <boost/geometry/srs/projections/proj/nzmg.hpp> 88 #include <boost/geometry/srs/projections/proj/ob_tran.hpp> 89 #include <boost/geometry/srs/projections/proj/ocea.hpp> 90 #include <boost/geometry/srs/projections/proj/oea.hpp> 91 #include <boost/geometry/srs/projections/proj/omerc.hpp> 92 #include <boost/geometry/srs/projections/proj/ortho.hpp> 93 #include <boost/geometry/srs/projections/proj/qsc.hpp> 94 #include <boost/geometry/srs/projections/proj/poly.hpp> 95 #include <boost/geometry/srs/projections/proj/putp2.hpp> 96 #include <boost/geometry/srs/projections/proj/putp3.hpp> 97 #include <boost/geometry/srs/projections/proj/putp4p.hpp> 98 #include <boost/geometry/srs/projections/proj/putp5.hpp> 99 #include <boost/geometry/srs/projections/proj/putp6.hpp> 100 #include <boost/geometry/srs/projections/proj/robin.hpp> 101 #include <boost/geometry/srs/projections/proj/rouss.hpp> 102 #include <boost/geometry/srs/projections/proj/rpoly.hpp> 103 #include <boost/geometry/srs/projections/proj/sconics.hpp> 104 #include <boost/geometry/srs/projections/proj/somerc.hpp> 105 #include <boost/geometry/srs/projections/proj/stere.hpp> 106 #include <boost/geometry/srs/projections/proj/sterea.hpp> 107 #include <boost/geometry/srs/projections/proj/sts.hpp> 108 #include <boost/geometry/srs/projections/proj/tcc.hpp> 109 #include <boost/geometry/srs/projections/proj/tcea.hpp> 110 #include <boost/geometry/srs/projections/proj/tmerc.hpp> 111 #include <boost/geometry/srs/projections/proj/tpeqd.hpp> 112 #include <boost/geometry/srs/projections/proj/urm5.hpp> 113 #include <boost/geometry/srs/projections/proj/urmfps.hpp> 114 #include <boost/geometry/srs/projections/proj/vandg.hpp> 115 #include <boost/geometry/srs/projections/proj/vandg2.hpp> 116 #include <boost/geometry/srs/projections/proj/vandg4.hpp> 117 #include <boost/geometry/srs/projections/proj/wag2.hpp> 118 #include <boost/geometry/srs/projections/proj/wag3.hpp> 119 #include <boost/geometry/srs/projections/proj/wag7.hpp> 120 #include <boost/geometry/srs/projections/proj/wink1.hpp> 121 #include <boost/geometry/srs/projections/proj/wink2.hpp> 122 123 namespace boost { namespace geometry { namespace projections 124 { 125 126 namespace detail 127 { 128 129 template <typename Params> 130 struct factory_key 131 { 132 BOOST_MPL_ASSERT_MSG((false), INVALID_PARAMETERS_TYPE, (Params)); 133 }; 134 135 template <> 136 struct factory_key<srs::detail::proj4_parameters> 137 { 138 typedef std::string type; 139 template <typename ProjParams> getboost::geometry::projections::detail::factory_key140 static type const& get(ProjParams const& par) 141 { 142 return par.id.name; 143 } getboost::geometry::projections::detail::factory_key144 static const char* get(const char* name, srs::dpar::value_proj id) 145 { 146 return name; 147 } 148 }; 149 150 template <typename T> 151 struct factory_key<srs::dpar::parameters<T> > 152 { 153 typedef srs::dpar::value_proj type; 154 template <typename ProjParams> getboost::geometry::projections::detail::factory_key155 static type const& get(ProjParams const& par) 156 { 157 return par.id.id; 158 } getboost::geometry::projections::detail::factory_key159 static srs::dpar::value_proj get(const char* name, srs::dpar::value_proj id) 160 { 161 return id; 162 } 163 }; 164 165 166 template <typename Params, typename CT, typename ProjParams> 167 class factory 168 { 169 private: 170 typedef detail::factory_entry 171 < 172 Params, 173 CT, 174 ProjParams 175 > entry_base; 176 177 typedef factory_key<Params> key; 178 typedef typename key::type key_type; 179 typedef boost::shared_ptr<entry_base> entry_ptr; 180 181 typedef std::map<key_type, entry_ptr> entries_map; 182 183 entries_map m_entries; 184 185 public: 186 factory()187 factory() 188 { 189 detail::aea_init(*this); 190 detail::aeqd_init(*this); 191 detail::airy_init(*this); 192 detail::aitoff_init(*this); 193 detail::august_init(*this); 194 detail::bacon_init(*this); 195 detail::bipc_init(*this); 196 detail::boggs_init(*this); 197 detail::bonne_init(*this); 198 detail::cass_init(*this); 199 detail::cc_init(*this); 200 detail::cea_init(*this); 201 detail::chamb_init(*this); 202 detail::collg_init(*this); 203 detail::crast_init(*this); 204 detail::denoy_init(*this); 205 detail::eck1_init(*this); 206 detail::eck2_init(*this); 207 detail::eck3_init(*this); 208 detail::eck4_init(*this); 209 detail::eck5_init(*this); 210 detail::eqc_init(*this); 211 detail::eqdc_init(*this); 212 detail::etmerc_init(*this); 213 detail::fahey_init(*this); 214 detail::fouc_s_init(*this); 215 detail::gall_init(*this); 216 detail::geocent_init(*this); 217 detail::geos_init(*this); 218 detail::gins8_init(*this); 219 detail::gn_sinu_init(*this); 220 detail::gnom_init(*this); 221 detail::goode_init(*this); 222 detail::gstmerc_init(*this); 223 detail::hammer_init(*this); 224 detail::hatano_init(*this); 225 detail::healpix_init(*this); 226 detail::krovak_init(*this); 227 detail::igh_init(*this); 228 detail::imw_p_init(*this); 229 detail::isea_init(*this); 230 detail::labrd_init(*this); 231 detail::laea_init(*this); 232 detail::lagrng_init(*this); 233 detail::larr_init(*this); 234 detail::lask_init(*this); 235 detail::latlong_init(*this); 236 detail::lcc_init(*this); 237 detail::lcca_init(*this); 238 detail::loxim_init(*this); 239 detail::lsat_init(*this); 240 detail::mbtfpp_init(*this); 241 detail::mbtfpq_init(*this); 242 detail::mbt_fps_init(*this); 243 detail::merc_init(*this); 244 detail::mill_init(*this); 245 detail::mod_ster_init(*this); 246 detail::moll_init(*this); 247 detail::natearth_init(*this); 248 detail::nell_init(*this); 249 detail::nell_h_init(*this); 250 detail::nocol_init(*this); 251 detail::nsper_init(*this); 252 detail::nzmg_init(*this); 253 detail::ob_tran_init(*this); 254 detail::ocea_init(*this); 255 detail::oea_init(*this); 256 detail::omerc_init(*this); 257 detail::ortho_init(*this); 258 detail::qsc_init(*this); 259 detail::poly_init(*this); 260 detail::putp2_init(*this); 261 detail::putp3_init(*this); 262 detail::putp4p_init(*this); 263 detail::putp5_init(*this); 264 detail::putp6_init(*this); 265 detail::robin_init(*this); 266 detail::rouss_init(*this); 267 detail::rpoly_init(*this); 268 detail::sconics_init(*this); 269 detail::somerc_init(*this); 270 detail::stere_init(*this); 271 detail::sterea_init(*this); 272 detail::sts_init(*this); 273 detail::tcc_init(*this); 274 detail::tcea_init(*this); 275 detail::tmerc_init(*this); 276 detail::tpeqd_init(*this); 277 detail::urm5_init(*this); 278 detail::urmfps_init(*this); 279 detail::vandg_init(*this); 280 detail::vandg2_init(*this); 281 detail::vandg4_init(*this); 282 detail::wag2_init(*this); 283 detail::wag3_init(*this); 284 detail::wag7_init(*this); 285 detail::wink1_init(*this); 286 detail::wink2_init(*this); 287 } 288 add_to_factory(const char * name,srs::dpar::value_proj id,entry_base * entry)289 void add_to_factory(const char* name, srs::dpar::value_proj id, entry_base* entry) 290 { 291 // The pointer has to be owned before std::map::operator[] in case it thrown an exception. 292 entry_ptr ptr(entry); 293 m_entries[key::get(name, id)] = ptr; 294 } 295 create_new(Params const & params,ProjParams const & proj_par) const296 detail::dynamic_wrapper_b<CT, ProjParams>* create_new(Params const& params, ProjParams const& proj_par) const 297 { 298 typedef typename entries_map::const_iterator const_iterator; 299 const_iterator it = m_entries.find(key::get(proj_par)); 300 if (it != m_entries.end()) 301 { 302 return it->second->create_new(params, proj_par); 303 } 304 305 return 0; 306 } 307 }; 308 309 template <typename T> 310 inline detail::dynamic_wrapper_b<T, projections::parameters<T> >* create_new(srs::detail::proj4_parameters const & params,projections::parameters<T> const & parameters)311 create_new(srs::detail::proj4_parameters const& params, 312 projections::parameters<T> const& parameters) 313 { 314 static factory<srs::detail::proj4_parameters, T, projections::parameters<T> > const fac; 315 return fac.create_new(params, parameters); 316 } 317 318 template <typename T> 319 inline detail::dynamic_wrapper_b<T, projections::parameters<T> >* create_new(srs::dpar::parameters<T> const & params,projections::parameters<T> const & parameters)320 create_new(srs::dpar::parameters<T> const& params, 321 projections::parameters<T> const& parameters) 322 { 323 static factory<srs::dpar::parameters<T>, T, projections::parameters<T> > const fac; 324 return fac.create_new(params, parameters); 325 } 326 327 328 } // namespace detail 329 330 }}} // namespace boost::geometry::projections 331 332 #endif // BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP 333