factory_entry.hpp 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Boost.Geometry (aka GGL, Generic Geometry Library)
  2. // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
  3. // This file was modified by Oracle on 2017, 2018, 2019.
  4. // Modifications copyright (c) 2017-2019, Oracle and/or its affiliates.
  5. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
  6. // Use, modification and distribution is subject to the Boost Software License,
  7. // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  8. // http://www.boost.org/LICENSE_1_0.txt)
  9. #ifndef BOOST_GEOMETRY_PROJECTIONS_IMPL_FACTORY_ENTRY_HPP
  10. #define BOOST_GEOMETRY_PROJECTIONS_IMPL_FACTORY_ENTRY_HPP
  11. #include <string>
  12. #include <boost/geometry/srs/projections/impl/base_dynamic.hpp>
  13. namespace boost { namespace geometry { namespace projections
  14. {
  15. namespace detail
  16. {
  17. // forward declaration needed by some projections
  18. template <typename Params, typename CT, typename Parameters>
  19. class factory;
  20. template <typename Params, typename CT, typename Parameters>
  21. struct factory_entry
  22. {
  23. virtual ~factory_entry() {}
  24. virtual dynamic_wrapper_b<CT, Parameters>* create_new(Params const& , Parameters const& ) const = 0;
  25. };
  26. // Macros for entries definition
  27. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_BEGIN(ENTRY) \
  28. template <typename Params, typename T, typename Parameters> \
  29. struct ENTRY : projections::detail::factory_entry<Params, T, Parameters> \
  30. { \
  31. projections::detail::dynamic_wrapper_b<T, Parameters>* create_new(Params const& params, \
  32. Parameters const& parameters) const
  33. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_END };
  34. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_F(ENTRY, PROJ) \
  35. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_BEGIN(ENTRY) \
  36. { \
  37. return new projections::detail::dynamic_wrapper_f<PROJ<T, Parameters>, T, Parameters>(params, parameters); \
  38. } \
  39. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_END
  40. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI(ENTRY, PROJ) \
  41. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_BEGIN(ENTRY) \
  42. { \
  43. return new projections::detail::dynamic_wrapper_fi<PROJ<T, Parameters>, T, Parameters>(params, parameters); \
  44. } \
  45. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_END
  46. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_FI2(ENTRY, PROJ_S, PROJ_E) \
  47. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_BEGIN(ENTRY) \
  48. { \
  49. if (parameters.es != 0.0) \
  50. return new projections::detail::dynamic_wrapper_fi<PROJ_E<T, Parameters>, T, Parameters>(params, parameters); \
  51. else \
  52. return new projections::detail::dynamic_wrapper_fi<PROJ_S<T, Parameters>, T, Parameters>(params, parameters); \
  53. } \
  54. BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_ENTRY_END
  55. // Macros for factory initialization
  56. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_BEGIN(FUN_NAME) \
  57. template <typename Params, typename T, typename Parameters> \
  58. inline void FUN_NAME(projections::detail::factory<Params, T, Parameters>& factory)
  59. #define BOOST_GEOMETRY_PROJECTIONS_DETAIL_FACTORY_INIT_ENTRY(PROJ_NAME, ENTRY) \
  60. factory.add_to_factory(#PROJ_NAME, \
  61. srs::dpar::proj_##PROJ_NAME, \
  62. new ENTRY<Params, T, Parameters>);
  63. } // namespace detail
  64. }}} // namespace boost::geometry::projections
  65. #endif // BOOST_GEOMETRY_PROJECTIONS_IMPL_FACTORY_ENTRY_HPP