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