7 个稳定版本
使用旧的 Rust 2015
1.1.1 | 2017 年 10 月 28 日 |
---|---|
1.1.0 | 2017 年 9 月 18 日 |
#8 在 #unchecked
在 2 个crate中使用(通过 hexe_core)
14KB
159 行
uncon
在 Rust 类型之间提供未经检查的 conversions 的特性。
变更记录
有关 uncon
和 uncon_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