Класс Boost Asio basic_waitable_timer
(также входит в C ++ Networking TS), принимает параметр шаблона 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_point& 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_point& t)
{
const typename Clock::time_point now = Clock::now();
return (t > now) ? (t - now) : Clock::duration::zero();
}
Но ... то, что делает настоящий исходный код Boost, меня очень смущает.Что на самом деле делает реализация Boost по умолчанию wait_traits
?