address.ipp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. #ifndef BOOST_ASIO_IP_IMPL_ADDRESS_IPP
  11. #define BOOST_ASIO_IP_IMPL_ADDRESS_IPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <boost/asio/detail/config.hpp>
  16. #include <typeinfo>
  17. #include <boost/asio/detail/throw_error.hpp>
  18. #include <boost/asio/detail/throw_exception.hpp>
  19. #include <boost/asio/error.hpp>
  20. #include <boost/asio/ip/address.hpp>
  21. #include <boost/asio/ip/bad_address_cast.hpp>
  22. #include <boost/system/system_error.hpp>
  23. #include <boost/asio/detail/push_options.hpp>
  24. namespace boost {
  25. namespace asio {
  26. namespace ip {
  27. address::address() BOOST_ASIO_NOEXCEPT
  28. : type_(ipv4),
  29. ipv4_address_(),
  30. ipv6_address_()
  31. {
  32. }
  33. address::address(
  34. const boost::asio::ip::address_v4& ipv4_address) BOOST_ASIO_NOEXCEPT
  35. : type_(ipv4),
  36. ipv4_address_(ipv4_address),
  37. ipv6_address_()
  38. {
  39. }
  40. address::address(
  41. const boost::asio::ip::address_v6& ipv6_address) BOOST_ASIO_NOEXCEPT
  42. : type_(ipv6),
  43. ipv4_address_(),
  44. ipv6_address_(ipv6_address)
  45. {
  46. }
  47. address::address(const address& other) BOOST_ASIO_NOEXCEPT
  48. : type_(other.type_),
  49. ipv4_address_(other.ipv4_address_),
  50. ipv6_address_(other.ipv6_address_)
  51. {
  52. }
  53. #if defined(BOOST_ASIO_HAS_MOVE)
  54. address::address(address&& other) BOOST_ASIO_NOEXCEPT
  55. : type_(other.type_),
  56. ipv4_address_(other.ipv4_address_),
  57. ipv6_address_(other.ipv6_address_)
  58. {
  59. }
  60. #endif // defined(BOOST_ASIO_HAS_MOVE)
  61. address& address::operator=(const address& other) BOOST_ASIO_NOEXCEPT
  62. {
  63. type_ = other.type_;
  64. ipv4_address_ = other.ipv4_address_;
  65. ipv6_address_ = other.ipv6_address_;
  66. return *this;
  67. }
  68. #if defined(BOOST_ASIO_HAS_MOVE)
  69. address& address::operator=(address&& other) BOOST_ASIO_NOEXCEPT
  70. {
  71. type_ = other.type_;
  72. ipv4_address_ = other.ipv4_address_;
  73. ipv6_address_ = other.ipv6_address_;
  74. return *this;
  75. }
  76. #endif // defined(BOOST_ASIO_HAS_MOVE)
  77. address& address::operator=(
  78. const boost::asio::ip::address_v4& ipv4_address) BOOST_ASIO_NOEXCEPT
  79. {
  80. type_ = ipv4;
  81. ipv4_address_ = ipv4_address;
  82. ipv6_address_ = boost::asio::ip::address_v6();
  83. return *this;
  84. }
  85. address& address::operator=(
  86. const boost::asio::ip::address_v6& ipv6_address) BOOST_ASIO_NOEXCEPT
  87. {
  88. type_ = ipv6;
  89. ipv4_address_ = boost::asio::ip::address_v4();
  90. ipv6_address_ = ipv6_address;
  91. return *this;
  92. }
  93. address make_address(const char* str)
  94. {
  95. boost::system::error_code ec;
  96. address addr = make_address(str, ec);
  97. boost::asio::detail::throw_error(ec);
  98. return addr;
  99. }
  100. address make_address(const char* str,
  101. boost::system::error_code& ec) BOOST_ASIO_NOEXCEPT
  102. {
  103. boost::asio::ip::address_v6 ipv6_address =
  104. boost::asio::ip::make_address_v6(str, ec);
  105. if (!ec)
  106. return address(ipv6_address);
  107. boost::asio::ip::address_v4 ipv4_address =
  108. boost::asio::ip::make_address_v4(str, ec);
  109. if (!ec)
  110. return address(ipv4_address);
  111. return address();
  112. }
  113. address make_address(const std::string& str)
  114. {
  115. return make_address(str.c_str());
  116. }
  117. address make_address(const std::string& str,
  118. boost::system::error_code& ec) BOOST_ASIO_NOEXCEPT
  119. {
  120. return make_address(str.c_str(), ec);
  121. }
  122. #if defined(BOOST_ASIO_HAS_STRING_VIEW)
  123. address make_address(string_view str)
  124. {
  125. return make_address(static_cast<std::string>(str));
  126. }
  127. address make_address(string_view str,
  128. boost::system::error_code& ec) BOOST_ASIO_NOEXCEPT
  129. {
  130. return make_address(static_cast<std::string>(str), ec);
  131. }
  132. #endif // defined(BOOST_ASIO_HAS_STRING_VIEW)
  133. boost::asio::ip::address_v4 address::to_v4() const
  134. {
  135. if (type_ != ipv4)
  136. {
  137. bad_address_cast ex;
  138. boost::asio::detail::throw_exception(ex);
  139. }
  140. return ipv4_address_;
  141. }
  142. boost::asio::ip::address_v6 address::to_v6() const
  143. {
  144. if (type_ != ipv6)
  145. {
  146. bad_address_cast ex;
  147. boost::asio::detail::throw_exception(ex);
  148. }
  149. return ipv6_address_;
  150. }
  151. std::string address::to_string() const
  152. {
  153. if (type_ == ipv6)
  154. return ipv6_address_.to_string();
  155. return ipv4_address_.to_string();
  156. }
  157. #if !defined(BOOST_ASIO_NO_DEPRECATED)
  158. std::string address::to_string(boost::system::error_code& ec) const
  159. {
  160. if (type_ == ipv6)
  161. return ipv6_address_.to_string(ec);
  162. return ipv4_address_.to_string(ec);
  163. }
  164. #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
  165. bool address::is_loopback() const BOOST_ASIO_NOEXCEPT
  166. {
  167. return (type_ == ipv4)
  168. ? ipv4_address_.is_loopback()
  169. : ipv6_address_.is_loopback();
  170. }
  171. bool address::is_unspecified() const BOOST_ASIO_NOEXCEPT
  172. {
  173. return (type_ == ipv4)
  174. ? ipv4_address_.is_unspecified()
  175. : ipv6_address_.is_unspecified();
  176. }
  177. bool address::is_multicast() const BOOST_ASIO_NOEXCEPT
  178. {
  179. return (type_ == ipv4)
  180. ? ipv4_address_.is_multicast()
  181. : ipv6_address_.is_multicast();
  182. }
  183. bool operator==(const address& a1, const address& a2) BOOST_ASIO_NOEXCEPT
  184. {
  185. if (a1.type_ != a2.type_)
  186. return false;
  187. if (a1.type_ == address::ipv6)
  188. return a1.ipv6_address_ == a2.ipv6_address_;
  189. return a1.ipv4_address_ == a2.ipv4_address_;
  190. }
  191. bool operator<(const address& a1, const address& a2) BOOST_ASIO_NOEXCEPT
  192. {
  193. if (a1.type_ < a2.type_)
  194. return true;
  195. if (a1.type_ > a2.type_)
  196. return false;
  197. if (a1.type_ == address::ipv6)
  198. return a1.ipv6_address_ < a2.ipv6_address_;
  199. return a1.ipv4_address_ < a2.ipv4_address_;
  200. }
  201. } // namespace ip
  202. } // namespace asio
  203. } // namespace boost
  204. #include <boost/asio/detail/pop_options.hpp>
  205. #endif // BOOST_ASIO_IP_IMPL_ADDRESS_IPP