#nibble #packed #bit

halfling

一组用于处理半字节的基本实用程序

11 个不稳定版本 (3 个重大变更)

0.4.1 2024年5月11日
0.4.0 2024年5月11日
0.3.0 2024年4月21日
0.2.1 2024年2月4日
0.1.4 2023年12月28日

#733 in 编码


quadboard 中使用

MIT 许可证

22KB
431

Halfling

一组用于处理 半字节 的基本实用程序。

用法

halfling 的核心类型是 Nibble,它实际上是一个围绕 u8 的包装器,保证它始终小于16。

// nibbles can be constructed safely with Nibble::new
let valid_nibble = Nibble::new(10);     // returns Some(10)
let invalid_nibble = Nibble::new(16);   // returns None

// if you already know a value to be less than 16, you can use Nibble::new_unchecked
let quick_nibble = unsafe { Nibble::new_unchecked(6) };
// using Nibble::new_unchecked with a value greater than 16 is undefined behaviour

由于 Rust 中内存的最小单位是字节,因此无法使用多余的位来构造 Nibble。但是,可以通过一些枚举技巧告诉编译器哪些 u8 值是有效的 Nibble 值,因此其他240个值可以作为空位使用。

// a Nibble is a byte-width struct
assert_eq!(std::mem::size_of<Nibble>(), 1);

// because Nibble has well-defined niches, Option<Nibble> is also byte-width
assert_eq!(std::mem::size_of<Nibble>(), std::mem::size_of<Option<Nibble>>());

// currently, it seems like rustc can't apply the same optimisation to non-unit enum variants
assert_eq!(std::mem::size_of<Result<Nibble, Nibble>>(), 2)

依赖项

~280–740KB
~17K SLoC