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
use std::collections::LinkedList; use std::ops::Index; struct AssocList<K, V> { storage: LinkedList<(K, Option<V>)> } impl<K: Eq + Clone, V> AssocList<K, V> { fn new() -> AssocList<K, V> { AssocList{storage: LinkedList::new()} } fn insert(&mut self, k: K, v: V) { self.storage.push_front((k, Some(v))); } fn len(&self) -> usize { self.storage.len() } fn get(&self, k: &K) -> Option<&V> { for &(ref key, ref value_option) in &self.storage { if let Some(ref value) = *value_option { if *key == *k { return Some(value); } } return None } None } fn contains_key(&self, k: &K) -> bool { match self.get(k) { Some(_) => true, None => false, } } fn remove(&mut self, k: &K) { self.storage.push_front(((*k).clone(), None)); } } impl<K: Eq + Clone, V> Index<K> for AssocList<K, V> { type Output = V; fn index<'a>(&'a self, index: K) -> &'a V { self.get(&index).expect("key not found") } } #[test] fn it_works() { let map: AssocList<String, String> = AssocList::new(); } #[test] fn insert_works() { let mut map = AssocList::new(); assert!(map.insert("name", "John Smith") == ()); } #[test] fn contains_key_works() { let mut map = AssocList::new(); map.insert("name", "John Smith"); assert!(map.contains_key(&"name") == true); assert!(map.contains_key(&"missing key") == false); } #[test] fn len_works() { let mut map = AssocList::new(); assert!(map.len() == 0); map.insert("name", "John Smith"); assert!(map.len() == 1); } #[test] fn get_works() { let mut map = AssocList::new(); assert!(map.get(&"name") == None); map.insert("name", "John Smith"); assert!(map.get(&"name") == Some(&"John Smith")); } #[test] fn index_works() { let mut map = AssocList::new(); map.insert("name", "John Smith"); assert!(map["name"] == "John Smith"); } #[test] fn remove_works() { let mut map = AssocList::new(); map.insert("name", "John Smith"); assert!(map.remove(&"name") == ()); println!("{:?}", map.get(&"name")); assert!(map.get(&"name") == None); }