refactor(header): remove some lifetime transmutes for keys in VecMap
This commit is contained in:
		| @@ -4,12 +4,14 @@ pub struct VecMap<K, V> { | |||||||
| } | } | ||||||
|  |  | ||||||
| impl<K: PartialEq, V> VecMap<K, V> { | impl<K: PartialEq, V> VecMap<K, V> { | ||||||
|  |     #[inline] | ||||||
|     pub fn with_capacity(cap: usize) -> VecMap<K, V> { |     pub fn with_capacity(cap: usize) -> VecMap<K, V> { | ||||||
|         VecMap { |         VecMap { | ||||||
|             vec: Vec::with_capacity(cap) |             vec: Vec::with_capacity(cap) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|     pub fn insert(&mut self, key: K, value: V) { |     pub fn insert(&mut self, key: K, value: V) { | ||||||
|         match self.find(&key) { |         match self.find(&key) { | ||||||
|             Some(pos) => self.vec[pos] = (key, value), |             Some(pos) => self.vec[pos] = (key, value), | ||||||
| @@ -17,6 +19,7 @@ impl<K: PartialEq, V> VecMap<K, V> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|     pub fn entry(&mut self, key: K) -> Entry<K, V> { |     pub fn entry(&mut self, key: K) -> Entry<K, V> { | ||||||
|         match self.find(&key) { |         match self.find(&key) { | ||||||
|             Some(pos) => Entry::Occupied(OccupiedEntry { |             Some(pos) => Entry::Occupied(OccupiedEntry { | ||||||
| @@ -30,31 +33,47 @@ impl<K: PartialEq, V> VecMap<K, V> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn get(&self, key: &K) -> Option<&V> { |     #[inline] | ||||||
|  |     pub fn get<K2>(&self, key: &K2) -> Option<&V> | ||||||
|  |     where K2: PartialEq<K> + ?Sized { | ||||||
|         self.find(key).map(move |pos| &self.vec[pos].1) |         self.find(key).map(move |pos| &self.vec[pos].1) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn get_mut(&mut self, key: &K) -> Option<&mut V> { |     #[inline] | ||||||
|  |     pub fn get_mut<K2>(&mut self, key: &K2) -> Option<&mut V> | ||||||
|  |     where K2: PartialEq<K> { | ||||||
|         self.find(key).map(move |pos| &mut self.vec[pos].1) |         self.find(key).map(move |pos| &mut self.vec[pos].1) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     pub fn contains_key(&self, key: &K) -> bool { |     #[inline] | ||||||
|  |     pub fn contains_key<K2>(&self, key: &K2) -> bool | ||||||
|  |     where K2: PartialEq<K> { | ||||||
|         self.find(key).is_some() |         self.find(key).is_some() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|     pub fn len(&self) -> usize { self.vec.len() } |     pub fn len(&self) -> usize { self.vec.len() } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|  |     pub fn is_empty(&self) -> bool { self.vec.is_empty() } | ||||||
|  |  | ||||||
|  |     #[inline] | ||||||
|     pub fn iter(&self) -> ::std::slice::Iter<(K, V)> { |     pub fn iter(&self) -> ::std::slice::Iter<(K, V)> { | ||||||
|         self.vec.iter() |         self.vec.iter() | ||||||
|     } |     } | ||||||
|     pub fn remove(&mut self, key: &K) -> Option<V> { |     #[inline] | ||||||
|  |     pub fn remove<K2>(&mut self, key: &K2) -> Option<V> | ||||||
|  |     where K2: PartialEq<K> + ?Sized { | ||||||
|         self.find(key).map(|pos| self.vec.remove(pos)).map(|(_, v)| v) |         self.find(key).map(|pos| self.vec.remove(pos)).map(|(_, v)| v) | ||||||
|     } |     } | ||||||
|  |     #[inline] | ||||||
|     pub fn clear(&mut self) { |     pub fn clear(&mut self) { | ||||||
|         self.vec.clear(); |         self.vec.clear(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn find(&self, key: &K) -> Option<usize> { |     #[inline] | ||||||
|  |     fn find<K2>(&self, key: &K2) -> Option<usize> | ||||||
|  |     where K2: PartialEq<K> + ?Sized { | ||||||
|         self.vec.iter().position(|entry| key == &entry.0) |         self.vec.iter().position(|entry| key == &entry.0) | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -464,7 +464,7 @@ impl Headers { | |||||||
|     /// ``` |     /// ``` | ||||||
|     pub fn get_raw(&self, name: &str) -> Option<&Raw> { |     pub fn get_raw(&self, name: &str) -> Option<&Raw> { | ||||||
|         self.data |         self.data | ||||||
|             .get(&HeaderName(UniCase(Cow::Borrowed(unsafe { mem::transmute::<&str, &str>(name) })))) |             .get(name) | ||||||
|             .map(Item::raw) |             .map(Item::raw) | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -517,9 +517,7 @@ impl Headers { | |||||||
|     /// Remove a header by name. |     /// Remove a header by name. | ||||||
|     pub fn remove_raw(&mut self, name: &str) { |     pub fn remove_raw(&mut self, name: &str) { | ||||||
|         trace!("Headers.remove_raw( {:?} )", name); |         trace!("Headers.remove_raw( {:?} )", name); | ||||||
|         self.data.remove( |         self.data.remove(name); | ||||||
|             &HeaderName(UniCase(Cow::Borrowed(unsafe { mem::transmute::<&str, &str>(name) }))) |  | ||||||
|         ); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -685,6 +683,16 @@ impl PartialEq for HeaderName { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | impl PartialEq<HeaderName> for str { | ||||||
|  |     fn eq(&self, other: &HeaderName) -> bool { | ||||||
|  |         let k = other.as_ref(); | ||||||
|  |         if self.len() == k.len() && self.as_ptr() == k.as_ptr() { | ||||||
|  |             true | ||||||
|  |         } else { | ||||||
|  |             other.0 == self | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| #[cfg(test)] | #[cfg(test)] | ||||||
| mod tests { | mod tests { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user