#unsafe #convert #unchecked

no-std uncon

类型之间未检查转换的特质

2个稳定版本

使用旧的Rust 2015

1.1.0 2017年9月18日
1.0.0 2017年9月11日

#319无标准库


3 crate 中使用

MIT/Apache

13KB
156

uncon Crates.io 下载 构建状态

Rust中类型之间未检查转换的特质。

文档

变更记录

有关 unconuncon_derive 的单独变更记录可供查看。

尽管它们的版本号可能不同,但 uncon_derive 总是与 uncon 的当前主要版本兼容。

安装

此crate可在 crates.io 上找到,可以通过将以下内容添加到项目的 Cargo.toml 中来使用:

[dependencies]
uncon = "1.1.0"

# Derive:
uncon_derive = "1.0.3"

用法

此项目允许在满足所有必要的不变量假设的情况下在类型之间进行转换。

例如,Value 实例必须具有从 0 到 2 的位模式。

#[macro_use]
extern crate uncon_derive;
extern crate uncon;

use uncon::*;

#[derive(FromUnchecked, PartialEq)]
#[repr(u8)]
enum Value {
    X, Y, Z
}

fn main() {
    let v = unsafe { Value::from_unchecked(2) };
    assert_eq!(v, Value::Z);

    // Undefined behavior:
    let u = unsafe { Value::from_unchecked(3) };
}

为了允许安全(但可能较慢)的转换,也可以通过 From<T> 通过 FromUnchecked<T> 实现,其中使用掩码或其他操作来使输入值有效

impl From<u8> for Value {
    fn from(bits: u8) -> Value {
        unsafe { Value::from_unchecked(bits % 3) }
    }
}

一些类型 已经默认实现了 FromUnchecked

定义行为

此项目不是通过创建混乱来逃避 未定义行为 的借口。这些操作仅应在速度至关重要且绝对确定不会导致奇怪行为的情况下执行。

不要总是求助于 mem::transmute。通常有 替代方案这里 是应避免它的原因列表。

许可证

此项目可在您选择的情况下发布为以下许可证之一:

任选其一。

无运行时依赖项

功能