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