12 : m_client(std::make_unique<decltype(m_client)::element_type>(
13 std::move(endpoints))) {}
16 return m_client->init();
24 std::unique_lock l(m_mut);
25 constexpr auto fetch_threshold = 500;
26 if(m_tickets.size() < fetch_threshold && !m_fetching_tickets) {
27 auto res = fetch_tickets();
29 m_fetching_tickets =
true;
31 if(m_tickets.empty() && !res) {
35 if(m_tickets.empty()) {
36 m_callbacks.emplace(std::move(result_callback));
40 num = m_tickets.front();
48 auto client::fetch_tickets() ->
bool {
49 return m_client->call(
51 [
this](std::optional<get_ticket_number_return_type> res) {
52 assert(res.has_value());
53 std::visit(
overloaded{[&](ticket_number_range_type range) {
54 handle_ticket_numbers(range);
58 =
decltype(m_callbacks)();
60 std::unique_lock ll(m_mut);
61 m_fetching_tickets =
false;
62 callbacks.swap(m_callbacks);
64 while(!callbacks.empty()) {
73 void client::handle_ticket_numbers(ticket_number_range_type range) {
74 auto callbacks =
decltype(m_callbacks)();
75 auto tickets =
decltype(m_tickets)();
77 std::unique_lock ll(m_mut);
81 while(!m_tickets.empty() && !m_callbacks.empty()) {
82 callbacks.push(std::move(m_callbacks.front()));
84 tickets.push(m_tickets.front());
87 if(m_callbacks.empty()) {
88 m_fetching_tickets =
false;
90 auto fetch_res = fetch_tickets();
92 m_fetching_tickets =
false;
96 while(!callbacks.empty()) {
97 assert(!tickets.empty());