#array #const-generics #split #family #push #append #pop

nightly no-std array-append

一组用于操作 const 泛型数组类型的函数

1 个不稳定版本

0.1.0 2022年5月15日

293无标准库

MIT 许可证

11KB
55

array-append

array-append 导出了一组用于操作 const 泛型数组类型的函数

  • concat 用于连接两个数组
  • push_rightpush_left 分别用于向数组的末尾或开头添加元素
  • splitsplit_end 用于将数组分割成两个数组
  • pop_rightpop_left 分别从数组中分离出最后一个或第一个元素

以及一些别名

  • push/pop 分别对应于 push_right/pop_right
  • unshift/shift 分别对应于 push_left/pop_left

由于使用了 #![feature(generic_const_exprs)],这个库需要 nightly 编译器。所有不安全代码都通过手动证明和 Miri 验证为安全。

这个库目前不需要标准库,但无论如何都会引入,除非禁用了 std 默认特性。这是为了向前兼容性,以防将来添加依赖于 std 的代码。

示例

创建一个无分配构建器

#![allow(incomplete_features)]
#![feature(generic_const_exprs)]

use array_append::push;

#[derive(PartialEq, Debug)]
struct Built<const N: usize> {
	whatever: [usize; N]
}

struct Builder<const N: usize> {
	whatever: [usize; N]
}

impl Builder<0> {
	pub fn new() -> Self {
		Self { whatever: [] }
	}
}

impl<const N: usize> Builder<N> {
	pub fn from_array(array: [usize; N]) -> Self {
		Self { whatever: array }
	}

	pub fn with_usize(self, new: usize) -> Builder<{N + 1}> {
		// Can't use `Self` here, because `Self` is `Builder<N>`
		Builder { whatever: push(self.whatever, new) }
	}

	pub fn build(self) -> Built<N> {
		Built { whatever: self.whatever }
	}
}

assert_eq!(
	Builder::new()
		.with_usize(1)
		.with_usize(2)
		.with_usize(3)
		.build(),
	Builder::from_array([1, 2, 3]).build()
);

无运行时依赖

功能