1 // Boost.Geometry (aka GGL, Generic Geometry Library)
2 // This file is manually converted from PROJ4
3 
4 // Copyright (c) 2008-2012 Barend Gehrels, Amsterdam, the Netherlands.
5 
6 // This file was modified by Oracle on 2017, 2018.
7 // Modifications copyright (c) 2017-2018, Oracle and/or its affiliates.
8 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
9 
10 // Use, modification and distribution is subject to the Boost Software License,
11 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
12 // http://www.boost.org/LICENSE_1_0.txt)
13 
14 // This file is converted from PROJ4, http://trac.osgeo.org/proj
15 // PROJ4 is originally written by Gerald Evenden (then of the USGS)
16 // PROJ4 is maintained by Frank Warmerdam
17 // PROJ4 is converted to Geometry Library by Barend Gehrels (Geodan, Amsterdam)
18 
19 // Original copyright notice:
20 
21 // Permission is hereby granted, free of charge, to any person obtaining a
22 // copy of this software and associated documentation files (the "Software"),
23 // to deal in the Software without restriction, including without limitation
24 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
25 // and/or sell copies of the Software, and to permit persons to whom the
26 // Software is furnished to do so, subject to the following conditions:
27 
28 // The above copyright notice and this permission notice shall be included
29 // in all copies or substantial portions of the Software.
30 
31 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
32 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
34 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
35 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
36 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
37 // DEALINGS IN THE SOFTWARE.
38 
39 #ifndef BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
40 #define BOOST_GEOMETRY_PROJECTIONS_PJ_PARAM_HPP
41 
42 
43 #include <string>
44 #include <vector>
45 
46 #include <boost/geometry/srs/projections/exception.hpp>
47 
48 #include <boost/geometry/srs/projections/impl/dms_parser.hpp>
49 #include <boost/geometry/srs/projections/impl/projects.hpp>
50 #include <boost/geometry/srs/projections/proj4.hpp>
51 #include <boost/geometry/srs/projections/dpar.hpp>
52 #include <boost/geometry/srs/projections/spar.hpp>
53 
54 #include <boost/mpl/assert.hpp>
55 #include <boost/type_traits/is_integral.hpp>
56 #include <boost/type_traits/is_same.hpp>
57 #include <iterator>
58 
59 
60 namespace boost { namespace geometry { namespace projections {
61 
62 
63 namespace detail {
64 
pj_param_pred(srs::detail::proj4_parameter const & p,std::string const & name)65 inline bool pj_param_pred(srs::detail::proj4_parameter const& p, std::string const& name)
66 {
67     return p.name == name;
68 }
69 
70 template <typename T, typename Id>
pj_param_pred(srs::dpar::parameter<T> const & p,Id const & id,typename boost::disable_if_c<boost::is_convertible<Id,std::string>::value>::type * =0)71 inline bool pj_param_pred(srs::dpar::parameter<T> const& p, Id const& id,
72                           typename boost::disable_if_c<boost::is_convertible<Id, std::string>::value>::type * = 0)
73 {
74     return p.is_id_equal(id);
75 }
76 
77 /* input exists */
78 template <typename Params, typename Name>
79 inline typename Params::const_iterator
pj_param_find(Params const & params,Name const & name)80     pj_param_find(Params const& params, Name const& name)
81 {
82     typedef typename Params::const_iterator iterator;
83     for (iterator it = params.begin(); it != params.end(); it++)
84     {
85         if (pj_param_pred(*it, name))
86         {
87             //it->used = true;
88             return it;
89         }
90         // TODO: needed for pipeline
91         /*else if (it->name == "step")
92         {
93             return pl.end();
94         }*/
95     }
96 
97     return params.end();
98 }
99 
100 /*
101 template
102 <
103     typename StaticParams,
104     typename IsParamPred,
105     int I = tuples_find_index_if<StaticParams, typename IsParamPred::pred>::value,
106     int N = boost::tuples::length<StaticParams>::value
107 >
108 struct pj_param_find_static
109 {
110     typedef boost::tuples::element<I, StaticParams> type;
111     typedef const type* result_type;
112     static result_type get(StaticParams const& params)
113     {
114         return boost::addressof(boost::get<I>(params));
115     }
116 };
117 
118 template <typename StaticParams, typename IsParamPred, int N>
119 struct pj_param_find_static<StaticParams, IsParamPred, N>
120 {
121     typedef void type;
122     typedef const type* result_type;
123     static result_type get(StaticParams const& ) { return NULL; }
124 };*/
125 
126 
127 /* input exists */
128 template <typename Params, typename Name>
pj_param_exists(Params const & params,Name const & name)129 inline bool pj_param_exists(Params const& params, Name const& name)
130 {
131     return pj_param_find(params, name) != params.end();
132 }
133 
134 template <typename Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const &)135 inline bool pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& )
136 {
137     return srs::spar::detail::tuples_is_found
138         <
139             typename srs::spar::detail::tuples_find_if
140                 <
141                     srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>,
142                     srs::spar::detail::is_param<Param>::template pred
143                 >::type
144         >::value;
145 }
146 
147 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const &)148 inline bool pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& )
149 {
150     return srs::spar::detail::tuples_is_found
151         <
152             typename srs::spar::detail::tuples_find_if
153                 <
154                     srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>,
155                     srs::spar::detail::is_param_t<Param>::template pred
156                 >::type
157         >::value;
158 }
159 
160 
161 template <typename T>
set_value(T & val,srs::detail::proj4_parameter const & p)162 inline void set_value(T & val, srs::detail::proj4_parameter const& p)
163 {
164     val = geometry::str_cast<T>(p.value);
165 }
166 
167 template <typename T, typename T2>
set_value(T & val,srs::dpar::parameter<T2> const & p)168 inline void set_value(T & val, srs::dpar::parameter<T2> const& p)
169 {
170     val = p.template get_value<T>();
171 }
172 
173 template <typename T>
set_value_r(T & val,srs::detail::proj4_parameter const & p)174 inline void set_value_r(T & val, srs::detail::proj4_parameter const& p)
175 {
176     val = dms_parser<T, true>::apply(p.value.c_str()).angle();
177 }
178 
179 template <typename T>
set_value_r(T & val,srs::dpar::parameter<T> const & p)180 inline void set_value_r(T & val, srs::dpar::parameter<T> const& p)
181 {
182     val = p.template get_value<T>() * math::d2r<T>();
183 }
184 
185 template <typename Name>
check_name(Name const &)186 inline void check_name(Name const&)
187 {
188     static const bool is_ok = boost::is_convertible<Name, std::string>::value
189                            || boost::is_same<Name, srs::dpar::name_i>::value
190                            || boost::is_same<Name, srs::dpar::name_f>::value
191                            || boost::is_same<Name, srs::dpar::name_r>::value;
192     BOOST_MPL_ASSERT_MSG((is_ok), INVALID_ARGUMENT, (Name));
193 }
194 
195 
196 /* integer input */
197 template <typename Params, typename Name>
_pj_param_i(Params const & params,Name const & name,int & par)198 inline bool _pj_param_i(Params const& params, Name const& name, int & par)
199 {
200     check_name(name);
201     typename Params::const_iterator it = pj_param_find(params, name);
202     if (it != params.end())
203     {
204         set_value(par, *it);
205         return true;
206     }
207     return false;
208 }
209 
210 /* floating point input */
211 template <typename T, typename Params, typename Name>
_pj_param_f(Params const & params,Name const & name,T & par)212 inline bool _pj_param_f(Params const& params, Name const& name, T & par)
213 {
214     check_name(name);
215     typename Params::const_iterator it = pj_param_find(params, name);
216     if (it != params.end())
217     {
218         set_value(par, *it);
219         return true;
220     }
221     return false;
222 }
223 
224 /* radians input */
225 template <typename T, typename Params, typename Name>
_pj_param_r(Params const & params,Name const & name,T & par)226 inline bool _pj_param_r(Params const& params, Name const& name, T & par)
227 {
228     check_name(name);
229     typename Params::const_iterator it = pj_param_find(params, name);
230     if (it != params.end())
231     {
232         set_value_r(par, *it);
233         return true;
234     }
235     return false;
236 }
237 
238 /* bool input */
_pj_get_param_b(srs::detail::proj4_parameters const & pl,std::string const & name)239 inline bool _pj_get_param_b(srs::detail::proj4_parameters const& pl, std::string const& name)
240 {
241     srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
242     if (it != pl.end())
243     {
244         switch (it->value[0])
245         {
246         case '\0': case 'T': case 't':
247             return true;
248         case 'F': case 'f':
249             return false;
250         default:
251             BOOST_THROW_EXCEPTION( projection_exception(error_invalid_boolean_param) );
252             return false;
253         }
254     }
255     return false;
256 }
257 
258 template <typename T>
_pj_get_param_b(srs::dpar::parameters<T> const & pl,srs::dpar::name_be const & name)259 inline bool _pj_get_param_b(srs::dpar::parameters<T> const& pl, srs::dpar::name_be const& name)
260 {
261     bool result = false;
262     typename srs::dpar::parameters<T>::const_iterator it = pj_param_find(pl, name);
263     if (it != pl.end())
264         set_value(result, *it);
265     return result;
266 }
267 
268 /* string input */
pj_param_s(srs::detail::proj4_parameters const & pl,std::string const & name,std::string & par)269 inline bool pj_param_s(srs::detail::proj4_parameters const& pl, std::string const& name, std::string & par)
270 {
271     srs::detail::proj4_parameters::const_iterator it = pj_param_find(pl, name);
272     if (it != pl.end())
273     {
274         par = it->value;
275         return true;
276     }
277     return false;
278 }
279 
280 template
281 <
282     typename Params,
283     template <typename> class IsSamePred,
284     int I = srs::spar::detail::tuples_find_index_if<Params, IsSamePred>::value,
285     int N = boost::tuples::length<Params>::value
286 >
287 struct _pj_param_x_static
288 {
289     static const bool result = true;
290     template <typename T>
applyboost::geometry::projections::detail::_pj_param_x_static291     static void apply(Params const& params, T & out)
292     {
293         // TODO: int values could be extracted directly from the type
294         out = boost::tuples::get<I>(params).value;
295     }
296 };
297 
298 template
299 <
300     typename Params,
301     template <typename> class IsSamePred,
302     int N
303 >
304 struct _pj_param_x_static<Params, IsSamePred, N, N>
305 {
306     static const bool result = false;
307     template <typename T>
applyboost::geometry::projections::detail::_pj_param_x_static308     static void apply(Params const& , T & )
309     {}
310 };
311 
312 template <template <int> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
_pj_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & params,int & par)313 inline bool _pj_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& params, int & par)
314 {
315     typedef _pj_param_x_static
316         <
317             srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>,
318             srs::spar::detail::is_param_i<Param>::template pred
319         > impl;
320     impl::apply(params, par);
321     return impl::result;
322 }
323 
324 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename T>
_pj_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & params,T & par)325 inline bool _pj_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& params, T & par)
326 {
327     typedef _pj_param_x_static
328         <
329             srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>,
330             srs::spar::detail::is_param_t<Param>::template pred
331         > impl;
332     impl::apply(params, par);
333     return impl::result;
334 }
335 
336 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename T>
_pj_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & params,T & par)337 inline bool _pj_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& params, T & par)
338 {
339     typedef _pj_param_x_static
340         <
341             srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX>,
342             srs::spar::detail::is_param_t<Param>::template pred
343         > impl;
344     impl::apply(params, par);
345     if (impl::result)
346         par *= math::d2r<T>();
347     return impl::result;
348 }
349 
350 template <typename Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
_pj_get_param_b(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & params)351 inline bool _pj_get_param_b(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& params)
352 {
353     return pj_param_exists<Param>(params);
354 }
355 
356 //template <typename T, typename Name, typename Value>
357 //inline bool pj_param_id(srs::dpar::parameters<T> const& pl, Name const& name, Value & par)
358 //{
359 //    typename srs::dpar::parameters<T>::const_iterator it = pj_param_find(pl, name);
360 //    if (it != pl.end())
361 //    {
362 //        par = static_cast<Value>(it->template get_value<int>());
363 //        return true;
364 //    }
365 //    return false;
366 //}
367 
368 // NOTE: In the original code, in pl_ell_set.c there is a function pj_get_param
369 // which behavior is similar to pj_param but it doesn't set `user` member to TRUE
370 // while pj_param does in the original code. In Boost.Geometry this member is not used.
371 template <typename Params, typename Name>
_pj_get_param_i(Params const & pl,Name const & name)372 inline int _pj_get_param_i(Params const& pl, Name const& name)
373 {
374     int res = 0;
375     _pj_param_i(pl, name, res);
376     return res;
377 }
378 
379 template <template <int> class Param, typename Params>
_pj_get_param_i(Params const & pl)380 inline int _pj_get_param_i(Params const& pl)
381 {
382     int res = 0;
383     _pj_param_i<Param>(pl, res);
384     return res;
385 }
386 
387 template <typename T, typename Params, typename Name>
_pj_get_param_f(Params const & pl,Name const & name)388 inline T _pj_get_param_f(Params const& pl, Name const& name)
389 {
390     T res = 0;
391     _pj_param_f(pl, name, res);
392     return res;
393 }
394 
395 template <typename T, template <typename> class Param, typename Params>
_pj_get_param_f(Params const & pl)396 inline T _pj_get_param_f(Params const& pl)
397 {
398     T res = 0;
399     _pj_param_f<Param>(pl, res);
400     return res;
401 }
402 
403 template <typename T, typename Params, typename Name>
_pj_get_param_r(Params const & pl,Name const & name)404 inline T _pj_get_param_r(Params const& pl, Name const& name)
405 {
406     T res = 0;
407     _pj_param_r(pl, name, res);
408     return res;
409 }
410 
411 template <typename T, template <typename> class Param, typename Params>
_pj_get_param_r(Params const & pl)412 inline T _pj_get_param_r(Params const& pl)
413 {
414     T res = 0;
415     _pj_param_r<Param>(pl, res);
416     return res;
417 }
418 
pj_get_param_s(srs::detail::proj4_parameters const & pl,std::string const & name)419 inline std::string pj_get_param_s(srs::detail::proj4_parameters const& pl, std::string const& name)
420 {
421     std::string res;
422     pj_param_s(pl, name, res);
423     return res;
424 }
425 
426 
427 // ------------------------------------------------------------------------- //
428 
429 template <typename Param, typename Name>
pj_param_exists(srs::detail::proj4_parameters const & pl,std::string const & sn,Name const &)430 inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
431                             std::string const& sn,
432                             Name const& )
433 {
434     return pj_param_exists(pl, sn);
435 }
436 template <template <typename> class Param, typename Name>
pj_param_exists(srs::detail::proj4_parameters const & pl,std::string const & sn,Name const &)437 inline bool pj_param_exists(srs::detail::proj4_parameters const& pl,
438                             std::string const& sn,
439                             Name const& )
440 {
441     return pj_param_exists(pl, sn);
442 }
443 template <typename Param, typename T, typename Name>
pj_param_exists(srs::dpar::parameters<T> const & pl,std::string const &,Name const & n)444 inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
445                             std::string const& ,
446                             Name const& n)
447 {
448     return pj_param_exists(pl, n);
449 }
450 template <template <typename> class Param, typename T, typename Name>
pj_param_exists(srs::dpar::parameters<T> const & pl,std::string const &,Name const & n)451 inline bool pj_param_exists(srs::dpar::parameters<T> const& pl,
452                             std::string const& ,
453                             Name const& n)
454 {
455     return pj_param_exists(pl, n);
456 }
457 template <typename Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename Name>
pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,Name const &)458 inline bool pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
459                             std::string const& ,
460                             Name const& )
461 {
462     return pj_param_exists<Param>(pl);
463 }
464 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename Name>
pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,Name const &)465 inline bool pj_param_exists(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
466                             std::string const& ,
467                             Name const& )
468 {
469     return pj_param_exists<Param>(pl);
470 }
471 
472 template <typename Param>
pj_get_param_b(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_be const &)473 inline bool pj_get_param_b(srs::detail::proj4_parameters const& pl,
474                            std::string const& sn,
475                            srs::dpar::name_be const& )
476 {
477     return _pj_get_param_b(pl, sn);
478 }
479 template <typename Param, typename T>
pj_get_param_b(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_be const & n)480 inline bool pj_get_param_b(srs::dpar::parameters<T> const& pl,
481                            std::string const& ,
482                            srs::dpar::name_be const& n)
483 {
484     return _pj_get_param_b(pl, n);
485 }
486 template <typename Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_get_param_b(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_be const &)487 inline bool pj_get_param_b(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
488                            std::string const& ,
489                            srs::dpar::name_be const& )
490 {
491     return _pj_get_param_b<Param>(pl);
492 }
493 
494 //#define BOOST_GEOMETRY_GET_PARAM_B(PARAMS, NAME) pj_get_param_b(PARAMS, #NAME, srs::dpar::NAME)
495 
496 template <template <int> class Param>
pj_param_i(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_i const &,int & par)497 inline bool pj_param_i(srs::detail::proj4_parameters const& pl,
498                        std::string const& sn,
499                        srs::dpar::name_i const& ,
500                        int & par)
501 {
502     return _pj_param_i(pl, sn, par);
503 }
504 template <template <int> class Param, typename T>
pj_param_i(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_i const & n,int & par)505 inline bool pj_param_i(srs::dpar::parameters<T> const& pl,
506                        std::string const& ,
507                        srs::dpar::name_i const& n,
508                        int & par)
509 {
510     return _pj_param_i(pl, n, par);
511 }
512 template <template <int> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_i const &,int & par)513 inline bool pj_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
514                        std::string const& ,
515                        srs::dpar::name_i const& ,
516                        int & par)
517 {
518     return _pj_param_i<Param>(pl, par);
519 }
520 
521 //#define BOOST_GEOMETRY_PARAM_I(PARAMS, NAME, PAR) pj_param_i(PARAMS, #NAME, srs::dpar::NAME, PAR)
522 
523 template <template <int> class Param>
pj_get_param_i(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_i const &)524 inline int pj_get_param_i(srs::detail::proj4_parameters const& pl,
525                           std::string const& sn,
526                           srs::dpar::name_i const& )
527 {
528     return _pj_get_param_i(pl, sn);
529 }
530 template <template <int> class Param, typename T>
pj_get_param_i(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_i const & n)531 inline int pj_get_param_i(srs::dpar::parameters<T> const& pl,
532                           std::string const& ,
533                           srs::dpar::name_i const& n)
534 {
535     return _pj_get_param_i(pl, n);
536 }
537 template <template <int> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_get_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_i const &)538 inline bool pj_get_param_i(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
539                            std::string const& ,
540                            srs::dpar::name_i const& )
541 {
542     return _pj_get_param_i<Param>(pl);
543 }
544 
545 //#define BOOST_GEOMETRY_GET_PARAM_I(PARAMS, NAME) pj_get_param_i(PARAMS, #NAME, srs::dpar::NAME)
546 
547 template <template <typename> class Param, typename T>
pj_param_f(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_f const &,T & par)548 inline bool pj_param_f(srs::detail::proj4_parameters const& pl,
549                        std::string const& sn,
550                        srs::dpar::name_f const& ,
551                        T & par)
552 {
553     return _pj_param_f(pl, sn, par);
554 }
555 template <template <typename> class Param, typename T>
pj_param_f(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_f const & n,T & par)556 inline bool pj_param_f(srs::dpar::parameters<T> const& pl,
557                        std::string const& ,
558                        srs::dpar::name_f const& n,
559                        T & par)
560 {
561     return _pj_param_f(pl, n, par);
562 }
563 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename T>
pj_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_f const &,T & par)564 inline bool pj_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
565                        std::string const& ,
566                        srs::dpar::name_f const& ,
567                        T & par)
568 {
569     return _pj_param_f<Param>(pl, par);
570 }
571 
572 //#define BOOST_GEOMETRY_PARAM_F(PARAMS, NAME, PAR) pj_param_f(PARAMS, #NAME, srs::dpar::NAME, PAR)
573 
574 template <typename T, template <typename> class Param>
pj_get_param_f(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_f const &)575 inline T pj_get_param_f(srs::detail::proj4_parameters const& pl,
576                         std::string const& sn,
577                         srs::dpar::name_f const& )
578 {
579     return _pj_get_param_f<T>(pl, sn);
580 }
581 template <typename T, template <typename> class Param>
pj_get_param_f(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_f const & n)582 inline T pj_get_param_f(srs::dpar::parameters<T> const& pl,
583                         std::string const& ,
584                         srs::dpar::name_f const& n)
585 {
586     return _pj_get_param_f<T>(pl, n);
587 }
588 template <typename T, template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_get_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_f const &)589 inline T pj_get_param_f(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
590                         std::string const& ,
591                         srs::dpar::name_f const& )
592 {
593     return _pj_get_param_f<T, Param>(pl);
594 }
595 
596 
597 //#define BOOST_GEOMETRY_GET_PARAM_F(PARAMS, NAME) pj_get_param_f<T>(PARAMS, #NAME, srs::dpar::NAME)
598 
599 template <template <typename> class Param, typename T>
pj_param_r(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_r const &,T & par)600 inline bool pj_param_r(srs::detail::proj4_parameters const& pl,
601                        std::string const& sn,
602                        srs::dpar::name_r const& ,
603                        T & par)
604 {
605     return _pj_param_r(pl, sn, par);
606 }
607 template <template <typename> class Param, typename T>
pj_param_r(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_r const & n,T & par)608 inline bool pj_param_r(srs::dpar::parameters<T> const& pl,
609                        std::string const& ,
610                        srs::dpar::name_r const& n,
611                        T & par)
612 {
613     return _pj_param_r(pl, n, par);
614 }
615 template <template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX, typename T>
pj_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_r const &,T & par)616 inline bool pj_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
617                        std::string const& ,
618                        srs::dpar::name_r const& ,
619                        T & par)
620 {
621     return _pj_param_r<Param>(pl, par);
622 }
623 
624 //#define BOOST_GEOMETRY_PARAM_R(PARAMS, NAME, PAR) pj_param_r(PARAMS, #NAME, srs::dpar::NAME, PAR)
625 
626 template <typename T, template <typename> class Param>
pj_get_param_r(srs::detail::proj4_parameters const & pl,std::string const & sn,srs::dpar::name_r const &)627 inline T pj_get_param_r(srs::detail::proj4_parameters const& pl,
628                         std::string const& sn,
629                         srs::dpar::name_r const& )
630 {
631     return _pj_get_param_r<T>(pl, sn);
632 }
633 template <typename T, template <typename> class Param>
pj_get_param_r(srs::dpar::parameters<T> const & pl,std::string const &,srs::dpar::name_r const & n)634 inline T pj_get_param_r(srs::dpar::parameters<T> const& pl,
635                         std::string const& ,
636                         srs::dpar::name_r const& n)
637 {
638     return _pj_get_param_r<T>(pl, n);
639 }
640 template <typename T, template <typename> class Param, BOOST_GEOMETRY_PROJECTIONS_DETAIL_TYPENAME_PX>
pj_get_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const & pl,std::string const &,srs::dpar::name_r const &)641 inline T pj_get_param_r(srs::spar::parameters<BOOST_GEOMETRY_PROJECTIONS_DETAIL_PX> const& pl,
642                         std::string const& ,
643                         srs::dpar::name_r const& )
644 {
645     return _pj_get_param_r<T, Param>(pl);
646 }
647 
648 //#define BOOST_GEOMETRY_GET_PARAM_R(PARAMS, NAME) pj_get_param_r<T>(PARAMS, #NAME, srs::dpar::NAME)
649 
650 } // namespace detail
651 }}} // namespace boost::geometry::projections
652 
653 #endif
654