#forest #structure #adobe #iterator #node #stlab

skog

Adobe 的 stlab::forest 数据结构的 Rust 实现

1 个不稳定版本

0.1.0 2021 年 12 月 7 日

#1097 in 数据结构

MIT 许可证

25KB
643

skog

瑞典语意为“森林”。Adobe 的 stlab::forest 数据结构的纯 Rust 实现。

简介

“森林”是一种类似树的数据结构。参考 Adobe stlab 的森林教程

森林是一种基于节点(双向)的数据结构,用于表示层次结构。节点之间的父子关系在容器类中维护,因此可以存储任何常规类型而不影响它。它配备了一系列强大的迭代器,用于遍历层次结构的多种方法,以下将分别描述。

教程本身对基本用法有很好的解释,合著者 Foster Brereton 的 介绍文章 对森林数据结构的结构有很好的洞察。

特别是,森林数据结构是序列化树状数据的优秀工具。《dirs》示例提供了一个简单的演示。

克隆 Adobe 的 stlab 仓库

git clone https://github.com/stlab/libraries.git
cd libraries

运行 dirs 对仓库进行操作

cargo run --example dirs -- $PWD/stlab

它将打印目录结构为 xml 格式

<stlab>
	<cmake>
		<stlab>
			<coroutines>
			</coroutines>
			<development>
			</development>
		</stlab>
	</cmake>
	<stlab>
		<concurrency>
		</concurrency>
		<algorithm>
		</algorithm>
		<test>
		</test>
		<iterator>
		</iterator>
	</stlab>
	<test>
	</test>
</stlab>

游标

由于 Rust 的更严格的所有权模型,无法安全地直接暴露 C++ 迭代器的直接翻译。相反,此 crate 采取了与 Rust 的 LinkedList 提出的相同方法 并引入了“游标”类型。

与 Rust 的迭代器不同,它可以自由地前后移动,并位于森林中的两个节点之间。此外,它还跟踪节点的“边缘”,因此与 C++ 森林迭代器的语义类似。

状态

这是一个非常早期的版本,还需要进行很多测试。

与原始的 C++ 版本相比,API 也已经大幅精简到最基本的要素,这主要是由于 Rust 的所有权模型带来的挑战。但是,为了避免发布一个高度实验性的 API,它在未来的变化可能性很大,我选择发布一个更小但更稳定的 API,我相信即使是在 1.0 版本发布后也不会发生变化。

在当前状态下,我预计未来 API 的唯一变化是将 sizeself 参数从可变引用更改为不可变引用。目前它是一个可变引用,以便在此实现中与 C++ 实现相同,如果检测到内部 size 成员已过时,则可以修改它。

无运行时依赖