pi_gray/
lib.rs

1extern crate fnv;
2
3use fnv::FnvHashMap;
4
5pub trait GrayVersion {
6    fn get_gray(&self) -> &Option<usize>;
7    fn set_gray(&mut self, g: Option<usize>);
8    fn get_id(&self) -> usize;
9}
10
11pub trait Gray {}
12
13/**
14* 灰度表
15*/
16pub struct GrayTab<T: Gray> {
17    last: usize,
18    tab: FnvHashMap<usize, T>,
19}
20
21impl<T: Gray> GrayTab<T> {
22    //构建一个灰度表
23    pub fn new(first: T) -> Self {
24        let mut map = FnvHashMap::default();
25        map.insert(0, first);
26        GrayTab { last: 0, tab: map }
27    }
28
29    //取灰度
30    pub fn get(&self, version: &usize) -> Option<&T> {
31        self.tab.get(version)
32    }
33
34    //添加一个灰度
35    pub fn add(&mut self, gray: T) -> usize {
36        self.last += 1;
37        self.tab.insert(self.last, gray);
38        self.last
39    }
40
41    //移除灰度, 如果移除后
42    pub fn remove(&mut self, version: &usize) -> Option<T> {
43        //如果灰度列表中只存在一个灰度,则不能移除
44        match self.last {
45            0 => {
46                println!("The only gray cannot be removed");
47                return None;
48            }
49            _ => (),
50        };
51
52        //如果移除灰度版本未最新版本, 则更新最新版本未前一版本
53        match version == &self.last {
54            true => self.version_back(),
55            false => (),
56        }
57        self.tab.remove(version)
58    }
59
60    //取到最新灰度
61    pub fn get_last(&self) -> &T {
62        self.tab.get(&self.last).unwrap()
63    }
64
65    fn version_back(&mut self) {
66        self.last = self.last - 1;
67        match self.tab.get(&self.last) {
68            Some(_) => (),
69            None => self.version_back(),
70        }
71    }
72}