annotate DEPENDENCIES/generic/include/boost/asio/ip/basic_resolver_iterator.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 //
Chris@16 2 // ip/basic_resolver_iterator.hpp
Chris@16 3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Chris@16 4 //
Chris@101 5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
Chris@16 6 //
Chris@16 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@16 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 9 //
Chris@16 10
Chris@16 11 #ifndef BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP
Chris@16 12 #define BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP
Chris@16 13
Chris@16 14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 15 # pragma once
Chris@16 16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
Chris@16 17
Chris@16 18 #include <boost/asio/detail/config.hpp>
Chris@16 19 #include <cstddef>
Chris@16 20 #include <cstring>
Chris@16 21 #include <iterator>
Chris@16 22 #include <string>
Chris@16 23 #include <vector>
Chris@16 24 #include <boost/asio/detail/shared_ptr.hpp>
Chris@16 25 #include <boost/asio/detail/socket_ops.hpp>
Chris@16 26 #include <boost/asio/detail/socket_types.hpp>
Chris@16 27 #include <boost/asio/ip/basic_resolver_entry.hpp>
Chris@16 28
Chris@16 29 #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 30 # include <boost/asio/detail/winrt_utils.hpp>
Chris@16 31 #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 32
Chris@16 33 #include <boost/asio/detail/push_options.hpp>
Chris@16 34
Chris@16 35 namespace boost {
Chris@16 36 namespace asio {
Chris@16 37 namespace ip {
Chris@16 38
Chris@16 39 /// An iterator over the entries produced by a resolver.
Chris@16 40 /**
Chris@16 41 * The boost::asio::ip::basic_resolver_iterator class template is used to define
Chris@16 42 * iterators over the results returned by a resolver.
Chris@16 43 *
Chris@16 44 * The iterator's value_type, obtained when the iterator is dereferenced, is:
Chris@16 45 * @code const basic_resolver_entry<InternetProtocol> @endcode
Chris@16 46 *
Chris@16 47 * @par Thread Safety
Chris@16 48 * @e Distinct @e objects: Safe.@n
Chris@16 49 * @e Shared @e objects: Unsafe.
Chris@16 50 */
Chris@16 51 template <typename InternetProtocol>
Chris@16 52 class basic_resolver_iterator
Chris@16 53 {
Chris@16 54 public:
Chris@16 55 /// The type used for the distance between two iterators.
Chris@16 56 typedef std::ptrdiff_t difference_type;
Chris@16 57
Chris@16 58 /// The type of the value pointed to by the iterator.
Chris@16 59 typedef basic_resolver_entry<InternetProtocol> value_type;
Chris@16 60
Chris@16 61 /// The type of the result of applying operator->() to the iterator.
Chris@16 62 typedef const basic_resolver_entry<InternetProtocol>* pointer;
Chris@16 63
Chris@16 64 /// The type of the result of applying operator*() to the iterator.
Chris@16 65 typedef const basic_resolver_entry<InternetProtocol>& reference;
Chris@16 66
Chris@16 67 /// The iterator category.
Chris@16 68 typedef std::forward_iterator_tag iterator_category;
Chris@16 69
Chris@16 70 /// Default constructor creates an end iterator.
Chris@16 71 basic_resolver_iterator()
Chris@16 72 : index_(0)
Chris@16 73 {
Chris@16 74 }
Chris@16 75
Chris@16 76 /// Create an iterator from an addrinfo list returned by getaddrinfo.
Chris@16 77 static basic_resolver_iterator create(
Chris@16 78 boost::asio::detail::addrinfo_type* address_info,
Chris@16 79 const std::string& host_name, const std::string& service_name)
Chris@16 80 {
Chris@16 81 basic_resolver_iterator iter;
Chris@16 82 if (!address_info)
Chris@16 83 return iter;
Chris@16 84
Chris@16 85 std::string actual_host_name = host_name;
Chris@16 86 if (address_info->ai_canonname)
Chris@16 87 actual_host_name = address_info->ai_canonname;
Chris@16 88
Chris@16 89 iter.values_.reset(new values_type);
Chris@16 90
Chris@16 91 while (address_info)
Chris@16 92 {
Chris@16 93 if (address_info->ai_family == BOOST_ASIO_OS_DEF(AF_INET)
Chris@16 94 || address_info->ai_family == BOOST_ASIO_OS_DEF(AF_INET6))
Chris@16 95 {
Chris@16 96 using namespace std; // For memcpy.
Chris@16 97 typename InternetProtocol::endpoint endpoint;
Chris@16 98 endpoint.resize(static_cast<std::size_t>(address_info->ai_addrlen));
Chris@16 99 memcpy(endpoint.data(), address_info->ai_addr,
Chris@16 100 address_info->ai_addrlen);
Chris@16 101 iter.values_->push_back(
Chris@16 102 basic_resolver_entry<InternetProtocol>(endpoint,
Chris@16 103 actual_host_name, service_name));
Chris@16 104 }
Chris@16 105 address_info = address_info->ai_next;
Chris@16 106 }
Chris@16 107
Chris@16 108 return iter;
Chris@16 109 }
Chris@16 110
Chris@16 111 /// Create an iterator from an endpoint, host name and service name.
Chris@16 112 static basic_resolver_iterator create(
Chris@16 113 const typename InternetProtocol::endpoint& endpoint,
Chris@16 114 const std::string& host_name, const std::string& service_name)
Chris@16 115 {
Chris@16 116 basic_resolver_iterator iter;
Chris@16 117 iter.values_.reset(new values_type);
Chris@16 118 iter.values_->push_back(
Chris@16 119 basic_resolver_entry<InternetProtocol>(
Chris@16 120 endpoint, host_name, service_name));
Chris@16 121 return iter;
Chris@16 122 }
Chris@16 123
Chris@16 124 /// Create an iterator from a sequence of endpoints, host and service name.
Chris@16 125 template <typename EndpointIterator>
Chris@16 126 static basic_resolver_iterator create(
Chris@16 127 EndpointIterator begin, EndpointIterator end,
Chris@16 128 const std::string& host_name, const std::string& service_name)
Chris@16 129 {
Chris@16 130 basic_resolver_iterator iter;
Chris@16 131 if (begin != end)
Chris@16 132 {
Chris@16 133 iter.values_.reset(new values_type);
Chris@16 134 for (EndpointIterator ep_iter = begin; ep_iter != end; ++ep_iter)
Chris@16 135 {
Chris@16 136 iter.values_->push_back(
Chris@16 137 basic_resolver_entry<InternetProtocol>(
Chris@16 138 *ep_iter, host_name, service_name));
Chris@16 139 }
Chris@16 140 }
Chris@16 141 return iter;
Chris@16 142 }
Chris@16 143
Chris@16 144 #if defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 145 /// Create an iterator from a Windows Runtime list of EndpointPair objects.
Chris@16 146 static basic_resolver_iterator create(
Chris@16 147 Windows::Foundation::Collections::IVectorView<
Chris@16 148 Windows::Networking::EndpointPair^>^ endpoints,
Chris@16 149 const boost::asio::detail::addrinfo_type& hints,
Chris@16 150 const std::string& host_name, const std::string& service_name)
Chris@16 151 {
Chris@16 152 basic_resolver_iterator iter;
Chris@16 153 if (endpoints->Size)
Chris@16 154 {
Chris@16 155 iter.values_.reset(new values_type);
Chris@16 156 for (unsigned int i = 0; i < endpoints->Size; ++i)
Chris@16 157 {
Chris@16 158 auto pair = endpoints->GetAt(i);
Chris@16 159
Chris@16 160 if (hints.ai_family == BOOST_ASIO_OS_DEF(AF_INET)
Chris@16 161 && pair->RemoteHostName->Type
Chris@16 162 != Windows::Networking::HostNameType::Ipv4)
Chris@16 163 continue;
Chris@16 164
Chris@16 165 if (hints.ai_family == BOOST_ASIO_OS_DEF(AF_INET6)
Chris@16 166 && pair->RemoteHostName->Type
Chris@16 167 != Windows::Networking::HostNameType::Ipv6)
Chris@16 168 continue;
Chris@16 169
Chris@16 170 iter.values_->push_back(
Chris@16 171 basic_resolver_entry<InternetProtocol>(
Chris@16 172 typename InternetProtocol::endpoint(
Chris@16 173 ip::address::from_string(
Chris@16 174 boost::asio::detail::winrt_utils::string(
Chris@16 175 pair->RemoteHostName->CanonicalName)),
Chris@16 176 boost::asio::detail::winrt_utils::integer(
Chris@16 177 pair->RemoteServiceName)),
Chris@16 178 host_name, service_name));
Chris@16 179 }
Chris@16 180 }
Chris@16 181 return iter;
Chris@16 182 }
Chris@16 183 #endif // defined(BOOST_ASIO_WINDOWS_RUNTIME)
Chris@16 184
Chris@16 185 /// Dereference an iterator.
Chris@16 186 const basic_resolver_entry<InternetProtocol>& operator*() const
Chris@16 187 {
Chris@16 188 return dereference();
Chris@16 189 }
Chris@16 190
Chris@16 191 /// Dereference an iterator.
Chris@16 192 const basic_resolver_entry<InternetProtocol>* operator->() const
Chris@16 193 {
Chris@16 194 return &dereference();
Chris@16 195 }
Chris@16 196
Chris@16 197 /// Increment operator (prefix).
Chris@16 198 basic_resolver_iterator& operator++()
Chris@16 199 {
Chris@16 200 increment();
Chris@16 201 return *this;
Chris@16 202 }
Chris@16 203
Chris@16 204 /// Increment operator (postfix).
Chris@16 205 basic_resolver_iterator operator++(int)
Chris@16 206 {
Chris@16 207 basic_resolver_iterator tmp(*this);
Chris@16 208 ++*this;
Chris@16 209 return tmp;
Chris@16 210 }
Chris@16 211
Chris@16 212 /// Test two iterators for equality.
Chris@16 213 friend bool operator==(const basic_resolver_iterator& a,
Chris@16 214 const basic_resolver_iterator& b)
Chris@16 215 {
Chris@16 216 return a.equal(b);
Chris@16 217 }
Chris@16 218
Chris@16 219 /// Test two iterators for inequality.
Chris@16 220 friend bool operator!=(const basic_resolver_iterator& a,
Chris@16 221 const basic_resolver_iterator& b)
Chris@16 222 {
Chris@16 223 return !a.equal(b);
Chris@16 224 }
Chris@16 225
Chris@16 226 private:
Chris@16 227 void increment()
Chris@16 228 {
Chris@16 229 if (++index_ == values_->size())
Chris@16 230 {
Chris@16 231 // Reset state to match a default constructed end iterator.
Chris@16 232 values_.reset();
Chris@16 233 index_ = 0;
Chris@16 234 }
Chris@16 235 }
Chris@16 236
Chris@16 237 bool equal(const basic_resolver_iterator& other) const
Chris@16 238 {
Chris@16 239 if (!values_ && !other.values_)
Chris@16 240 return true;
Chris@16 241 if (values_ != other.values_)
Chris@16 242 return false;
Chris@16 243 return index_ == other.index_;
Chris@16 244 }
Chris@16 245
Chris@16 246 const basic_resolver_entry<InternetProtocol>& dereference() const
Chris@16 247 {
Chris@16 248 return (*values_)[index_];
Chris@16 249 }
Chris@16 250
Chris@16 251 typedef std::vector<basic_resolver_entry<InternetProtocol> > values_type;
Chris@16 252 boost::asio::detail::shared_ptr<values_type> values_;
Chris@16 253 std::size_t index_;
Chris@16 254 };
Chris@16 255
Chris@16 256 } // namespace ip
Chris@16 257 } // namespace asio
Chris@16 258 } // namespace boost
Chris@16 259
Chris@16 260 #include <boost/asio/detail/pop_options.hpp>
Chris@16 261
Chris@16 262 #endif // BOOST_ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP