#cache #mutation #version #invalidation

versioned

提供了一种类似指针的包装器,用于计数突变

1 个不稳定版本

0.1.0 2020 年 8 月 29 日

#326缓存

MIT/Apache

13KB
157

docs.rs Build Status

versioned

这个小巧的crate仅提供了类似指针的Versioned<T>包装器,该包装器计算其包含的T值被可变访问的次数。

当基于对象缓存某些计算结果时,这可能很有用,这些对象比较或哈希开销很大,例如大型集合。在这种情况下,存储对象版本并在以后检查是否发生变化可能更方便。

use versioned::Versioned;

let mut versioned_value = Versioned::new("Hello".to_string());

assert_eq!(versioned_value.version(), 0, "version is 0 initially");

// This is an immutable dereference, so it won't change the version.
let value_len = versioned_value.len();

assert_eq!(versioned_value.version(), 0, "version is unchanged after immutable access");

// Now we mutate the value twice.
versioned_value.push_str(" ");
versioned_value.push_str("World!");

assert_eq!(*versioned_value, "Hello World!");
assert_eq!(versioned_value.version(), 2, "version got incremented once per mutable access");

Versioned<T>实现了DerefAsRef及其Mut对应物。特别是,由于Deref转换Versioned<T>值可以作为&T&mut T参数传递给函数

use versioned::Versioned;

fn look_at(value: &String) {}
fn modify(value: &mut String) {}

let mut versioned_value = Versioned::new("blabla".to_string());

look_at(&versioned_value);
assert_eq!(versioned_value.version(), 0);

modify(&mut versioned_value);
assert_eq!(versioned_value.version(), 1, "version increased due to mutable dereference");

注意上述示例中,由于突变是基于可变解析引用来计数的,因此在调用modify()时版本增加,尽管最终没有对值本身进行突变。

无运行时依赖项