1 // Boost.Geometry 2 3 // Copyright (c) 2018, Oracle and/or its affiliates. 4 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle 5 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 10 #ifndef BOOST_GEOMETRY_SRS_PROJECTIONS_PAR_DATA_HPP 11 #define BOOST_GEOMETRY_SRS_PROJECTIONS_PAR_DATA_HPP 12 13 #include <string> 14 #include <vector> 15 16 #include <boost/geometry/core/assert.hpp> 17 #include <boost/geometry/core/config.hpp> 18 19 namespace boost { namespace geometry { namespace srs 20 { 21 22 #ifndef DOXYGEN_NO_DETAIL 23 namespace detail 24 { 25 26 struct nadgrids 27 : std::vector<std::string> 28 { 29 typedef std::vector<std::string> base_t; 30 nadgridsboost::geometry::srs::detail::nadgrids31 nadgrids() 32 {} 33 34 template <typename It> nadgridsboost::geometry::srs::detail::nadgrids35 nadgrids(It first, It last) 36 : base_t(first, last) 37 {} 38 39 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST nadgridsboost::geometry::srs::detail::nadgrids40 nadgrids(std::initializer_list<std::string> l) 41 : base_t(l) 42 {} 43 #endif 44 nadgridsboost::geometry::srs::detail::nadgrids45 nadgrids(std::string const& g0) 46 : base_t(1) 47 { 48 base_t& d = *this; 49 d[0] = g0; 50 } nadgridsboost::geometry::srs::detail::nadgrids51 nadgrids(std::string const& g0, std::string const& g1) 52 : base_t(2) 53 { 54 base_t& d = *this; 55 d[0] = g0; d[1] = g1; 56 } nadgridsboost::geometry::srs::detail::nadgrids57 nadgrids(std::string const& g0, std::string const& g1, std::string const& g2) 58 : base_t(3) 59 { 60 base_t& d = *this; 61 d[0] = g0; d[1] = g1; d[2] = g2; 62 } nadgridsboost::geometry::srs::detail::nadgrids63 nadgrids(std::string const& g0, std::string const& g1, std::string const& g2, std::string const& g3) 64 : base_t(4) 65 { 66 base_t& d = *this; 67 d[0] = g0; d[1] = g1; d[2] = g2; d[3] = g3; 68 } nadgridsboost::geometry::srs::detail::nadgrids69 nadgrids(std::string const& g0, std::string const& g1, std::string const& g2, std::string const& g3, std::string const& g4) 70 : base_t(5) 71 { 72 base_t& d = *this; 73 d[0] = g0; d[1] = g1; d[2] = g2; d[3] = g3; d[4] = g4; 74 } 75 }; 76 77 template <typename T = double> 78 struct towgs84 79 { 80 static const std::size_t static_capacity = 7; 81 82 typedef std::size_t size_type; 83 typedef T value_type; 84 typedef T* iterator; 85 typedef const T* const_iterator; 86 typedef T& reference; 87 typedef const T& const_reference; 88 towgs84boost::geometry::srs::detail::towgs8489 towgs84() 90 : m_size(0) 91 #ifdef BOOST_GEOMETRY_CXX11_ARRAY_UNIFIED_INITIALIZATION 92 , m_data{0, 0, 0, 0, 0, 0, 0} 93 {} 94 #else 95 { 96 std::fill(m_data, m_data + 7, T(0)); 97 } 98 #endif 99 100 template <typename It> towgs84boost::geometry::srs::detail::towgs84101 towgs84(It first, It last) 102 { 103 assign(first, last); 104 } 105 106 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST towgs84boost::geometry::srs::detail::towgs84107 towgs84(std::initializer_list<T> l) 108 { 109 assign(l.begin(), l.end()); 110 } 111 #endif 112 towgs84boost::geometry::srs::detail::towgs84113 towgs84(T const& v0, T const& v1, T const& v2) 114 : m_size(3) 115 { 116 m_data[0] = v0; 117 m_data[1] = v1; 118 m_data[2] = v2; 119 } 120 towgs84boost::geometry::srs::detail::towgs84121 towgs84(T const& v0, T const& v1, T const& v2, T const& v3, T const& v4, T const& v5, T const& v6) 122 : m_size(7) 123 { 124 m_data[0] = v0; 125 m_data[1] = v1; 126 m_data[2] = v2; 127 m_data[3] = v3; 128 m_data[4] = v4; 129 m_data[5] = v5; 130 m_data[6] = v6; 131 } 132 push_backboost::geometry::srs::detail::towgs84133 void push_back(T const& v) 134 { 135 BOOST_GEOMETRY_ASSERT(m_size < static_capacity); 136 m_data[m_size] = v; 137 ++m_size; 138 } 139 140 template <typename It> assignboost::geometry::srs::detail::towgs84141 void assign(It first, It last) 142 { 143 for (m_size = 0 ; first != last && m_size < 7 ; ++first, ++m_size) 144 m_data[m_size] = *first; 145 } 146 147 #ifndef BOOST_NO_CXX11_HDR_INITIALIZER_LIST assignboost::geometry::srs::detail::towgs84148 void assign(std::initializer_list<T> l) 149 { 150 assign(l.begin(), l.end()); 151 } 152 #endif 153 operator []boost::geometry::srs::detail::towgs84154 const_reference operator[](size_type i) const 155 { 156 BOOST_GEOMETRY_ASSERT(i < m_size); 157 return m_data[i]; 158 } 159 operator []boost::geometry::srs::detail::towgs84160 reference operator[](size_type i) 161 { 162 BOOST_GEOMETRY_ASSERT(i < m_size); 163 return m_data[i]; 164 } 165 sizeboost::geometry::srs::detail::towgs84166 size_type size() const 167 { 168 return m_size; 169 } 170 emptyboost::geometry::srs::detail::towgs84171 bool empty() const 172 { 173 return m_size == 0; 174 } 175 clearboost::geometry::srs::detail::towgs84176 void clear() 177 { 178 m_size = 0; 179 } 180 beginboost::geometry::srs::detail::towgs84181 iterator begin() { return m_data; } endboost::geometry::srs::detail::towgs84182 iterator end() { return m_data + m_size; } beginboost::geometry::srs::detail::towgs84183 const_iterator begin() const { return m_data; } endboost::geometry::srs::detail::towgs84184 const_iterator end() const { return m_data + m_size; } 185 186 private: 187 size_type m_size; 188 T m_data[7]; 189 }; 190 191 } // namespace detail 192 #endif // DOXYGEN_NO_DETAIL 193 194 }}} // namespace boost::geometry::srs 195 196 197 #endif // BOOST_GEOMETRY_SRS_PROJECTIONS_SPAR_HPP 198