X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/6d0a64dcc97a1857f7e12be00189870860a68a3e..839a6bc6e842b2ae6bbaf4b945ff6f2fbbca1785:/src/raw.rs diff --git a/src/raw.rs b/src/raw.rs index 445b137..3645429 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -19,19 +19,34 @@ struct TypeIdHasher { } impl Hasher for TypeIdHasher { - #[inline(always)] + #[inline] fn write(&mut self, bytes: &[u8]) { // This expects to receive one and exactly one 64-bit value debug_assert!(bytes.len() == 8); unsafe { - ptr::copy_nonoverlapping(&mut self.value, mem::transmute(&bytes[0]), 1) + ptr::copy_nonoverlapping(mem::transmute(&bytes[0]), &mut self.value, 1) } } - #[inline(always)] + #[inline] fn finish(&self) -> u64 { self.value } } +#[test] +fn type_id_hasher() { + fn verify_hashing_with(type_id: TypeId) { + let mut hasher = TypeIdHasher::default(); + type_id.hash(&mut hasher); + assert_eq!(hasher.finish(), unsafe { mem::transmute::(type_id) }); + } + // Pick a variety of types, just to demonstrate it’s all sane. Normal, zero-sized, unsized, &c. + verify_hashing_with(TypeId::of::()); + verify_hashing_with(TypeId::of::<()>()); + verify_hashing_with(TypeId::of::()); + verify_hashing_with(TypeId::of::<&str>()); + verify_hashing_with(TypeId::of::>()); +} + /// The raw, underlying form of a `Map`. /// /// At its essence, this is a wrapper around `HashMap>`, with the portions that @@ -65,7 +80,7 @@ impl_common_methods! { with_capacity(capacity) => HashMap::with_capacity_and_hasher(capacity, Default::default()); } -/// RawMap iterator. +/// `RawMap` iterator. #[derive(Clone)] pub struct Iter<'a, A: ?Sized + UncheckedAnyExt> { inner: hash_map::Iter<'a, TypeId, Box>, @@ -79,7 +94,7 @@ impl<'a, A: ?Sized + UncheckedAnyExt> ExactSizeIterator for Iter<'a, A> { #[inline] fn len(&self) -> usize { self.inner.len() } } -/// RawMap mutable iterator. +/// `RawMap` mutable iterator. pub struct IterMut<'a, A: ?Sized + UncheckedAnyExt> { inner: hash_map::IterMut<'a, TypeId, Box>, } @@ -92,7 +107,7 @@ impl<'a, A: ?Sized + UncheckedAnyExt> ExactSizeIterator for IterMut<'a, A> { #[inline] fn len(&self) -> usize { self.inner.len() } } -/// RawMap move iterator. +/// `RawMap` move iterator. pub struct IntoIter { inner: hash_map::IntoIter>, } @@ -105,18 +120,15 @@ impl ExactSizeIterator for IntoIter { #[inline] fn len(&self) -> usize { self.inner.len() } } -/// RawMap drain iterator. -#[cfg(feature = "unstable")] +/// `RawMap` drain iterator. pub struct Drain<'a, A: ?Sized + UncheckedAnyExt> { inner: hash_map::Drain<'a, TypeId, Box>, } -#[cfg(feature = "unstable")] impl<'a, A: ?Sized + UncheckedAnyExt> Iterator for Drain<'a, A> { type Item = Box; #[inline] fn next(&mut self) -> Option> { self.inner.next().map(|x| x.1) } #[inline] fn size_hint(&self) -> (usize, Option) { self.inner.size_hint() } } -#[cfg(feature = "unstable")] impl<'a, A: ?Sized + UncheckedAnyExt> ExactSizeIterator for Drain<'a, A> { #[inline] fn len(&self) -> usize { self.inner.len() } } @@ -148,7 +160,6 @@ impl RawMap { /// /// Keeps the allocated memory for reuse. #[inline] - #[cfg(feature = "unstable")] pub fn drain(&mut self) -> Drain { Drain { inner: self.inner.drain(), @@ -218,13 +229,13 @@ impl RawMap { impl Index for RawMap where TypeId: Borrow, Q: Eq + Hash { type Output = A; - fn index<'a>(&'a self, index: Q) -> &'a A { + fn index(&self, index: Q) -> &A { self.get(&index).expect("no entry found for key") } } impl IndexMut for RawMap where TypeId: Borrow, Q: Eq + Hash { - fn index_mut<'a>(&'a mut self, index: Q) -> &'a mut A { + fn index_mut(&mut self, index: Q) -> &mut A { self.get_mut(&index).expect("no entry found for key") } }