#version #tracking #cache #data-structures

version-track

用于跟踪复杂数据变化的库,当直接比较或哈希计算过于昂贵时

2 个版本 (1 个稳定版)

1.0.0 2024年7月21日
0.1.0 2022年11月30日

#9 in #tracking

Download history 32/week @ 2024-04-23 40/week @ 2024-04-30 23/week @ 2024-05-07 18/week @ 2024-05-14 24/week @ 2024-05-21 400/week @ 2024-05-28 302/week @ 2024-06-04 137/week @ 2024-06-11 45/week @ 2024-06-18 122/week @ 2024-06-25 37/week @ 2024-07-02 17/week @ 2024-07-09 222/week @ 2024-07-16 46/week @ 2024-07-23 100/week @ 2024-07-30 30/week @ 2024-08-06

405 次每月下载
3 个crate中(直接使用2个) 中使用

ISC 许可证

23KB
268 行代码

Crates.io docs GitHub license Coverage Status Minimum rustc version

版本跟踪

这个简单的crate提供了一个简单的方法来跟踪和比较直接比较过于昂贵的值的更改。这个crate将跟踪值的可变更改,并在每次修改时自动增加版本号。任何比较都将比较内部版本号,而不是需要对复杂的数据结构进行完全比较。

跟踪是通过两个值进行的,第一个是一个V4 uuid::Uuid,第二个是一个usize 计数器。对于每个要跟踪的值,uuid::Uuid 只生成一次¹,然后每次后续的可变引用访问都会增加计数器。这允许独立跟踪多个不同的值,使用 uuid::Uuid 跟踪跨增加的不同值,并使用计数器跟踪值的直接更改。

该crate提供了两种跟踪版本的方法。第一种方法是通过围绕另一个值创建一个指针样式的包装器。这是使用此crate的最简单方法,但有时可能导致不必要的额外版本增加。为了解决这个问题,可以手动创建一个版本跟踪器,并将其作为结构体上的字段添加或单独存储。

¹ 如果 usize 计数器回绕到零,则可以重新生成 uuid::Uuid 值。

安装和用法

[dependencies]
version-track = "0.1.0"

基本示例

任何值都可以用 Versioned<T> 包装,因为 Versioned<T> 实现了 std::ops::Derefstd::ops::DerefMutstd::convert::AsRefstd::convert::AsMut,所以包装的值可以用于大多数可以包装值的地方。

use version_track::Versioned;

let mut tracked_value = Versioned::new(String::from("foo"));
let current_version = tracked_value.version();
tracked_value.push_str("bar");

assert_ne!(current_version, tracked_value.version());
assert_eq!(*tracked_value, "foobar");

直接使用示例

有时需要更多的版本控制,或者无法对要跟踪的值进行包装。在这些情况下,可以直接使用[版本]。在这种情况下,开发者需要决定何时发生更改。这可以用于仅跟踪值的一些修改,或者在需要多个可变引用时只递增一次。

use version_track::Version;

let mut value = String::from("foo");
let mut version = Version::new();
let current_version = version;

value.push_str("bar");
version.increment();

assert_ne!(current_version, version);
assert_eq!(value, "foobar");

支持的Rust版本

此项目将支持从1.60.0开始的Rust版本。

放弃对Rust版本的支持将导致主要版本号的增加,遵循语义版本控制

许可证

版本跟踪是在ISC许可证下发布的。请参阅LICENSE

依赖关系

~540KB