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