TLA Line data Source code
1 : //
2 : // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/cppalliance/corosio
8 : //
9 :
10 : #ifndef BOOST_COROSIO_RESOLVER_RESULTS_HPP
11 : #define BOOST_COROSIO_RESOLVER_RESULTS_HPP
12 :
13 : #include <boost/corosio/detail/config.hpp>
14 : #include <boost/corosio/endpoint.hpp>
15 :
16 : #include <cstddef>
17 : #include <memory>
18 : #include <string>
19 : #include <string_view>
20 : #include <vector>
21 :
22 : namespace boost::corosio {
23 :
24 : /** A single entry produced by a resolver.
25 :
26 : This class represents one resolved endpoint along with
27 : the host and service names used in the query.
28 :
29 : @par Thread Safety
30 : Distinct objects: Safe.@n
31 : Shared objects: Safe.
32 : */
33 : class resolver_entry
34 : {
35 : endpoint ep_;
36 : std::string host_name_;
37 : std::string service_name_;
38 :
39 : public:
40 : /// Construct a default empty entry.
41 : resolver_entry() = default;
42 :
43 : /** Construct with endpoint, host name, and service name.
44 :
45 : @param ep The resolved endpoint.
46 : @param host The host name from the query.
47 : @param service The service name from the query.
48 : */
49 HIT 18 : resolver_entry(endpoint ep, std::string_view host, std::string_view service)
50 18 : : ep_(ep)
51 36 : , host_name_(host)
52 36 : , service_name_(service)
53 : {
54 18 : }
55 :
56 : /// Return the resolved endpoint.
57 6 : endpoint get_endpoint() const noexcept
58 : {
59 6 : return ep_;
60 : }
61 :
62 : /// Convert to endpoint.
63 1 : operator endpoint() const noexcept
64 : {
65 1 : return ep_;
66 : }
67 :
68 : /// Return the host name from the query.
69 2 : std::string const& host_name() const noexcept
70 : {
71 2 : return host_name_;
72 : }
73 :
74 : /// Return the service name from the query.
75 2 : std::string const& service_name() const noexcept
76 : {
77 2 : return service_name_;
78 : }
79 : };
80 :
81 : /** A range of entries produced by a resolver.
82 :
83 : This class holds the results of a DNS resolution query.
84 : It provides a range interface for iterating over the
85 : resolved endpoints.
86 :
87 : @par Thread Safety
88 : Distinct objects: Safe.@n
89 : Shared objects: Safe (immutable after construction).
90 : */
91 : class resolver_results
92 : {
93 : public:
94 : /// The entry type.
95 : using value_type = resolver_entry;
96 :
97 : /// Const reference to an entry.
98 : using const_reference = value_type const&;
99 :
100 : /// Reference to an entry (always const).
101 : using reference = const_reference;
102 :
103 : /// Const iterator over entries.
104 : using const_iterator = std::vector<resolver_entry>::const_iterator;
105 :
106 : /// Iterator over entries (always const).
107 : using iterator = const_iterator;
108 :
109 : /// Signed difference type.
110 : using difference_type = std::ptrdiff_t;
111 :
112 : /// Unsigned size type.
113 : using size_type = std::size_t;
114 :
115 : private:
116 : std::shared_ptr<std::vector<resolver_entry>> entries_;
117 :
118 : public:
119 : /// Construct an empty results range.
120 61 : resolver_results() = default;
121 :
122 : /** Construct from a vector of entries.
123 :
124 : @param entries The resolved entries.
125 : */
126 15 : explicit resolver_results(std::vector<resolver_entry> entries)
127 15 : : entries_(
128 15 : std::make_shared<std::vector<resolver_entry>>(std::move(entries)))
129 : {
130 15 : }
131 :
132 : /// Return the number of entries.
133 11 : size_type size() const noexcept
134 : {
135 11 : return entries_ ? entries_->size() : 0;
136 : }
137 :
138 : /// Check if the results are empty.
139 11 : bool empty() const noexcept
140 : {
141 11 : return !entries_ || entries_->empty();
142 : }
143 :
144 : /// Return an iterator to the first entry.
145 9 : const_iterator begin() const noexcept
146 : {
147 9 : if (entries_)
148 8 : return entries_->begin();
149 1 : return std::vector<resolver_entry>::const_iterator();
150 : }
151 :
152 : /// Return an iterator past the last entry.
153 5 : const_iterator end() const noexcept
154 : {
155 5 : if (entries_)
156 4 : return entries_->end();
157 1 : return std::vector<resolver_entry>::const_iterator();
158 : }
159 :
160 : /// Return an iterator to the first entry.
161 1 : const_iterator cbegin() const noexcept
162 : {
163 1 : return begin();
164 : }
165 :
166 : /// Return an iterator past the last entry.
167 2 : const_iterator cend() const noexcept
168 : {
169 2 : return end();
170 : }
171 :
172 : /// Swap with another results object.
173 1 : void swap(resolver_results& other) noexcept
174 : {
175 1 : entries_.swap(other.entries_);
176 1 : }
177 :
178 : /// Test for equality.
179 : friend bool
180 : operator==(resolver_results const& a, resolver_results const& b) noexcept
181 : {
182 : return a.entries_ == b.entries_;
183 : }
184 :
185 : /// Test for inequality.
186 : friend bool
187 : operator!=(resolver_results const& a, resolver_results const& b) noexcept
188 : {
189 : return !(a == b);
190 : }
191 : };
192 :
193 : /** The result of a reverse DNS resolution.
194 :
195 : This class holds the result of resolving an endpoint
196 : into a hostname and service name.
197 :
198 : @par Thread Safety
199 : Distinct objects: Safe.@n
200 : Shared objects: Safe.
201 : */
202 : class reverse_resolver_result
203 : {
204 : corosio::endpoint ep_;
205 : std::string host_;
206 : std::string service_;
207 :
208 : public:
209 : /// Construct a default empty result.
210 14 : reverse_resolver_result() = default;
211 :
212 : /** Construct with endpoint, host name, and service name.
213 :
214 : @param ep The endpoint that was resolved.
215 : @param host The resolved host name.
216 : @param service The resolved service name.
217 : */
218 9 : reverse_resolver_result(
219 : corosio::endpoint ep, std::string host, std::string service)
220 9 : : ep_(ep)
221 9 : , host_(std::move(host))
222 9 : , service_(std::move(service))
223 : {
224 9 : }
225 :
226 : /// Return the endpoint that was resolved.
227 : corosio::endpoint endpoint() const noexcept
228 : {
229 : return ep_;
230 : }
231 :
232 : /// Return the resolved host name.
233 4 : std::string const& host_name() const noexcept
234 : {
235 4 : return host_;
236 : }
237 :
238 : /// Return the resolved service name.
239 4 : std::string const& service_name() const noexcept
240 : {
241 4 : return service_;
242 : }
243 : };
244 :
245 : } // namespace boost::corosio
246 :
247 : #endif
|