X-Git-Url: https://git.chrismorgan.info/anymap/blobdiff_plain/7606e75aa4aac3580b1951fe68a18888dd0cae0e..85398300eed399bca2cc0715113546931303df97:/src/raw.rs diff --git a/src/raw.rs b/src/raw.rs index 6439771..6aed3e8 100644 --- a/src/raw.rs +++ b/src/raw.rs @@ -5,40 +5,19 @@ use std::any::TypeId; use std::borrow::Borrow; use std::collections::hash_map::{self, HashMap}; -#[cfg(feature = "nightly")] -use std::collections::hash_state::HashState; -use std::default::Default; use std::hash::Hash; -#[cfg(feature = "nightly")] -use std::hash::Hasher; -use std::iter::IntoIterator; -#[cfg(feature = "nightly")] +use std::hash::{Hasher, BuildHasherDefault}; use std::mem; use std::ops::{Index, IndexMut}; -#[cfg(feature = "nightly")] use std::ptr; use any::{Any, UncheckedAnyExt}; -#[cfg(feature = "nightly")] +#[derive(Default)] struct TypeIdHasher { value: u64, } -#[derive(Clone)] -#[cfg(feature = "nightly")] -struct TypeIdState; - -#[cfg(feature = "nightly")] -impl HashState for TypeIdState { - type Hasher = TypeIdHasher; - - fn hasher(&self) -> TypeIdHasher { - TypeIdHasher { value: 0 } - } -} - -#[cfg(feature = "nightly")] impl Hasher for TypeIdHasher { #[inline(always)] fn write(&mut self, bytes: &[u8]) { @@ -53,7 +32,6 @@ impl Hasher for TypeIdHasher { fn finish(&self) -> u64 { self.value } } - /// The raw, underlying form of a `Map`. /// /// At its essence, this is a wrapper around `HashMap>`, with the portions that @@ -63,11 +41,7 @@ impl Hasher for TypeIdHasher { /// doesn’t tend to be so very useful. Still, if you need it, it’s here. #[derive(Debug)] pub struct RawMap { - #[cfg(feature = "nightly")] - inner: HashMap, TypeIdState>, - - #[cfg(not(feature = "nightly"))] - inner: HashMap>, + inner: HashMap, BuildHasherDefault>, } // #[derive(Clone)] would want A to implement Clone, but in reality it’s only Box that can. @@ -85,18 +59,10 @@ impl Default for RawMap { } } -#[cfg(feature = "nightly")] -impl_common_methods! { - field: RawMap.inner; - new() => HashMap::with_hash_state(TypeIdState); - with_capacity(capacity) => HashMap::with_capacity_and_hash_state(capacity, TypeIdState); -} - -#[cfg(not(feature = "nightly"))] impl_common_methods! { field: RawMap.inner; - new() => HashMap::new(); - with_capacity(capacity) => HashMap::with_capacity(capacity); + new() => HashMap::with_hasher(Default::default()); + with_capacity(capacity) => HashMap::with_capacity_and_hasher(capacity, Default::default()); } /// RawMap iterator. @@ -140,17 +106,14 @@ impl ExactSizeIterator for IntoIter { } /// RawMap drain iterator. -#[cfg(feature = "nightly")] pub struct Drain<'a, A: ?Sized + UncheckedAnyExt> { inner: hash_map::Drain<'a, TypeId, Box>, } -#[cfg(feature = "nightly")] 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 = "nightly")] impl<'a, A: ?Sized + UncheckedAnyExt> ExactSizeIterator for Drain<'a, A> { #[inline] fn len(&self) -> usize { self.inner.len() } } @@ -182,7 +145,6 @@ impl RawMap { /// /// Keeps the allocated memory for reuse. #[inline] - #[cfg(feature = "nightly")] pub fn drain(&mut self) -> Drain { Drain { inner: self.inner.drain(),