1//
2// ip/address_v4_range.hpp
3// ~~~~~~~~~~~~~~~~~~~~~~~
4//
5// Copyright (c) 2003-2024 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 BOOST_ASIO_IP_ADDRESS_V4_RANGE_HPP
12#define BOOST_ASIO_IP_ADDRESS_V4_RANGE_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_iterator.hpp>
20
21#include <boost/asio/detail/push_options.hpp>
22
23namespace boost {
24namespace asio {
25namespace ip {
26
27template <typename> class basic_address_range;
28
29/// Represents a range of IPv4 addresses.
30/**
31 * @par Thread Safety
32 * @e Distinct @e objects: Safe.@n
33 * @e Shared @e objects: Unsafe.
34 */
35template <> class basic_address_range<address_v4>
36{
37public:
38 /// The type of an iterator that points into the range.
39 typedef basic_address_iterator<address_v4> iterator;
40
41 /// Construct an empty range.
42 basic_address_range() noexcept
43 : begin_(address_v4()),
44 end_(address_v4())
45 {
46 }
47
48 /// Construct an range that represents the given range of addresses.
49 explicit basic_address_range(const iterator& first,
50 const iterator& last) noexcept
51 : begin_(first),
52 end_(last)
53 {
54 }
55
56 /// Copy constructor.
57 basic_address_range(const basic_address_range& other) noexcept
58 : begin_(other.begin_),
59 end_(other.end_)
60 {
61 }
62
63 /// Move constructor.
64 basic_address_range(basic_address_range&& other) noexcept
65 : begin_(static_cast<iterator&&>(other.begin_)),
66 end_(static_cast<iterator&&>(other.end_))
67 {
68 }
69
70 /// Assignment operator.
71 basic_address_range& operator=(const basic_address_range& other) noexcept
72 {
73 begin_ = other.begin_;
74 end_ = other.end_;
75 return *this;
76 }
77
78 /// Move assignment operator.
79 basic_address_range& operator=(basic_address_range&& other) noexcept
80 {
81 begin_ = static_cast<iterator&&>(other.begin_);
82 end_ = static_cast<iterator&&>(other.end_);
83 return *this;
84 }
85
86 /// Obtain an iterator that points to the start of the range.
87 iterator begin() const noexcept
88 {
89 return begin_;
90 }
91
92 /// Obtain an iterator that points to the end of the range.
93 iterator end() const noexcept
94 {
95 return end_;
96 }
97
98 /// Determine whether the range is empty.
99 bool empty() const noexcept
100 {
101 return size() == 0;
102 }
103
104 /// Return the size of the range.
105 std::size_t size() const noexcept
106 {
107 return end_->to_uint() - begin_->to_uint();
108 }
109
110 /// Find an address in the range.
111 iterator find(const address_v4& addr) const noexcept
112 {
113 return addr >= *begin_ && addr < *end_ ? iterator(addr) : end_;
114 }
115
116private:
117 iterator begin_;
118 iterator end_;
119};
120
121/// Represents a range of IPv4 addresses.
122typedef basic_address_range<address_v4> address_v4_range;
123
124} // namespace ip
125} // namespace asio
126} // namespace boost
127
128#include <boost/asio/detail/pop_options.hpp>
129
130#endif // BOOST_ASIO_IP_ADDRESS_V4_RANGE_HPP
131

source code of boost/libs/asio/include/boost/asio/ip/address_v4_range.hpp