15个不稳定版本 (4个重大变更)
0.5.0 | 2023年9月9日 |
---|---|
0.4.2 | 2023年8月6日 |
0.3.0 | 2021年2月20日 |
0.2.4 | 2020年11月19日 |
0.1.2 | 2020年5月28日 |
#623 在 算法
每月64次下载
在 3 crates 中使用
170KB
3.5K SLoC
toodee
TooDee
是围绕可增长 Vec
的高性能轻量级二维包装。
TooDeeView
和 TooDeeViewMut
允许你围绕切片创建二维包装。
核心功能
- 通过
data()
和data_mut()
获取对底层向量切片的原始访问。 - 使用
view()
和view_mut()
创建性能优异的二维子集。 get_unchecked(Coordinate)
和get_unchecked_row(usize)
用于更快(不安全)访问单元格或行。- 大多数操作都针对
TooDee
和TooDeeViewMut
结构体实现 - 下面将展示如何扩展此模式。 - 使用索引获取/设置特定单元格,例如,
let my_row = toodee[row]; my_row[col] = val;
。 - 如果您愿意,可以使用
Coordinate
进行索引,例如,toodee[(col, row)] = val
。 - 通过行索引(即,行主序)索引以访问行切片,例如,
&toodee[row]
。 - 迭代,任选方式 -
rows()
,rows_mut()
,col()
,col_mut()
,cells()
,cells_mut()
。 #[no_std]
兼容。- 可以从
&[T]
创建一个新的TooDeeView
,或者从一个&mut [T]
创建一个TooDeeViewMut
。 insert_col()
,remove_col()
,insert_row()
和remove_row()
具有良好性能的实现。
特性
copy
,默认包含
CopyOps
trait提供了在相同2D数组内复制数据或从一个数组复制到另一个数组的各种操作。其中许多操作命名与它们的切片对应项类似,例如copy_from_slice()
或copy_from_toodee()
。
translate
,默认包含
TranslateOps
trait提供了常见的转换算法,包括
translate_with_wrap()
,一种在垂直和水平方向上移动数据的方法。flip_rows()
,即关于中心行的数据镜像转换。flip_cols()
,即关于中心列的数据镜像转换。
sort
,默认包含
SortOps
trait提供了高效的实现,包括
sort_by_row()
操作,有稳定和不稳定的变体。sort_by_col()
操作,有稳定和不稳定的变体。
serde
,默认包含
对TooDee
对象的序列化和反序列化。可以序列化TooDeeView
和TooDeeViewMut
,但必须反序列化到TooDee
结构中。
构建您自己的2D算法
如SortOps
这样的trait包含额外的算法。这些trait通过扩展已经为TooDee
和TooDeeViewMut
实现过的TooDeeOpsMut
trait来定义。我建议采取同样的方法,因为这样您实现的算法将适用于这两个结构。此外,如果需要,可以覆盖trait的默认实现。
新trait的实现可能看起来像这样
pub trait FooOps<T> : TooDeeOpsMut<T> {
fn foo(&mut self) -> Bar {
...
return bar;
}
}
上面的代码将提供一个默认的 foo()
实现,如果需要可以覆盖。然后只需声明 TooDee
和 TooDeeOpsMut
都实现了 FooOps
impl<T> FooOps<T> for TooDeeViewMut<'_, T> {}
impl<T> FooOps<T> for TooDee<T> {}
一旦实现可用,只需调用方法即可,例如:
let bar = my_toodee.foo();
let bar_view = my_toodee_mut_view.foo();
编码愉快 😄
待办事项
- 路径查找算法?
- 图像/位图算法?!
动机
类似的库确实存在,但它们缺乏性能、灵活性或功能。
以下是一个小型功能比较表
存储顺序 | 支持的 Structs | 可增长? | 可变视图? | 原始数据访问? | 遍历行切片? | 备注 | |
---|---|---|---|---|---|---|---|
toodee::TooDee | 行主序 | 任何东西 (Sized ) | 是 | 是 | 是 | 是 | |
图像::ImageBuffer | 行主序 | 图像::像素 | 否 | 否 | 是 | 否 | 适用于图像处理 - 请参阅 imageproc 包。 |
图像::SubImage | 行主序 | 图像::像素 | 否 | 是 | 否 | 否 | |
网格::Grid | 行主序 | 克隆 | 是 | 否 | 是 | 否 | 与 TooDee 类似,但功能不那么丰富。 |
array2d::Array2D | 行主序 | 克隆 | 否 | 否 | 否 | 否 | |
imgref::Img | 行主序 | 任何东西 (Sized ) | 否 | 是 | 是 | 是 | |
nalgebra::矩阵 | 列主序 | 标量 | 是 | 是 | 是 | 否 | 用于向量/矩阵运算。 |
目标
- 高性能和良好的灵活性,但受限于使用 1-D 向量。
- 适用于图像处理,但不仅限于这个领域。
- 提供非平凡 2D 操作的稳定实现。
非目标
- GPU 集成
许可证
根据您的选择,许可为以下任一项:
- Apache License,版本 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的任何贡献,均应按上述方式双重许可,不得附加任何额外条款或条件。
依赖关系
~0.4–1MB
~23K SLoC