#key #map #generate-keys #storage #arena

provenance

在插入时生成键的容器结构,该键仅与生成它的映射一起使用

1 个不稳定版本

0.1.0 2021年1月12日

#2122 in 数据结构

MIT 许可证

24KB
143

数据溯源

一个Rust库,它提供了在插入时生成键的容器。这个键只能与生成它的映射一起使用。

使用库

将以下内容添加到您的 Cargo.toml

[dependencies]
provenance = "0.1.0"

示例

use provenance::ProvenanceMap;

fn main() {
    let ages = ProvenanceMap::<u32>::new().unwrap();
    let names = ProvenanceMap::<String>::new().unwrap();
    
    let middle_age: Key<u32> = ages.insert(40); // Key generated on insert
    assert_eq!(&40, ages.get(middle_age)); // Key is used to retrieve stored value
    
    // names.get(middle_age); // Compile error, key can only be used with it's map
}

lib.rs:

这个库提供了容器,其中键保证是有效的。键是在值被插入容器时生成的。该键仅保证与生成它的映射一起使用,并在该容器内始终引用相同的值。

use provenance::ProvenanceMap;

// A new map is easily created
let mut map = ProvenanceMap::<i32>::new().unwrap();

// Inserting a value into the map returns a key
let key = map.insert(5);

// That key is guaranteed to be able retrieve that value
assert_eq!(&5, map.get(key));
// Notice that the retrieved value is not wrapped in an Option or Result

使用未创建该键的映射的键是编译时错误

use provenance::ProvenanceMap;

let mut map1 = ProvenanceMap::<i32>::new().unwrap();
let mut map2 = ProvenanceMap::<bool>::new().unwrap();

let key = map1.insert(5);
map2.get(key); // Using a key generated by map1 with map2 is a compilation error

映射唯一性

为了能够保证只有由映射创建的键可以与该映射一起使用,每个映射和键都有一个类型参数,专门用来表示 provenance。然而,对于每个provenance,可能只有一个唯一的映射,因此创建映射可能会失败。

use provenance::ProvenanceMap;

// Creating a map is ok
let map = ProvenanceMap::<i32>::new();
assert!(map.is_some());

// Creating another with the same provenance is not
let map = ProvenanceMap::<i32>::new();
assert!(map.is_none()); // Creation failed and `None` were returned

轻量级键

这个库的映射生成的键是轻量级的,这意味着它们是可复制的。这意味着其他可复制的值可以链接到不可复制的值,而不用担心生命周期。

use provenance::{Key, ProvenanceMap};
use std::ops::Add;

struct Currency { name: String }

#[derive(Copy, Clone)]
struct Money { amount: i32, currency: Key<Currency> }
impl Add for Money {
    type Output = Money;

    fn add(self, rhs: Self) -> Self::Output {
        Money {
            amount: self.amount + rhs.amount,
            currency: self.currency,
        }
    }
}

let mut currencies = ProvenanceMap::<Currency>::new().unwrap();
let sek = currencies.insert(Currency { name: "Swedish Krona".into() });

let mon1 = Money { amount: 5, currency: sek };
let mon2 = Money { amount: 10, currency: sek };
let sum = mon1 + mon2;

assert_eq!(sek, sum.currency);
assert_eq!("Swedish Krona".to_string(), currencies.get(sum.currency).name);

依赖关系

~10KB