]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/asio/ip/address_v4_iterator.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / asio / ip / address_v4_iterator.hpp
CommitLineData
b32b8144
FG
1//
2// ip/address_v4_iterator.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~~~~
4//
92f5a8d4 5// Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
b32b8144
FG
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 BOOST_ASIO_IP_ADDRESS_V4_ITERATOR_HPP
12#define BOOST_ASIO_IP_ADDRESS_V4_ITERATOR_HPP
13
14#if defined(_MSC_VER) && (_MSC_VER >= 1200)
15# pragma once
16#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18#include <boost/asio/detail/config.hpp>
19#include <boost/asio/ip/address_v4.hpp>
20
21#include <boost/asio/detail/push_options.hpp>
22
23namespace boost {
24namespace asio {
25namespace ip {
26
27template <typename> class basic_address_iterator;
28
29/// An input iterator that can be used for traversing IPv4 addresses.
30/**
31 * In addition to satisfying the input iterator requirements, this iterator
32 * also supports decrement.
33 *
34 * @par Thread Safety
35 * @e Distinct @e objects: Safe.@n
36 * @e Shared @e objects: Unsafe.
37 */
38template <> class basic_address_iterator<address_v4>
39{
40public:
41 /// The type of the elements pointed to by the iterator.
42 typedef address_v4 value_type;
43
44 /// Distance between two iterators.
45 typedef std::ptrdiff_t difference_type;
46
47 /// The type of a pointer to an element pointed to by the iterator.
48 typedef const address_v4* pointer;
49
50 /// The type of a reference to an element pointed to by the iterator.
51 typedef const address_v4& reference;
52
53 /// Denotes that the iterator satisfies the input iterator requirements.
54 typedef std::input_iterator_tag iterator_category;
55
56 /// Construct an iterator that points to the specified address.
57 basic_address_iterator(const address_v4& addr) BOOST_ASIO_NOEXCEPT
58 : address_(addr)
59 {
60 }
61
62 /// Copy constructor.
63 basic_address_iterator(
64 const basic_address_iterator& other) BOOST_ASIO_NOEXCEPT
65 : address_(other.address_)
66 {
67 }
68
69#if defined(BOOST_ASIO_HAS_MOVE)
70 /// Move constructor.
71 basic_address_iterator(basic_address_iterator&& other) BOOST_ASIO_NOEXCEPT
72 : address_(BOOST_ASIO_MOVE_CAST(address_v4)(other.address_))
73 {
74 }
75#endif // defined(BOOST_ASIO_HAS_MOVE)
76
77 /// Assignment operator.
78 basic_address_iterator& operator=(
79 const basic_address_iterator& other) BOOST_ASIO_NOEXCEPT
80 {
81 address_ = other.address_;
82 return *this;
83 }
84
85#if defined(BOOST_ASIO_HAS_MOVE)
86 /// Move assignment operator.
87 basic_address_iterator& operator=(
88 basic_address_iterator&& other) BOOST_ASIO_NOEXCEPT
89 {
90 address_ = BOOST_ASIO_MOVE_CAST(address_v4)(other.address_);
91 return *this;
92 }
93#endif // defined(BOOST_ASIO_HAS_MOVE)
94
95 /// Dereference the iterator.
96 const address_v4& operator*() const BOOST_ASIO_NOEXCEPT
97 {
98 return address_;
99 }
100
101 /// Dereference the iterator.
102 const address_v4* operator->() const BOOST_ASIO_NOEXCEPT
103 {
104 return &address_;
105 }
106
107 /// Pre-increment operator.
108 basic_address_iterator& operator++() BOOST_ASIO_NOEXCEPT
109 {
110 address_ = address_v4((address_.to_uint() + 1) & 0xFFFFFFFF);
111 return *this;
112 }
113
114 /// Post-increment operator.
115 basic_address_iterator operator++(int) BOOST_ASIO_NOEXCEPT
116 {
117 basic_address_iterator tmp(*this);
118 ++*this;
119 return tmp;
120 }
121
122 /// Pre-decrement operator.
123 basic_address_iterator& operator--() BOOST_ASIO_NOEXCEPT
124 {
125 address_ = address_v4((address_.to_uint() - 1) & 0xFFFFFFFF);
126 return *this;
127 }
128
129 /// Post-decrement operator.
130 basic_address_iterator operator--(int)
131 {
132 basic_address_iterator tmp(*this);
133 --*this;
134 return tmp;
135 }
136
137 /// Compare two addresses for equality.
138 friend bool operator==(const basic_address_iterator& a,
139 const basic_address_iterator& b)
140 {
141 return a.address_ == b.address_;
142 }
143
144 /// Compare two addresses for inequality.
145 friend bool operator!=(const basic_address_iterator& a,
146 const basic_address_iterator& b)
147 {
148 return a.address_ != b.address_;
149 }
150
151private:
152 address_v4 address_;
153};
154
155/// An input iterator that can be used for traversing IPv4 addresses.
156typedef basic_address_iterator<address_v4> address_v4_iterator;
157
158} // namespace ip
159} // namespace asio
160} // namespace boost
161
162#include <boost/asio/detail/pop_options.hpp>
163
164#endif // BOOST_ASIO_IP_ADDRESS_V4_ITERATOR_HPP