Clementine
address_v4_iterator.hpp
1 //
2 // ip/address_v4_iterator.hpp
3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2020 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_V4_ITERATOR_HPP
12 #define 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 "asio/detail/config.hpp"
19 #include "asio/ip/address_v4.hpp"
20 
21 #include "asio/detail/push_options.hpp"
22 
23 namespace asio {
24 namespace ip {
25 
26 template <typename> class basic_address_iterator;
27 
29 
38 {
39 public:
42 
44  typedef std::ptrdiff_t difference_type;
45 
47  typedef const address_v4* pointer;
48 
50  typedef const address_v4& reference;
51 
53  typedef std::input_iterator_tag iterator_category;
54 
56  basic_address_iterator(const address_v4& addr) ASIO_NOEXCEPT
57  : address_(addr)
58  {
59  }
60 
63  const basic_address_iterator& other) ASIO_NOEXCEPT
64  : address_(other.address_)
65  {
66  }
67 
68 #if defined(ASIO_HAS_MOVE)
69  basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT
71  : address_(ASIO_MOVE_CAST(address_v4)(other.address_))
72  {
73  }
74 #endif // defined(ASIO_HAS_MOVE)
75 
78  const basic_address_iterator& other) ASIO_NOEXCEPT
79  {
80  address_ = other.address_;
81  return *this;
82  }
83 
84 #if defined(ASIO_HAS_MOVE)
85  basic_address_iterator& operator=(
87  basic_address_iterator&& other) ASIO_NOEXCEPT
88  {
89  address_ = ASIO_MOVE_CAST(address_v4)(other.address_);
90  return *this;
91  }
92 #endif // defined(ASIO_HAS_MOVE)
93 
95  const address_v4& operator*() const ASIO_NOEXCEPT
96  {
97  return address_;
98  }
99 
101  const address_v4* operator->() const ASIO_NOEXCEPT
102  {
103  return &address_;
104  }
105 
108  {
109  address_ = address_v4((address_.to_uint() + 1) & 0xFFFFFFFF);
110  return *this;
111  }
112 
115  {
116  basic_address_iterator tmp(*this);
117  ++*this;
118  return tmp;
119  }
120 
123  {
124  address_ = address_v4((address_.to_uint() - 1) & 0xFFFFFFFF);
125  return *this;
126  }
127 
130  {
131  basic_address_iterator tmp(*this);
132  --*this;
133  return tmp;
134  }
135 
137  friend bool operator==(const basic_address_iterator& a,
138  const basic_address_iterator& b)
139  {
140  return a.address_ == b.address_;
141  }
142 
144  friend bool operator!=(const basic_address_iterator& a,
145  const basic_address_iterator& b)
146  {
147  return a.address_ != b.address_;
148  }
149 
150 private:
151  address_v4 address_;
152 };
153 
156 
157 } // namespace ip
158 } // namespace asio
159 
160 #include "asio/detail/pop_options.hpp"
161 
162 #endif // ASIO_IP_ADDRESS_V4_ITERATOR_HPP
Definition: address_v4_iterator.hpp:26
address_v4 value_type
The type of the elements pointed to by the iterator.
Definition: address_v4_iterator.hpp:41
basic_address_iterator & operator--() ASIO_NOEXCEPT
Pre-decrement operator.
Definition: address_v4_iterator.hpp:122
basic_address_iterator & operator=(const basic_address_iterator &other) ASIO_NOEXCEPT
Assignment operator.
Definition: address_v4_iterator.hpp:77
Implements IP version 4 style addresses.
Definition: address_v4.hpp:45
const address_v4 & operator*() const ASIO_NOEXCEPT
Dereference the iterator.
Definition: address_v4_iterator.hpp:95
An input iterator that can be used for traversing IPv4 addresses.
Definition: address_v4_iterator.hpp:37
const address_v4 * pointer
The type of a pointer to an element pointed to by the iterator.
Definition: address_v4_iterator.hpp:47
std::input_iterator_tag iterator_category
Denotes that the iterator satisfies the input iterator requirements.
Definition: address_v4_iterator.hpp:53
std::ptrdiff_t difference_type
Distance between two iterators.
Definition: address_v4_iterator.hpp:44
basic_address_iterator(const basic_address_iterator &other) ASIO_NOEXCEPT
Copy constructor.
Definition: address_v4_iterator.hpp:62
basic_address_iterator operator++(int) ASIO_NOEXCEPT
Post-increment operator.
Definition: address_v4_iterator.hpp:114
basic_address_iterator(const address_v4 &addr) ASIO_NOEXCEPT
Construct an iterator that points to the specified address.
Definition: address_v4_iterator.hpp:56
const address_v4 * operator->() const ASIO_NOEXCEPT
Dereference the iterator.
Definition: address_v4_iterator.hpp:101
friend bool operator==(const basic_address_iterator &a, const basic_address_iterator &b)
Compare two addresses for equality.
Definition: address_v4_iterator.hpp:137
basic_address_iterator & operator++() ASIO_NOEXCEPT
Pre-increment operator.
Definition: address_v4_iterator.hpp:107
Definition: any_io_executor.hpp:28
basic_address_iterator operator--(int)
Post-decrement operator.
Definition: address_v4_iterator.hpp:129
const address_v4 & reference
The type of a reference to an element pointed to by the iterator.
Definition: address_v4_iterator.hpp:50
friend bool operator!=(const basic_address_iterator &a, const basic_address_iterator &b)
Compare two addresses for inequality.
Definition: address_v4_iterator.hpp:144