#const-generics #array #utilities #generics

no-std array-utils

使用const generics的no-std堆数组工具集

3个不稳定版本

0.1.1 2021年3月23日
0.1.0 2021年3月23日
0.0.0 2021年3月23日

#1123 in 嵌入式开发

MIT 许可证

30KB
373

array-utils

这是一个no_std堆数组工具集,用于处理const generic数组。固定大小的数组以牺牲速度和方便性为代价换取简单性和可预测性。这主要用于非常低级别的平台或无堆的平台。这个crate将大大提高这些平台上的代码可读性和可维护性。

特性

这个crate提供了初始化、漂移、切片、调整大小、拼接、连接和叠加固定大小数组的函数。所有这些默认都是启用的特性,但也因此可以单独使用。让我们逐个来看一下这些特性。

这个crate只包含永远不会panic的函数。每个无效值都会导致数据截断或数组被填充额外的数据。每个函数的范围、特定行为和其他重要细节都在其页面中进行了说明。

初始化

这个特性提供了4个实用函数。这些是 initialize_frominitialize_tillinitialize_from_optioninitialize_from_result。所有这些函数都提供了一种使用闭包简化初始化大小数组的方法,如它们的文档所示。

漂移/叠加

有两个漂移函数,分别是 drift_to_begindrift_to_end,它们提供了一种将数组的一部分浮动的功能,可以是数组的开始或结束。这为将一些元素添加到数组的前面或后面提供了一个解决方案。这可以看作是 sized_slicesuperimpose 组合的一个更优化的快捷方式。还有一个更通用的形式 superimpose,它允许一个大小为定制的数组覆盖另一个数组。

切片 / 调整大小

普通的大小数组切片的缺点是可能会丢失大小元数据,或者需要附加 .try_into().unwrap(),这可能会导致崩溃。sized_slice 实用函数提供了一种处理大小数组切片的方式,永远不会崩溃。以类似的方式,处理缩放数组相当繁琐。array_resize 提供了一种简单的方法来处理所有截断或扩展数据,而不会发生崩溃。

拼接 / 连接

splicejoin 实用工具基本上是 sized_slicesuperimpose 的更优化的组合。在特定索引处拼接和连接数组可以非常方便地处理数据包和数据流。

用法

由于我们使用的是定制的数组,所以所有实用工具都严重依赖于 const generics。此外,所有函数仅针对具有 Copy 特性的类型实现。一些实用工具,即没有附加 fill 参数的函数,也依赖于 Default 特性。

以下是此 crate 用法的示例。

初始化

use array_utils::initialize_from;

// Use a closure which doubles the index
let even_numbers: [usize; 5] = initialize_from(|index| index * 2);
assert_eq!(even_numbers, [0, 2, 4, 6, 8]);

漂移

use array_utils::{ drift_to_begin, drift_to_end };

let array = [1, 2, 3, 0, 0, 0, 0];
// Float the elements with indices `0..` to the beginning with a margin of `1` elements,
// filling in `0x00` for all new elements.
assert_eq!(drift_to_begin(array, 0, 1, 0x00), [0, 1, 2, 3, 0, 0, 0]);

// Float the elements with indices `..3` to the end with a margin of `0` elements,
// filling in `42` for all new elements.
assert_eq!(drift_to_end(array, 3, 0, 42), [42, 42, 42, 42, 1, 2, 3]);

许可证

使用 MIT 许可证。

无运行时依赖

特性