2 个版本 (1 个稳定版)
1.0.0 | 2024 年 6 月 24 日 |
---|---|
0.8.0 | 2024 年 6 月 24 日 |
0.7.0 |
|
0.4.0 |
|
0.3.0 |
|
在 Rust 模式 中排名第 436
每月下载量 28 次
135KB
1K SLoC
cove
Casts Of Varying Elegance
提供一组扩展特质,以改进数值类型转换的安全性和可维护性。Cove 的主要目标是
- 清晰性:从名称中可以清楚地看出转换的意图
- 正确性:通过
as
进行可疑的转换可以减少或完全消除 - 性能:在发布版本中,cove 的转换通常编译为与手动实现相同的汇编代码
- 独立性:无任何依赖项,唯一的可选依赖项是
std
快速使用
use cove::prelude::*;
use core::num::{NonZeroI8, NonZeroI32, NonZeroI64, NonZeroU16, NonZeroU64};
// Check whether a cast is lossy at runtime
assert_eq!(8i16.cast::<u8>()?, 8u8);
assert!(0u128.cast::<NonZeroI8>().is_err());
// Of course, turbofish disambiguation is unnecessary if the compiler can deduce the type:
fn foo(x: u8) -> u8 {x}
assert_eq!(foo(2i16.cast()?), 2u8);
// If the cast ends up being lossy, you can usually still use the lossy value if you like:
assert_eq!(9.2f64.cast::<usize>().unwrap_err().to, 9usize);
// ...or more concisely:
assert_eq!(9.2f64.cast::<usize>().lossy(), 9usize);
// Perhaps you don't mind if the cast is lossy, but you'd like to get as close as possible:
assert_eq!(300u32.cast::<u8>().closest(), 255u8);
assert_eq!((-7isize).cast::<u16>().closest(), 0u16);
assert_eq!(-4.6f32.cast::<i16>().closest(), -5i16);
assert_eq!(-0.0f64.cast::<NonZeroI32>().closest(), NonZeroI32::new(-1).unwrap());
// If you are supremely confident a cast is lossless you can always use unwrap_unchecked:
assert_eq!(unsafe {90u32.cast::<u8>().unwrap_unchecked()}, 90);
// ...but if the unsafeness makes you uncomfortable you might prefer cove's assumed_lossless,
// which will use a debug_assert instead of unsafe (and just risk lossiness in release builds):
assert_eq!(90u32.cast::<u8>().assumed_lossless(), 90);
// If desired, you can instead preserve bits (rather than mathematical value) across a cast:
assert_eq!(NonZeroI64::new(-1).unwrap().cast::<u64>().bitwise(), u64::MAX);
assert_eq!(10f32.cast::<u32>().bitwise(), 1_092_616_192u32);
// If the types guarantee a lossless cast, you can of course always use `From`/`Into`:
assert_eq!(NonZeroU64::from(NonZeroU16::new(12).unwrap()), NonZeroU64::new(12).unwrap());
// ...but what if those traits aren't provided because the cast could be lossy on some other
// platform? If you don't mind losing portability, try out cove's `lossless`. This will only
// compile on platforms where usize is at least 64 bits:
assert_eq!(31u64.cast::<usize>().lossless(), 31usize);
功能
Cove 支持一个功能,即 std
,它包含在默认功能中。启用此功能(或者更确切地说,不禁用它)将启用对 Rust 标准库的支持。如果禁用此功能,cove 仅依赖于 Rust 核心库。启用 std
会导致 cove 的错误类型实现 std::error::Error
;否则不会实现,因为撰写本文时 core::error::Error
是不稳定的。此外,一些转换实现由该功能控制,因为 Rust 标准库允许通过内联函数进行优化,这些内联函数在稳定版本中不可用。
链接
- 了解如何使用 cove 的
casts
- 了解 cove 转换的泛型
bounds
- 了解如何将 cove 的转换扩展到新类型
extending
- 了解cove背后的
motivation
- 了解使用cove时的
performance
考虑因素 - 了解与cove一起的
testing
考虑因素