1 // Boost.Geometry 2 3 // This file was modified by Oracle on 2018, 2019. 4 // Modifications copyright (c) 2018, 2019, Oracle and/or its affiliates. 5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle 6 7 // Use, modification and distribution is subject to the Boost Software License, 8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 11 #ifndef BOOST_GEOMETRY_SRS_PROJECTIONS_GRIDS_HPP 12 #define BOOST_GEOMETRY_SRS_PROJECTIONS_GRIDS_HPP 13 14 15 #include <boost/geometry/srs/projections/impl/pj_gridinfo.hpp> 16 17 #include <fstream> 18 19 20 namespace boost { namespace geometry 21 { 22 23 24 namespace projections { namespace detail 25 { 26 27 28 struct grids_tag {}; 29 struct shared_grids_tag {}; 30 31 32 }} // namespace projections::detail 33 34 namespace srs 35 { 36 37 class grids 38 { 39 public: size() const40 std::size_t size() const 41 { 42 return gridinfo.size(); 43 } 44 empty() const45 bool empty() const 46 { 47 return gridinfo.empty(); 48 } 49 50 typedef projections::detail::grids_tag tag; 51 52 projections::detail::pj_gridinfo gridinfo; 53 }; 54 55 struct ifstream_policy 56 { 57 typedef std::ifstream stream_type; 58 openboost::geometry::srs::ifstream_policy59 static inline void open(stream_type & is, std::string const& gridname) 60 { 61 is.open(gridname.c_str(), std::ios::binary); 62 } 63 }; 64 65 template 66 < 67 typename StreamPolicy = srs::ifstream_policy, 68 typename Grids = grids 69 > 70 struct grids_storage 71 { 72 typedef StreamPolicy stream_policy_type; 73 typedef Grids grids_type; 74 grids_storageboost::geometry::srs::grids_storage75 grids_storage() 76 {} 77 grids_storageboost::geometry::srs::grids_storage78 explicit grids_storage(stream_policy_type const& policy) 79 : stream_policy(policy) 80 {} 81 82 stream_policy_type stream_policy; 83 grids_type hgrids; 84 }; 85 86 87 template <typename GridsStorage = grids_storage<> > 88 class projection_grids 89 { 90 public: projection_grids(GridsStorage & storage)91 projection_grids(GridsStorage & storage) 92 : m_storage_ptr(boost::addressof(storage)) 93 {} 94 95 typedef GridsStorage grids_storage_type; 96 grids_storage() const97 GridsStorage & grids_storage() const 98 { 99 return *m_storage_ptr; 100 } 101 102 private: 103 GridsStorage * const m_storage_ptr; 104 105 public: 106 std::vector<std::size_t> hindexes; 107 }; 108 109 110 template <typename GridsStorage = grids_storage<> > 111 struct transformation_grids 112 { transformation_gridsboost::geometry::srs::transformation_grids113 explicit transformation_grids(GridsStorage & storage) 114 : src_grids(storage) 115 , dst_grids(storage) 116 {} 117 118 projection_grids<GridsStorage> src_grids; 119 projection_grids<GridsStorage> dst_grids; 120 }; 121 122 123 namespace detail 124 { 125 126 struct empty_grids_storage {}; 127 struct empty_projection_grids {}; 128 129 } // namespace detail 130 131 132 template <> 133 struct transformation_grids<detail::empty_grids_storage> 134 { 135 detail::empty_projection_grids src_grids; 136 detail::empty_projection_grids dst_grids; 137 }; 138 139 140 }}} // namespace boost::geometry::srs 141 142 143 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_GRIDS_HPP 144