20 #ifndef RIPPLE_PEERFINDER_CHECKER_H_INCLUDED
21 #define RIPPLE_PEERFINDER_CHECKER_H_INCLUDED
23 #include <ripple/beast/net/IPAddressConversion.h>
24 #include <boost/asio/detail/handler_invoke_helpers.hpp>
25 #include <boost/asio/io_service.hpp>
26 #include <boost/asio/ip/tcp.hpp>
27 #include <boost/intrusive/list.hpp>
28 #include <boost/system/error_code.hpp>
35 namespace PeerFinder {
38 template <
class Protocol = boost::asio::ip::tcp>
45 : boost::intrusive::list_base_hook<
46 boost::intrusive::link_mode<boost::intrusive::normal_link>>
57 template <
class Handler>
69 boost::asio::io_service& io_service,
83 using list_type =
typename boost::intrusive::make_list<
85 boost::intrusive::constant_time_size<true>>::type;
94 explicit Checker(boost::asio::io_service& io_service);
121 template <
class Handler>
127 remove(basic_async_op& op);
132 template <
class Protocol>
133 template <
class Handler>
136 boost::asio::io_service& io_service,
139 , socket_(io_service)
140 , handler_(
std::forward<Handler>(handler))
144 template <
class Protocol>
145 template <
class Handler>
151 template <
class Protocol>
152 template <
class Handler>
160 template <
class Protocol>
161 template <
class Handler>
170 template <
class Protocol>
176 template <
class Protocol>
182 template <
class Protocol>
190 for (
auto& c : list_)
195 template <
class Protocol>
200 while (!list_.empty())
204 template <
class Protocol>
205 template <
class Handler>
211 auto const op = std::make_shared<async_op<Handler>>(
212 *
this, io_service_, std::forward<Handler>(handler));
215 list_.push_back(*op);
217 op->socket_.async_connect(
219 std::bind(&basic_async_op::operator(), op, std::placeholders::_1));
222 template <
class Protocol>
227 list_.erase(list_.iterator_to(op));
228 if (list_.size() == 0)