#key-value-store #ownership #items #full #lending #key-store #loans

lending-library

一种借出物品完全所有权的键值存储

6个版本

使用旧的Rust 2015

0.2.0 2019年3月19日
0.1.4 2018年5月9日
0.1.3 2018年4月26日

#1001数据结构

每月21次下载

Apache-2.0

29KB
547

借贷库

Travis Crates.io docs.rs

一种存储临时所有权的存储库。

这允许同时访问和/或修改存储库中独立的键。

示例

use lending_library::*;

struct Processor;
struct Item(String);

impl Item {
    fn gen(dat: &str) -> Self { Item(dat.to_string()) }
}

impl Processor {
    fn link(&self, _first: &Item, _second: &Item) {}
}

enum Event {
    Foo {
        id: i64,
        dat: &'static str,
    },
    Bar {
        id: i64,
        o_id: i64,
        o_dat: &'static str,
    }
}

const EVTS: &[Event] = &[Event::Foo {id:1, dat:"a_val"},
                         Event::Foo {id:2, dat:"b_val"},
                         Event::Bar {id:1, o_id: 2, o_dat:"B_val"},
                         Event::Bar {id:1, o_id: 3, o_dat:"c_val"}];

struct Store {
    id_gen: Box<Iterator<Item = i64>>,
    id_to_dat: LendingLibrary<i64, Item>,
}

impl Store {
    fn new() -> Self {
        Store {
            id_gen: Box::new(0..),
            id_to_dat: LendingLibrary::new(),
        }
    }

    pub fn declare(&mut self, uid: i64, dat: &str) -> Loan<i64, Item> {
        if !self.id_to_dat.contains_key(&uid) {
            self.id_to_dat.insert(uid, Item::gen(dat));
        }
        self.id_to_dat.lend(&uid).unwrap()
    }
}

fn main() {
    let mut store = Store::new();
    let pro = Processor;
    for evt in EVTS {
        match *evt {
            Event::Foo { id, dat } => {
                store.declare(id, dat);
            }
            Event::Bar { id, o_id, o_dat } => {
                let i = store.declare(id, "");
                let o = store.declare(o_id, o_dat);
                pro.link(&i, &o);
            }
        }
    }
}

无运行时依赖