to_wait_duration с повышением asio

#c #boost #boost-asio

#c #повышение #повышение-asio

Вопрос:

Класс Boost Asio basic_waitable_timer (также входящий в сетевую TS C ) принимает параметр шаблона WaitTraits , который допускает пользовательское поведение с точки зрения преобразования duration и time_point значений в длительности ожидания.

В частности, ожидается, что WaitTraits класс будет иметь две перегрузки to_wait_duration . Ожидается, что перегрузка, которая принимает time_point значение, преобразует его в duration значение, которое имеет смысл для значения продолжительности ожидания, которое может быть передано функции ожидания / ожидания операционной системы.

Здесь реализована реализация по умолчанию, wait_traits<Clock> :

https://github.com/boostorg/asio/blob/develop/include/boost/asio/wait_traits.hpp

Однако, глядя на фактический исходный код реализации по умолчанию, я не могу понять, что to_wait_duration на самом деле делает. Вот код:

   static typename Clock::duration to_wait_duration(
      const typename Clock::time_pointamp; t)
  {
    typename Clock::time_point now = Clock::now();
    if (now   (Clock::duration::max)() < t)
      return (Clock::duration::max)();
    if (now   (Clock::duration::min)() > t)
      return (Clock::duration::min)();
    return t - now;
  }
  

Я понимаю, что идея здесь в том, чтобы взять time_point и преобразовать его в duration значение, которое, вероятно, будет передано какой-либо функции ожидания ОС. Таким образом, очевидным способом сделать это было бы просто вернуть t - Clock::now() . Конечно, вы также можете захотеть выполнить такие действия, как проверка на переполнение.

Но то, что, похоже, делает эта реализация, не имеет для меня никакого смысла. Во-первых, не будет ли выражение now Clock::duration::max() всегда вызывать переполнение целого числа со знаком, вызывая, таким образом, неопределенное поведение?? (Предполагая, что Clock::duration::rep это целочисленный тип со знаком, которым он был бы для стандартных chrono::duration типов). Во-вторых, я не могу сказать, чего пытается достичь эта функция. Почему он когда-либо возвращает Clock::duration::min() , которое обычно было бы отрицательным значением?

Я бы подумал, что to_wait_duration функция просто выполнит что-то вроде проверки, если t > Clock::now() , а если нет, просто вернет Clock::duration::zero() (поскольку отрицательная продолжительность ожидания никогда не имеет смысла). В принципе, что-то вроде:

    static typename Clock::duration to_wait_duration(const typename Clock::time_pointamp; t)
   {
     const typename Clock::time_point now = Clock::now();
     return (t > now) ? (t - now) : Clock::duration::zero();
   }
  

Но… то, что делает фактический исходный код Boost, меня очень смущает. Что на самом деле делает реализация Boost по умолчанию wait_traits ?