2015-11-25 20:05:11 +00:00
|
|
|
use std::{mem, slice};
|
2015-11-19 18:29:42 +00:00
|
|
|
|
2015-11-20 12:34:54 +00:00
|
|
|
#[inline(always)]
|
2015-11-19 18:29:42 +00:00
|
|
|
pub unsafe fn as_bytes<T>(obj: &T) -> &[u8] {
|
|
|
|
slice::from_raw_parts(mem::transmute::<&T, *const u8>(obj), mem::size_of::<T>())
|
|
|
|
}
|
|
|
|
|
2015-11-20 12:34:54 +00:00
|
|
|
#[inline(always)]
|
2015-11-19 18:29:42 +00:00
|
|
|
pub unsafe fn as_obj<T>(data: &[u8]) -> &T {
|
|
|
|
assert!(data.len() >= mem::size_of::<T>());
|
|
|
|
mem::transmute(data.as_ptr())
|
|
|
|
}
|
2015-11-22 23:49:58 +00:00
|
|
|
|
2015-11-25 11:29:12 +00:00
|
|
|
macro_rules! fail {
|
|
|
|
($format:expr) => ( {
|
|
|
|
use std::process;
|
|
|
|
error!($format);
|
|
|
|
process::exit(-1);
|
|
|
|
} );
|
|
|
|
($format:expr, $( $arg:expr ),+) => ( {
|
|
|
|
use std::process;
|
|
|
|
error!($format, $( $arg ),+ );
|
|
|
|
process::exit(-1);
|
|
|
|
} );
|
|
|
|
}
|
|
|
|
|
|
|
|
macro_rules! try_fail {
|
|
|
|
($val:expr, $format:expr) => ( {
|
|
|
|
match $val {
|
|
|
|
Ok(val) => val,
|
|
|
|
Err(err) => fail!($format, err)
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
($val:expr, $format:expr, $( $arg:expr ),+) => ( {
|
|
|
|
match $val {
|
|
|
|
Ok(val) => val,
|
|
|
|
Err(err) => fail!($format, $( $arg ),+, err)
|
|
|
|
}
|
|
|
|
} );
|
|
|
|
}
|