Time: Implement duration_cast from DeltaTimeval to std::chrono::duration
This will allow us to migrate step-by-step from DeltaTimeval to std::chrono.
This commit is contained in:
parent
2a32f75a24
commit
154b17d5f3
|
@ -247,7 +247,28 @@ struct posix_duration_cast<timeval, std::chrono::duration<Rep, Period>> {
|
|||
}
|
||||
};
|
||||
|
||||
// chrono -> DeltaTimeval caster
|
||||
template<typename Rep, typename Period>
|
||||
struct posix_duration_cast<std::chrono::duration<Rep, Period>, DeltaTimeval> {
|
||||
template<uint32 Prec>
|
||||
static DeltaTimeval cast(std::chrono::duration<Rep, Period> const &d) {
|
||||
typedef std::chrono::duration<int64, std::ratio<1, Prec>> fsec_t;
|
||||
DeltaTimeval res = {};
|
||||
|
||||
Seconds secs = std::chrono::duration_cast<Seconds>(d);
|
||||
fsec_t fsec = std::chrono::duration_cast<fsec_t, int64, std::ratio<1, Prec>>(d - secs);
|
||||
|
||||
res.positive = fsec >= Seconds::zero();
|
||||
res.delta = abs((secs + fsec).count());
|
||||
res.sec = secs.count();
|
||||
res.fsec = fsec.count();
|
||||
res.prec = Prec;
|
||||
|
||||
return res;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// chrono -> timeval
|
||||
template<typename T, typename Rep, typename Period>
|
||||
auto duration_cast(std::chrono::duration<Rep, Period> const &d)
|
||||
|
@ -260,6 +281,13 @@ template<typename Duration>
|
|||
Duration duration_cast(timeval const &tv) {
|
||||
return impl::posix_duration_cast<timeval, Duration>::cast(tv);
|
||||
}
|
||||
|
||||
// chrono -> DeltaTimeval
|
||||
template<typename T, uint32 Prec, typename Rep, typename Period>
|
||||
auto duration_cast(std::chrono::duration<Rep, Period> const &d)
|
||||
-> typename std::enable_if<std::is_same<T, DeltaTimeval>::value, DeltaTimeval>::type {
|
||||
return impl::posix_duration_cast<std::chrono::duration<Rep, Period>, DeltaTimeval>::template cast<Prec>(d);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue