1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
extern crate serde; #[macro_use] extern crate serde_derive; #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct BestMapNonEmpty<K: PartialOrd, V> { key: K, value: V, len: usize, } impl<K: PartialOrd, V> BestMapNonEmpty<K, V> { pub fn new(key: K, value: V) -> Self { BestMapNonEmpty { key: key, value: value, len: 1, } } pub fn insert_gt(&mut self, key: K, value: V) { if key > self.key { self.key = key; self.value = value; } self.len += 1; } pub fn insert_ge(&mut self, key: K, value: V) { if key >= self.key { self.key = key; self.value = value; } self.len += 1; } pub fn get(&self) -> (&K, &V) { (&self.key, &self.value) } pub fn key(&self) -> &K { &self.key } pub fn value(&self) -> &V { &self.value } pub fn into(self) -> (K, V) { (self.key, self.value) } pub fn into_key(self) -> K { self.key } pub fn into_value(self) -> V { self.value } pub fn len(&self) -> usize { self.len } } #[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct BestMap<K: PartialOrd, V> { non_empty: Option<BestMapNonEmpty<K, V>>, } impl<K: PartialOrd, V> BestMap<K, V> { pub fn new() -> Self { Self { non_empty: None, } } pub fn insert_gt(&mut self, key: K, value: V) { if let Some(non_empty) = self.non_empty.as_mut() { non_empty.insert_gt(key, value); return; } self.non_empty = Some(BestMapNonEmpty::new(key, value)); } pub fn insert_ge(&mut self, key: K, value: V) { if let Some(non_empty) = self.non_empty.as_mut() { non_empty.insert_ge(key, value); return; } self.non_empty = Some(BestMapNonEmpty::new(key, value)); } pub fn get(&self) -> Option<(&K, &V)> { self.non_empty.as_ref().map(BestMapNonEmpty::get) } pub fn key(&self) -> Option<&K> { self.non_empty.as_ref().map(BestMapNonEmpty::key) } pub fn value(&self) -> Option<&V> { self.non_empty.as_ref().map(BestMapNonEmpty::value) } pub fn into(self) -> Option<(K, V)> { self.non_empty.map(BestMapNonEmpty::into) } pub fn into_key(self) -> Option<K> { self.non_empty.map(BestMapNonEmpty::into_key) } pub fn into_value(self) -> Option<V> { self.non_empty.map(BestMapNonEmpty::into_value) } pub fn len(&self) -> usize { self.non_empty.as_ref().map(BestMapNonEmpty::len).unwrap_or(0) } }