#cast #conversion #from #into #no-std #convert #no-alloc

no-std cove

不同优雅程度的类型转换(COVE):数值类型的扩展特质

2 个版本 (1 个稳定版)

1.0.0 2024 年 6 月 24 日
0.8.0 2024 年 6 月 24 日
0.7.0 2024 年 6 月 13 日
0.4.0 2024 年 1 月 15 日
0.3.0 2023 年 9 月 13 日

Rust 模式 中排名第 436

每月下载量 28

MIT 许可证

135KB
1K SLoC

cove

Casts Of Varying Elegance

Crates.io MIT licensed Build Status Maintenace

提供一组扩展特质,以改进数值类型转换的安全性和可维护性。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考虑因素

无运行时依赖

功能