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