10ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie//
20ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// ip/address.hpp
30ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// ~~~~~~~~~~~~~~
40ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie//
50ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
60ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie//
70ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// Distributed under the Boost Software License, Version 1.0. (See accompanying
80ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
90ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie//
100ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
110ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#ifndef ASIO_IP_ADDRESS_HPP
120ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#define ASIO_IP_ADDRESS_HPP
130ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
140ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
150ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/config.hpp"
160ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include <string>
170ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/error_code.hpp"
180ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/address_v4.hpp"
190ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/address_v6.hpp"
200ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
210ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
220ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/push_options.hpp"
230ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
240ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffienamespace asio {
250ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffienamespace ip {
260ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
270ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie/// Implements version-independent IP addresses.
280ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie/**
290ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * The asio::ip::address class provides the ability to use either IP
300ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * version 4 or version 6 addresses.
310ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie *
320ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @par Thread Safety
330ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @e Distinct @e objects: Safe.@n
340ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie * @e Shared @e objects: Unsafe.
350ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie */
360ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffieclass address
370ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie{
380ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffiepublic:
390ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Default constructor.
400ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address();
410ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
420ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Construct an address from an IPv4 address.
430ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address(const asio::ip::address_v4& ipv4_address);
440ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
450ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Construct an address from an IPv6 address.
460ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address(const asio::ip::address_v6& ipv6_address);
470ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
480ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Copy constructor.
490ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address(const address& other);
500ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
510ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Move constructor.
520ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address(address&& other);
530ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
540ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Assign from another address.
550ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address& operator=(const address& other);
560ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
570ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Move-assign from another address.
580ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address& operator=(address&& other);
590ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
600ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Assign from an IPv4 address.
610ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address& operator=(
620ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie      const asio::ip::address_v4& ipv4_address);
630ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
640ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Assign from an IPv6 address.
650ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL address& operator=(
660ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie      const asio::ip::address_v6& ipv6_address);
670ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
680ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get whether the address is an IP version 4 address.
690ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  bool is_v4() const
700ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
710ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return type_ == ipv4;
720ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
730ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
740ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get whether the address is an IP version 6 address.
750ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  bool is_v6() const
760ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
770ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return type_ == ipv6;
780ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
790ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
800ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get the address as an IP version 4 address.
810ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL asio::ip::address_v4 to_v4() const;
820ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
830ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get the address as an IP version 6 address.
840ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL asio::ip::address_v6 to_v6() const;
850ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
860ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get the address as a string in dotted decimal format.
870ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL std::string to_string() const;
880ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
890ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Get the address as a string in dotted decimal format.
900ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL std::string to_string(asio::error_code& ec) const;
910ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
920ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Create an address from an IPv4 address string in dotted decimal form,
930ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// or from an IPv6 address in hexadecimal notation.
940ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL static address from_string(const char* str);
950ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
960ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Create an address from an IPv4 address string in dotted decimal form,
970ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// or from an IPv6 address in hexadecimal notation.
980ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL static address from_string(
990ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie      const char* str, asio::error_code& ec);
1000ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1010ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Create an address from an IPv4 address string in dotted decimal form,
1020ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// or from an IPv6 address in hexadecimal notation.
1030ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL static address from_string(const std::string& str);
1040ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1050ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Create an address from an IPv4 address string in dotted decimal form,
1060ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// or from an IPv6 address in hexadecimal notation.
1070ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL static address from_string(
1080ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie      const std::string& str, asio::error_code& ec);
1090ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1100ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Determine whether the address is a loopback address.
1110ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL bool is_loopback() const;
1120ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1130ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Determine whether the address is unspecified.
1140ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL bool is_unspecified() const;
1150ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1160ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Determine whether the address is a multicast address.
1170ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL bool is_multicast() const;
1180ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1190ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare two addresses for equality.
1200ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL friend bool operator==(const address& a1, const address& a2);
1210ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1220ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare two addresses for inequality.
1230ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  friend bool operator!=(const address& a1, const address& a2)
1240ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
1250ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return !(a1 == a2);
1260ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
1270ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1280ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare addresses for ordering.
1290ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  ASIO_DECL friend bool operator<(const address& a1, const address& a2);
1300ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1310ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare addresses for ordering.
1320ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  friend bool operator>(const address& a1, const address& a2)
1330ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
1340ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return a2 < a1;
1350ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
1360ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1370ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare addresses for ordering.
1380ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  friend bool operator<=(const address& a1, const address& a2)
1390ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
1400ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return !(a2 < a1);
1410ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
1420ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1430ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  /// Compare addresses for ordering.
1440ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  friend bool operator>=(const address& a1, const address& a2)
1450ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  {
1460ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie    return !(a1 < a2);
1470ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  }
1480ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1490ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffieprivate:
1500ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  // The type of the address.
1510ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  enum { ipv4, ipv6 } type_;
1520ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1530ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  // The underlying IPv4 address.
1540ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  asio::ip::address_v4 ipv4_address_;
1550ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1560ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  // The underlying IPv6 address.
1570ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie  asio::ip::address_v6 ipv6_address_;
1580ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie};
1590ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1600ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1610ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie} // namespace ip
1620ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie} // namespace asio
1630ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1640ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/detail/pop_options.hpp"
1650ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1660ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#include "asio/ip/impl/address.hpp"
1670ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie# include "asio/ip/impl/address.ipp"
1680ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie
1690ee85db398be8ea33d67cc42f99a1468cd6c8180François Gaffie#endif // ASIO_IP_ADDRESS_HPP
170