]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/ip/network_v6.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / asio / ip / network_v6.hpp
CommitLineData
b32b8144
FG
1//
2// ip/network_v6.hpp
3// ~~~~~~~~~~~~~~~~~
4//
92f5a8d4 5// Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
b32b8144
FG
6// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com)
7//
8// Distributed under the Boost Software License, Version 1.0. (See accompanying
9// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10//
11
12#ifndef BOOST_ASIO_IP_NETWORK_V6_HPP
13#define BOOST_ASIO_IP_NETWORK_V6_HPP
14
15#if defined(_MSC_VER) && (_MSC_VER >= 1200)
16# pragma once
17#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18
19#include <boost/asio/detail/config.hpp>
20#include <string>
21#include <boost/asio/detail/string_view.hpp>
22#include <boost/system/error_code.hpp>
23#include <boost/asio/ip/address_v6_range.hpp>
24
25#include <boost/asio/detail/push_options.hpp>
26
27namespace boost {
28namespace asio {
29namespace ip {
30
31/// Represents an IPv6 network.
32/**
33 * The boost::asio::ip::network_v6 class provides the ability to use and
34 * manipulate IP version 6 networks.
35 *
36 * @par Thread Safety
37 * @e Distinct @e objects: Safe.@n
38 * @e Shared @e objects: Unsafe.
39 */
40class network_v6
41{
42public:
43 /// Default constructor.
44 network_v6() BOOST_ASIO_NOEXCEPT
45 : address_(),
46 prefix_length_(0)
47 {
48 }
49
50 /// Construct a network based on the specified address and prefix length.
51 BOOST_ASIO_DECL network_v6(const address_v6& addr,
52 unsigned short prefix_len);
53
54 /// Copy constructor.
55 network_v6(const network_v6& other) BOOST_ASIO_NOEXCEPT
56 : address_(other.address_),
57 prefix_length_(other.prefix_length_)
58 {
59 }
60
61#if defined(BOOST_ASIO_HAS_MOVE)
62 /// Move constructor.
63 network_v6(network_v6&& other) BOOST_ASIO_NOEXCEPT
64 : address_(BOOST_ASIO_MOVE_CAST(address_v6)(other.address_)),
65 prefix_length_(other.prefix_length_)
66 {
67 }
68#endif // defined(BOOST_ASIO_HAS_MOVE)
69
70 /// Assign from another network.
71 network_v6& operator=(const network_v6& other) BOOST_ASIO_NOEXCEPT
72 {
73 address_ = other.address_;
74 prefix_length_ = other.prefix_length_;
75 return *this;
76 }
77
78#if defined(BOOST_ASIO_HAS_MOVE)
79 /// Move-assign from another network.
80 network_v6& operator=(network_v6&& other) BOOST_ASIO_NOEXCEPT
81 {
82 address_ = BOOST_ASIO_MOVE_CAST(address_v6)(other.address_);
83 prefix_length_ = other.prefix_length_;
84 return *this;
85 }
86#endif // defined(BOOST_ASIO_HAS_MOVE)
87
88 /// Obtain the address object specified when the network object was created.
89 address_v6 address() const BOOST_ASIO_NOEXCEPT
90 {
91 return address_;
92 }
93
94 /// Obtain the prefix length that was specified when the network object was
95 /// created.
96 unsigned short prefix_length() const BOOST_ASIO_NOEXCEPT
97 {
98 return prefix_length_;
99 }
100
101 /// Obtain an address object that represents the network address.
102 BOOST_ASIO_DECL address_v6 network() const BOOST_ASIO_NOEXCEPT;
103
104 /// Obtain an address range corresponding to the hosts in the network.
105 BOOST_ASIO_DECL address_v6_range hosts() const BOOST_ASIO_NOEXCEPT;
106
107 /// Obtain the true network address, omitting any host bits.
108 network_v6 canonical() const BOOST_ASIO_NOEXCEPT
109 {
110 return network_v6(network(), prefix_length());
111 }
112
113 /// Test if network is a valid host address.
114 bool is_host() const BOOST_ASIO_NOEXCEPT
115 {
116 return prefix_length_ == 128;
117 }
118
119 /// Test if a network is a real subnet of another network.
120 BOOST_ASIO_DECL bool is_subnet_of(const network_v6& other) const;
121
122 /// Get the network as an address in dotted decimal format.
123 BOOST_ASIO_DECL std::string to_string() const;
124
125 /// Get the network as an address in dotted decimal format.
126 BOOST_ASIO_DECL std::string to_string(boost::system::error_code& ec) const;
127
128 /// Compare two networks for equality.
129 friend bool operator==(const network_v6& a, const network_v6& b)
130 {
131 return a.address_ == b.address_ && a.prefix_length_ == b.prefix_length_;
132 }
133
134 /// Compare two networks for inequality.
135 friend bool operator!=(const network_v6& a, const network_v6& b)
136 {
137 return !(a == b);
138 }
139
140private:
141 address_v6 address_;
142 unsigned short prefix_length_;
143};
144
145/// Create an IPv6 network from an address and prefix length.
146/**
147 * @relates address_v6
148 */
149inline network_v6 make_network_v6(
150 const address_v6& addr, unsigned short prefix_len)
151{
152 return network_v6(addr, prefix_len);
153}
154
155/// Create an IPv6 network from a string containing IP address and prefix
156/// length.
157/**
158 * @relates network_v6
159 */
160BOOST_ASIO_DECL network_v6 make_network_v6(const char* str);
161
162/// Create an IPv6 network from a string containing IP address and prefix
163/// length.
164/**
165 * @relates network_v6
166 */
167BOOST_ASIO_DECL network_v6 make_network_v6(
168 const char* str, boost::system::error_code& ec);
169
170/// Create an IPv6 network from a string containing IP address and prefix
171/// length.
172/**
173 * @relates network_v6
174 */
175BOOST_ASIO_DECL network_v6 make_network_v6(const std::string& str);
176
177/// Create an IPv6 network from a string containing IP address and prefix
178/// length.
179/**
180 * @relates network_v6
181 */
182BOOST_ASIO_DECL network_v6 make_network_v6(
183 const std::string& str, boost::system::error_code& ec);
184
11fdf7f2 185#if defined(BOOST_ASIO_HAS_STRING_VIEW) \
b32b8144
FG
186 || defined(GENERATING_DOCUMENTATION)
187
188/// Create an IPv6 network from a string containing IP address and prefix
189/// length.
190/**
191 * @relates network_v6
192 */
193BOOST_ASIO_DECL network_v6 make_network_v6(string_view str);
194
195/// Create an IPv6 network from a string containing IP address and prefix
196/// length.
197/**
198 * @relates network_v6
199 */
200BOOST_ASIO_DECL network_v6 make_network_v6(
201 string_view str, boost::system::error_code& ec);
202
11fdf7f2 203#endif // defined(BOOST_ASIO_HAS_STRING_VIEW)
b32b8144
FG
204 // || defined(GENERATING_DOCUMENTATION)
205
206#if !defined(BOOST_ASIO_NO_IOSTREAM)
207
208/// Output a network as a string.
209/**
210 * Used to output a human-readable string for a specified network.
211 *
212 * @param os The output stream to which the string will be written.
213 *
214 * @param net The network to be written.
215 *
216 * @return The output stream.
217 *
218 * @relates boost::asio::ip::address_v6
219 */
220template <typename Elem, typename Traits>
221std::basic_ostream<Elem, Traits>& operator<<(
222 std::basic_ostream<Elem, Traits>& os, const network_v6& net);
223
224#endif // !defined(BOOST_ASIO_NO_IOSTREAM)
225
226} // namespace ip
227} // namespace asio
228} // namespace boost
229
230#include <boost/asio/detail/pop_options.hpp>
231
232#include <boost/asio/ip/impl/network_v6.hpp>
233#if defined(BOOST_ASIO_HEADER_ONLY)
234# include <boost/asio/ip/impl/network_v6.ipp>
235#endif // defined(BOOST_ASIO_HEADER_ONLY)
236
237#endif // BOOST_ASIO_IP_NETWORK_V6_HPP