#unsafe #convert #unchecked

无 std uncon_derive

为未经检查的转换特征提供推导功能

7 个稳定版本

使用旧的 Rust 2015

1.1.1 2017 年 10 月 28 日
1.1.0 2017 年 9 月 18 日

#8#unchecked


2 个crate中使用(通过 hexe_core

MIT/Apache

14KB
159

uncon Crates.io 下载 构建状态

在 Rust 类型之间提供未经检查的 conversions 的特性。

文档

变更记录

有关 unconuncon_derive 的单独变更记录可供参考。

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

安装

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

[dependencies]
uncon = "1.1.0"

# Derive:
uncon_derive = "1.1.1"

用法

此项目允许在 unsafe 假设满足所需的不变性的情况下在类型之间进行值转换。

例如,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。通常有替代方案。这里列出了一些避免使用它的原因

许可证

该项目可以在您选择的情况下发布

进行。

依赖关系

~1.5MB
~41K SLoC