address.ipp 4.9 KB

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