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
13pub struct GrayTab<T: Gray> {
17 last: usize,
18 tab: FnvHashMap<usize, T>,
19}
20
21impl<T: Gray> GrayTab<T> {
22 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 pub fn get(&self, version: &usize) -> Option<&T> {
31 self.tab.get(version)
32 }
33
34 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 pub fn remove(&mut self, version: &usize) -> Option<T> {
43 match self.last {
45 0 => {
46 println!("The only gray cannot be removed");
47 return None;
48 }
49 _ => (),
50 };
51
52 match version == &self.last {
54 true => self.version_back(),
55 false => (),
56 }
57 self.tab.remove(version)
58 }
59
60 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}