LINUX.ORG.RU

История изменений

Исправление 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 .

Точно ничего ни с чем не перепутаешь, включая типы.