use std::io;
use std::os::raw::c_ulong;
use std::time::Duration;
pub mod bt;
pub mod c;
pub trait IsZero {
fn is_zero(&self) -> bool;
}
macro_rules! impl_is_zero {
($($t:ident)*) => ($(impl IsZero for $t {
fn is_zero(&self) -> bool {
*self == 0
}
})*)
}
impl_is_zero! { i8 i16 i32 i64 isize u8 u16 u32 u64 usize }
pub fn cvt<I: IsZero>(i: I) -> io::Result<I> {
if i.is_zero() {
Err(io::Error::last_os_error())
} else {
Ok(i)
}
}
pub fn dur2timeout(dur: Duration) -> c_ulong {
dur.as_secs()
.checked_mul(1000)
.and_then(|ms| ms.checked_add((dur.subsec_nanos() as u64) / 1_000_000))
.and_then(|ms| {
ms.checked_add(if dur.subsec_nanos() % 1_000_000 > 0 {
1
} else {
0
})
})
.map(|ms| {
if ms > <c_ulong>::max_value() as u64 {
c::INFINITE
} else {
ms as c_ulong
}
})
.unwrap_or(c::INFINITE)
}