История изменений
Исправление zurg, (текущая версия) :
Замечательно в расте с этим дела, язык всё-таки не на коленке сочиняли, например, можно как-то так:
trait MakeFromHalfs<Out>
where Out: Add<Output=Out> + Shl<usize, Output=Out> + Sized,
Self: Into<Out> + Sized,
{
fn add_low_half(self, lo: Self) -> Out {
const {
assert!( size_of::<Out>() == 2*size_of::<Self>())
};
let shift = 8*size_of::<Self>();
(self.into()<<shift) + lo.into()
}
}
impl MakeFromHalfs<u32> for u16 {}
impl MakeFromHalfs<u64> for u32 {}
pub fn main(){
dbg!( 0u32.add_low_half(u32::MAX) );
dbg!( u16::MAX.add_low_half(u16::MAX) );
}
[/app/example.rs:21:5] 0u32.add_low_half(u32::MAX) = 4294967295
[/app/example.rs:22:5] u16::MAX.add_low_half(u16::MAX) = 4294967295
https://godbolt.org/z/eshx1eqnb .
Точно ничего ни с чем не перепутаешь, включая типы, обобщённо и эффективно. Торвальдс таки шарит за новые языки на каких следует ядро разрабатывать
Исходная версия zurg, :
Замечательно в расте с этим дела, язык всё-таки не на коленке сочиняли, например, можно как-то так:
trait MakeFromHalfs<Out>
where Out: Add<Output=Out> + Shl<usize, Output=Out> + Sized,
Self: Into<Out> + Sized,
{
fn add_low_half(self, lo: Self) -> Out {
const {
assert!( size_of::<Out>() == 2*size_of::<Self>())
};
let shift = 8*size_of::<Self>();
(self.into()<<shift) + lo.into()
}
}
impl MakeFromHalfs<u32> for u16 {}
impl MakeFromHalfs<u64> for u32 {}
pub fn main(){
dbg!( 0u32.add_low_half(u32::MAX) );
dbg!( u16::MAX.add_low_half(u16::MAX) );
}
[/app/example.rs:21:5] 0u32.add_low_half(u32::MAX) = 4294967295
[/app/example.rs:22:5] u16::MAX.add_low_half(u16::MAX) = 4294967295
https://godbolt.org/z/eshx1eqnb .
Точно ничего ни с чем не перепутаешь, включая типы.