#transmute #convert #cast #zero-copy

convute

在具有重叠有效位模式的数据类型之间以及数组和切片之间进行转换

3 个不稳定版本

0.2.0 2019年3月12日
0.1.1 2019年3月12日
0.1.0 2019年3月12日

#2853Rust 模式

Apache-2.0

20KB
504

crates.io docs.rs

目标

允许在具有重叠有效值的类型之间进行转换。

方法

我们通过不安全的标记特质 convute::marker::Transmuteconvute::marker::TryTransmute 实现,这些特质能够使值、引用、数组、vec 和切片之间进行转换。


lib.rs:

convute 的目的是允许您在具有重叠有效位模式相同大小的类型之间进行转换。为此,您必须在您的类型上实现不安全的 convute::marker::Transmuteconvute::marker::TryTransmute 特质。这些标记的妙处在于,我们可以推导出这些类型的数组、vec 和切片之间的转换。

// Import the traits which implement the conversions.
use convute::convert::*;

// This type represents a value in the range 0..9.
struct Lt9(u8);

impl Lt9 {
    #[inline]
    fn new(val: u8) -> Option<Self> {
        if val < 9 { Some(Lt9(val)) } else { None }
    }
}

// Let convute know every Lt9 is a valid u8.
unsafe impl convute::marker::Transmute<u8> for Lt9 {}

// Let convute know some u8 are valid Lt9.
unsafe impl convute::marker::TryTransmute<Lt9> for u8 {
    #[inline]
    fn can_transmute(&self) -> bool {
        Lt9::new(*self).is_some()
    }
}

fn main() {
    let numbers = [1, 6, 10, 5];
    let all_lt9: Result<[Lt9; 4], [u8; 4]> = numbers.try_transmute_each();
    // Because of the 10, the conversion will fail.
    assert!(all_lt9.is_err());
}

请查看 convert.rs 中的测试用例以获取更多示例。

无运行时依赖项