]> git.proxmox.com Git - ceph.git/blame - 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
CommitLineData
11fdf7f2
TL
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands.
4
20effc67
TL
5// This file was modified by Oracle on 2017-2020.
6// Modifications copyright (c) 2017-2020, Oracle and/or its affiliates.
11fdf7f2
TL
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
20effc67
TL
21#include <boost/geometry/core/static_assert.hpp>
22
92f5a8d4
TL
23#include <boost/geometry/srs/projections/dpar.hpp>
24#include <boost/geometry/srs/projections/proj4.hpp>
11fdf7f2
TL
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
125namespace boost { namespace geometry { namespace projections
126{
127
128namespace detail
129{
130
92f5a8d4
TL
131template <typename Params>
132struct factory_key
11fdf7f2 133{
20effc67
TL
134 BOOST_GEOMETRY_STATIC_ASSERT_FALSE(
135 "Invalid parameters type.",
136 Params);
92f5a8d4
TL
137};
138
139template <>
140struct 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};
11fdf7f2 153
92f5a8d4
TL
154template <typename T>
155struct 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
170template <typename Params, typename CT, typename ProjParams>
171class factory
172{
173private:
174 typedef detail::factory_entry
11fdf7f2 175 <
92f5a8d4
TL
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;
11fdf7f2
TL
188
189public:
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
92f5a8d4 293 void add_to_factory(const char* name, srs::dpar::value_proj id, entry_base* entry)
11fdf7f2 294 {
92f5a8d4
TL
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;
11fdf7f2
TL
298 }
299
92f5a8d4 300 detail::dynamic_wrapper_b<CT, ProjParams>* create_new(Params const& params, ProjParams const& proj_par) const
11fdf7f2 301 {
92f5a8d4
TL
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())
11fdf7f2 305 {
92f5a8d4 306 return it->second->create_new(params, proj_par);
11fdf7f2
TL
307 }
308
309 return 0;
310 }
311};
312
92f5a8d4
TL
313template <typename T>
314inline 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
322template <typename T>
323inline detail::dynamic_wrapper_b<T, projections::parameters<T> >*
324 create_new(srs::dpar::parameters<T> const& params,
325 projections::parameters<T> const& parameters)
11fdf7f2 326{
92f5a8d4
TL
327 static factory<srs::dpar::parameters<T>, T, projections::parameters<T> > const fac;
328 return fac.create_new(params, parameters);
11fdf7f2
TL
329}
330
92f5a8d4 331
11fdf7f2
TL
332} // namespace detail
333
334}}} // namespace boost::geometry::projections
335
336#endif // BOOST_GEOMETRY_PROJECTIONS_FACTORY_HPP