5 // Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com)
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
11 #ifndef BOOST_ASIO_IP_IMPL_ADDRESS_IPP
12 #define BOOST_ASIO_IP_IMPL_ADDRESS_IPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
20 #include <boost/asio/detail/throw_error.hpp>
21 #include <boost/asio/detail/throw_exception.hpp>
22 #include <boost/asio/error.hpp>
23 #include <boost/asio/ip/address.hpp>
24 #include <boost/asio/ip/bad_address_cast.hpp>
25 #include <boost/system/system_error.hpp>
27 #include <boost/asio/detail/push_options.hpp>
40 address::address(const boost::asio::ip::address_v4& ipv4_address)
42 ipv4_address_(ipv4_address),
47 address::address(const boost::asio::ip::address_v6& ipv6_address)
50 ipv6_address_(ipv6_address)
54 address::address(const address& other)
56 ipv4_address_(other.ipv4_address_),
57 ipv6_address_(other.ipv6_address_)
61 #if defined(BOOST_ASIO_HAS_MOVE)
62 address::address(address&& other)
64 ipv4_address_(other.ipv4_address_),
65 ipv6_address_(other.ipv6_address_)
68 #endif // defined(BOOST_ASIO_HAS_MOVE)
70 address& address::operator=(const address& other)
73 ipv4_address_ = other.ipv4_address_;
74 ipv6_address_ = other.ipv6_address_;
78 #if defined(BOOST_ASIO_HAS_MOVE)
79 address& address::operator=(address&& other)
82 ipv4_address_ = other.ipv4_address_;
83 ipv6_address_ = other.ipv6_address_;
86 #endif // defined(BOOST_ASIO_HAS_MOVE)
88 address& address::operator=(const boost::asio::ip::address_v4& ipv4_address)
91 ipv4_address_ = ipv4_address;
92 ipv6_address_ = boost::asio::ip::address_v6();
96 address& address::operator=(const boost::asio::ip::address_v6& ipv6_address)
99 ipv4_address_ = boost::asio::ip::address_v4();
100 ipv6_address_ = ipv6_address;
104 address make_address(const char* str)
106 boost::system::error_code ec;
107 address addr = make_address(str, ec);
108 boost::asio::detail::throw_error(ec);
112 address make_address(const char* str, boost::system::error_code& ec)
114 boost::asio::ip::address_v6 ipv6_address =
115 boost::asio::ip::make_address_v6(str, ec);
117 return address(ipv6_address);
119 boost::asio::ip::address_v4 ipv4_address =
120 boost::asio::ip::make_address_v4(str, ec);
122 return address(ipv4_address);
127 address make_address(const std::string& str)
129 return make_address(str.c_str());
132 address make_address(const std::string& str,
133 boost::system::error_code& ec)
135 return make_address(str.c_str(), ec);
138 #if defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
140 address make_address(string_view str)
142 return make_address(static_cast<std::string>(str));
145 address make_address(string_view str,
146 boost::system::error_code& ec)
148 return make_address(static_cast<std::string>(str), ec);
151 #endif // defined(BOOST_ASIO_HAS_STD_STRING_VIEW)
153 boost::asio::ip::address_v4 address::to_v4() const
158 boost::asio::detail::throw_exception(ex);
160 return ipv4_address_;
163 boost::asio::ip::address_v6 address::to_v6() const
168 boost::asio::detail::throw_exception(ex);
170 return ipv6_address_;
173 std::string address::to_string() const
176 return ipv6_address_.to_string();
177 return ipv4_address_.to_string();
180 #if !defined(BOOST_ASIO_NO_DEPRECATED)
181 std::string address::to_string(boost::system::error_code& ec) const
184 return ipv6_address_.to_string(ec);
185 return ipv4_address_.to_string(ec);
187 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
189 bool address::is_loopback() const
191 return (type_ == ipv4)
192 ? ipv4_address_.is_loopback()
193 : ipv6_address_.is_loopback();
196 bool address::is_unspecified() const
198 return (type_ == ipv4)
199 ? ipv4_address_.is_unspecified()
200 : ipv6_address_.is_unspecified();
203 bool address::is_multicast() const
205 return (type_ == ipv4)
206 ? ipv4_address_.is_multicast()
207 : ipv6_address_.is_multicast();
210 bool operator==(const address& a1, const address& a2)
212 if (a1.type_ != a2.type_)
214 if (a1.type_ == address::ipv6)
215 return a1.ipv6_address_ == a2.ipv6_address_;
216 return a1.ipv4_address_ == a2.ipv4_address_;
219 bool operator<(const address& a1, const address& a2)
221 if (a1.type_ < a2.type_)
223 if (a1.type_ > a2.type_)
225 if (a1.type_ == address::ipv6)
226 return a1.ipv6_address_ < a2.ipv6_address_;
227 return a1.ipv4_address_ < a2.ipv4_address_;
234 #include <boost/asio/detail/pop_options.hpp>
236 #endif // BOOST_ASIO_IP_IMPL_ADDRESS_IPP