1//
2// ip/address.hpp
3// ~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2015 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_ADDRESS_HPP
12#define ASIO_IP_ADDRESS_HPP
13
14
15#include "asio/detail/config.hpp"
16#include <string>
17#include "asio/error_code.hpp"
18#include "asio/ip/address_v4.hpp"
19#include "asio/ip/address_v6.hpp"
20
21
22#include "asio/detail/push_options.hpp"
23
24namespace asio {
25namespace ip {
26
27/// Implements version-independent IP addresses.
28/**
29 * The asio::ip::address class provides the ability to use either IP
30 * version 4 or version 6 addresses.
31 *
32 * @par Thread Safety
33 * @e Distinct @e objects: Safe.@n
34 * @e Shared @e objects: Unsafe.
35 */
36class address
37{
38public:
39  /// Default constructor.
40  ASIO_DECL address();
41
42  /// Construct an address from an IPv4 address.
43  ASIO_DECL address(const asio::ip::address_v4& ipv4_address);
44
45  /// Construct an address from an IPv6 address.
46  ASIO_DECL address(const asio::ip::address_v6& ipv6_address);
47
48  /// Copy constructor.
49  ASIO_DECL address(const address& other);
50
51  /// Move constructor.
52  ASIO_DECL address(address&& other);
53
54  /// Assign from another address.
55  ASIO_DECL address& operator=(const address& other);
56
57  /// Move-assign from another address.
58  ASIO_DECL address& operator=(address&& other);
59
60  /// Assign from an IPv4 address.
61  ASIO_DECL address& operator=(
62      const asio::ip::address_v4& ipv4_address);
63
64  /// Assign from an IPv6 address.
65  ASIO_DECL address& operator=(
66      const asio::ip::address_v6& ipv6_address);
67
68  /// Get whether the address is an IP version 4 address.
69  bool is_v4() const
70  {
71    return type_ == ipv4;
72  }
73
74  /// Get whether the address is an IP version 6 address.
75  bool is_v6() const
76  {
77    return type_ == ipv6;
78  }
79
80  /// Get the address as an IP version 4 address.
81  ASIO_DECL asio::ip::address_v4 to_v4() const;
82
83  /// Get the address as an IP version 6 address.
84  ASIO_DECL asio::ip::address_v6 to_v6() const;
85
86  /// Get the address as a string in dotted decimal format.
87  ASIO_DECL std::string to_string() const;
88
89  /// Get the address as a string in dotted decimal format.
90  ASIO_DECL std::string to_string(asio::error_code& ec) const;
91
92  /// Create an address from an IPv4 address string in dotted decimal form,
93  /// or from an IPv6 address in hexadecimal notation.
94  ASIO_DECL static address from_string(const char* str);
95
96  /// Create an address from an IPv4 address string in dotted decimal form,
97  /// or from an IPv6 address in hexadecimal notation.
98  ASIO_DECL static address from_string(
99      const char* str, asio::error_code& ec);
100
101  /// Create an address from an IPv4 address string in dotted decimal form,
102  /// or from an IPv6 address in hexadecimal notation.
103  ASIO_DECL static address from_string(const std::string& str);
104
105  /// Create an address from an IPv4 address string in dotted decimal form,
106  /// or from an IPv6 address in hexadecimal notation.
107  ASIO_DECL static address from_string(
108      const std::string& str, asio::error_code& ec);
109
110  /// Determine whether the address is a loopback address.
111  ASIO_DECL bool is_loopback() const;
112
113  /// Determine whether the address is unspecified.
114  ASIO_DECL bool is_unspecified() const;
115
116  /// Determine whether the address is a multicast address.
117  ASIO_DECL bool is_multicast() const;
118
119  /// Compare two addresses for equality.
120  ASIO_DECL friend bool operator==(const address& a1, const address& a2);
121
122  /// Compare two addresses for inequality.
123  friend bool operator!=(const address& a1, const address& a2)
124  {
125    return !(a1 == a2);
126  }
127
128  /// Compare addresses for ordering.
129  ASIO_DECL friend bool operator<(const address& a1, const address& a2);
130
131  /// Compare addresses for ordering.
132  friend bool operator>(const address& a1, const address& a2)
133  {
134    return a2 < a1;
135  }
136
137  /// Compare addresses for ordering.
138  friend bool operator<=(const address& a1, const address& a2)
139  {
140    return !(a2 < a1);
141  }
142
143  /// Compare addresses for ordering.
144  friend bool operator>=(const address& a1, const address& a2)
145  {
146    return !(a1 < a2);
147  }
148
149private:
150  // The type of the address.
151  enum { ipv4, ipv6 } type_;
152
153  // The underlying IPv4 address.
154  asio::ip::address_v4 ipv4_address_;
155
156  // The underlying IPv6 address.
157  asio::ip::address_v6 ipv6_address_;
158};
159
160
161} // namespace ip
162} // namespace asio
163
164#include "asio/detail/pop_options.hpp"
165
166#include "asio/ip/impl/address.hpp"
167# include "asio/ip/impl/address.ipp"
168
169#endif // ASIO_IP_ADDRESS_HPP
170