Chris@16
|
1 //
|
Chris@16
|
2 // ip/impl/address.ipp
|
Chris@16
|
3 // ~~~~~~~~~~~~~~~~~~~
|
Chris@16
|
4 //
|
Chris@101
|
5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
Chris@16
|
6 //
|
Chris@16
|
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
9 //
|
Chris@16
|
10
|
Chris@16
|
11 #ifndef BOOST_ASIO_IP_IMPL_ADDRESS_IPP
|
Chris@16
|
12 #define BOOST_ASIO_IP_IMPL_ADDRESS_IPP
|
Chris@16
|
13
|
Chris@16
|
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
Chris@16
|
15 # pragma once
|
Chris@16
|
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/asio/detail/config.hpp>
|
Chris@16
|
19 #include <typeinfo>
|
Chris@16
|
20 #include <boost/asio/detail/throw_error.hpp>
|
Chris@16
|
21 #include <boost/asio/detail/throw_exception.hpp>
|
Chris@16
|
22 #include <boost/asio/error.hpp>
|
Chris@16
|
23 #include <boost/asio/ip/address.hpp>
|
Chris@16
|
24 #include <boost/system/system_error.hpp>
|
Chris@16
|
25
|
Chris@16
|
26 #include <boost/asio/detail/push_options.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 namespace boost {
|
Chris@16
|
29 namespace asio {
|
Chris@16
|
30 namespace ip {
|
Chris@16
|
31
|
Chris@16
|
32 address::address()
|
Chris@16
|
33 : type_(ipv4),
|
Chris@16
|
34 ipv4_address_(),
|
Chris@16
|
35 ipv6_address_()
|
Chris@16
|
36 {
|
Chris@16
|
37 }
|
Chris@16
|
38
|
Chris@16
|
39 address::address(const boost::asio::ip::address_v4& ipv4_address)
|
Chris@16
|
40 : type_(ipv4),
|
Chris@16
|
41 ipv4_address_(ipv4_address),
|
Chris@16
|
42 ipv6_address_()
|
Chris@16
|
43 {
|
Chris@16
|
44 }
|
Chris@16
|
45
|
Chris@16
|
46 address::address(const boost::asio::ip::address_v6& ipv6_address)
|
Chris@16
|
47 : type_(ipv6),
|
Chris@16
|
48 ipv4_address_(),
|
Chris@16
|
49 ipv6_address_(ipv6_address)
|
Chris@16
|
50 {
|
Chris@16
|
51 }
|
Chris@16
|
52
|
Chris@16
|
53 address::address(const address& other)
|
Chris@16
|
54 : type_(other.type_),
|
Chris@16
|
55 ipv4_address_(other.ipv4_address_),
|
Chris@16
|
56 ipv6_address_(other.ipv6_address_)
|
Chris@16
|
57 {
|
Chris@16
|
58 }
|
Chris@16
|
59
|
Chris@16
|
60 #if defined(BOOST_ASIO_HAS_MOVE)
|
Chris@16
|
61 address::address(address&& other)
|
Chris@16
|
62 : type_(other.type_),
|
Chris@16
|
63 ipv4_address_(other.ipv4_address_),
|
Chris@16
|
64 ipv6_address_(other.ipv6_address_)
|
Chris@16
|
65 {
|
Chris@16
|
66 }
|
Chris@16
|
67 #endif // defined(BOOST_ASIO_HAS_MOVE)
|
Chris@16
|
68
|
Chris@16
|
69 address& address::operator=(const address& other)
|
Chris@16
|
70 {
|
Chris@16
|
71 type_ = other.type_;
|
Chris@16
|
72 ipv4_address_ = other.ipv4_address_;
|
Chris@16
|
73 ipv6_address_ = other.ipv6_address_;
|
Chris@16
|
74 return *this;
|
Chris@16
|
75 }
|
Chris@16
|
76
|
Chris@16
|
77 #if defined(BOOST_ASIO_HAS_MOVE)
|
Chris@16
|
78 address& address::operator=(address&& other)
|
Chris@16
|
79 {
|
Chris@16
|
80 type_ = other.type_;
|
Chris@16
|
81 ipv4_address_ = other.ipv4_address_;
|
Chris@16
|
82 ipv6_address_ = other.ipv6_address_;
|
Chris@16
|
83 return *this;
|
Chris@16
|
84 }
|
Chris@16
|
85 #endif // defined(BOOST_ASIO_HAS_MOVE)
|
Chris@16
|
86
|
Chris@16
|
87 address& address::operator=(const boost::asio::ip::address_v4& ipv4_address)
|
Chris@16
|
88 {
|
Chris@16
|
89 type_ = ipv4;
|
Chris@16
|
90 ipv4_address_ = ipv4_address;
|
Chris@16
|
91 ipv6_address_ = boost::asio::ip::address_v6();
|
Chris@16
|
92 return *this;
|
Chris@16
|
93 }
|
Chris@16
|
94
|
Chris@16
|
95 address& address::operator=(const boost::asio::ip::address_v6& ipv6_address)
|
Chris@16
|
96 {
|
Chris@16
|
97 type_ = ipv6;
|
Chris@16
|
98 ipv4_address_ = boost::asio::ip::address_v4();
|
Chris@16
|
99 ipv6_address_ = ipv6_address;
|
Chris@16
|
100 return *this;
|
Chris@16
|
101 }
|
Chris@16
|
102
|
Chris@16
|
103 boost::asio::ip::address_v4 address::to_v4() const
|
Chris@16
|
104 {
|
Chris@16
|
105 if (type_ != ipv4)
|
Chris@16
|
106 {
|
Chris@16
|
107 std::bad_cast ex;
|
Chris@16
|
108 boost::asio::detail::throw_exception(ex);
|
Chris@16
|
109 }
|
Chris@16
|
110 return ipv4_address_;
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 boost::asio::ip::address_v6 address::to_v6() const
|
Chris@16
|
114 {
|
Chris@16
|
115 if (type_ != ipv6)
|
Chris@16
|
116 {
|
Chris@16
|
117 std::bad_cast ex;
|
Chris@16
|
118 boost::asio::detail::throw_exception(ex);
|
Chris@16
|
119 }
|
Chris@16
|
120 return ipv6_address_;
|
Chris@16
|
121 }
|
Chris@16
|
122
|
Chris@16
|
123 std::string address::to_string() const
|
Chris@16
|
124 {
|
Chris@16
|
125 if (type_ == ipv6)
|
Chris@16
|
126 return ipv6_address_.to_string();
|
Chris@16
|
127 return ipv4_address_.to_string();
|
Chris@16
|
128 }
|
Chris@16
|
129
|
Chris@16
|
130 std::string address::to_string(boost::system::error_code& ec) const
|
Chris@16
|
131 {
|
Chris@16
|
132 if (type_ == ipv6)
|
Chris@16
|
133 return ipv6_address_.to_string(ec);
|
Chris@16
|
134 return ipv4_address_.to_string(ec);
|
Chris@16
|
135 }
|
Chris@16
|
136
|
Chris@16
|
137 address address::from_string(const char* str)
|
Chris@16
|
138 {
|
Chris@16
|
139 boost::system::error_code ec;
|
Chris@16
|
140 address addr = from_string(str, ec);
|
Chris@16
|
141 boost::asio::detail::throw_error(ec);
|
Chris@16
|
142 return addr;
|
Chris@16
|
143 }
|
Chris@16
|
144
|
Chris@16
|
145 address address::from_string(const char* str, boost::system::error_code& ec)
|
Chris@16
|
146 {
|
Chris@16
|
147 boost::asio::ip::address_v6 ipv6_address =
|
Chris@16
|
148 boost::asio::ip::address_v6::from_string(str, ec);
|
Chris@16
|
149 if (!ec)
|
Chris@16
|
150 {
|
Chris@16
|
151 address tmp;
|
Chris@16
|
152 tmp.type_ = ipv6;
|
Chris@16
|
153 tmp.ipv6_address_ = ipv6_address;
|
Chris@16
|
154 return tmp;
|
Chris@16
|
155 }
|
Chris@16
|
156
|
Chris@16
|
157 boost::asio::ip::address_v4 ipv4_address =
|
Chris@16
|
158 boost::asio::ip::address_v4::from_string(str, ec);
|
Chris@16
|
159 if (!ec)
|
Chris@16
|
160 {
|
Chris@16
|
161 address tmp;
|
Chris@16
|
162 tmp.type_ = ipv4;
|
Chris@16
|
163 tmp.ipv4_address_ = ipv4_address;
|
Chris@16
|
164 return tmp;
|
Chris@16
|
165 }
|
Chris@16
|
166
|
Chris@16
|
167 return address();
|
Chris@16
|
168 }
|
Chris@16
|
169
|
Chris@16
|
170 address address::from_string(const std::string& str)
|
Chris@16
|
171 {
|
Chris@16
|
172 return from_string(str.c_str());
|
Chris@16
|
173 }
|
Chris@16
|
174
|
Chris@16
|
175 address address::from_string(const std::string& str,
|
Chris@16
|
176 boost::system::error_code& ec)
|
Chris@16
|
177 {
|
Chris@16
|
178 return from_string(str.c_str(), ec);
|
Chris@16
|
179 }
|
Chris@16
|
180
|
Chris@16
|
181 bool address::is_loopback() const
|
Chris@16
|
182 {
|
Chris@16
|
183 return (type_ == ipv4)
|
Chris@16
|
184 ? ipv4_address_.is_loopback()
|
Chris@16
|
185 : ipv6_address_.is_loopback();
|
Chris@16
|
186 }
|
Chris@16
|
187
|
Chris@16
|
188 bool address::is_unspecified() const
|
Chris@16
|
189 {
|
Chris@16
|
190 return (type_ == ipv4)
|
Chris@16
|
191 ? ipv4_address_.is_unspecified()
|
Chris@16
|
192 : ipv6_address_.is_unspecified();
|
Chris@16
|
193 }
|
Chris@16
|
194
|
Chris@16
|
195 bool address::is_multicast() const
|
Chris@16
|
196 {
|
Chris@16
|
197 return (type_ == ipv4)
|
Chris@16
|
198 ? ipv4_address_.is_multicast()
|
Chris@16
|
199 : ipv6_address_.is_multicast();
|
Chris@16
|
200 }
|
Chris@16
|
201
|
Chris@16
|
202 bool operator==(const address& a1, const address& a2)
|
Chris@16
|
203 {
|
Chris@16
|
204 if (a1.type_ != a2.type_)
|
Chris@16
|
205 return false;
|
Chris@16
|
206 if (a1.type_ == address::ipv6)
|
Chris@16
|
207 return a1.ipv6_address_ == a2.ipv6_address_;
|
Chris@16
|
208 return a1.ipv4_address_ == a2.ipv4_address_;
|
Chris@16
|
209 }
|
Chris@16
|
210
|
Chris@16
|
211 bool operator<(const address& a1, const address& a2)
|
Chris@16
|
212 {
|
Chris@16
|
213 if (a1.type_ < a2.type_)
|
Chris@16
|
214 return true;
|
Chris@16
|
215 if (a1.type_ > a2.type_)
|
Chris@16
|
216 return false;
|
Chris@16
|
217 if (a1.type_ == address::ipv6)
|
Chris@16
|
218 return a1.ipv6_address_ < a2.ipv6_address_;
|
Chris@16
|
219 return a1.ipv4_address_ < a2.ipv4_address_;
|
Chris@16
|
220 }
|
Chris@16
|
221
|
Chris@16
|
222 } // namespace ip
|
Chris@16
|
223 } // namespace asio
|
Chris@16
|
224 } // namespace boost
|
Chris@16
|
225
|
Chris@16
|
226 #include <boost/asio/detail/pop_options.hpp>
|
Chris@16
|
227
|
Chris@16
|
228 #endif // BOOST_ASIO_IP_IMPL_ADDRESS_IPP
|