diff options
Diffstat (limited to 'src/libcore/hash')
| -rw-r--r-- | src/libcore/hash/mod.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/libcore/hash/mod.rs b/src/libcore/hash/mod.rs index 0781dd3b774..9ab55620e0a 100644 --- a/src/libcore/hash/mod.rs +++ b/src/libcore/hash/mod.rs @@ -73,6 +73,7 @@ use prelude::v1::*; +use marker; use mem; #[stable(feature = "rust1", since = "1.0.0")] @@ -190,6 +191,77 @@ pub trait Hasher { } } +/// A `BuildHasher` is typically used as a factory for instances of `Hasher` +/// which a `HashMap` can then use to hash keys independently. +/// +/// Note that for each instance of `BuildHasher` the create hashers should be +/// identical. That is if the same stream of bytes is fed into each hasher the +/// same output will also be generated. +#[stable(since = "1.7.0", feature = "build_hasher")] +pub trait BuildHasher { + /// Type of the hasher that will be created. + #[stable(since = "1.7.0", feature = "build_hasher")] + type Hasher: Hasher; + + /// Creates a new hasher. + #[stable(since = "1.7.0", feature = "build_hasher")] + fn build_hasher(&self) -> Self::Hasher; +} + +/// A structure which implements `BuildHasher` for all `Hasher` types which also +/// implement `Default`. +/// +/// This struct is 0-sized and does not need construction. +#[stable(since = "1.7.0", feature = "build_hasher")] +pub struct BuildHasherDefault<H>(marker::PhantomData<H>); + +#[stable(since = "1.7.0", feature = "build_hasher")] +impl<H: Default + Hasher> BuildHasher for BuildHasherDefault<H> { + type Hasher = H; + + fn build_hasher(&self) -> H { + H::default() + } +} + +#[stable(since = "1.7.0", feature = "build_hasher")] +impl<H> Clone for BuildHasherDefault<H> { + fn clone(&self) -> BuildHasherDefault<H> { + BuildHasherDefault(marker::PhantomData) + } +} + +#[stable(since = "1.7.0", feature = "build_hasher")] +impl<H> Default for BuildHasherDefault<H> { + fn default() -> BuildHasherDefault<H> { + BuildHasherDefault(marker::PhantomData) + } +} + +// The HashState trait is super deprecated, but it's here to have the blanket +// impl that goes from HashState -> BuildHasher + +/// Deprecated, renamed to `BuildHasher` +#[unstable(feature = "hashmap_hasher", reason = "hasher stuff is unclear", + issue = "27713")] +#[rustc_deprecated(since = "1.7.0", reason = "support moved to std::hash and \ + renamed to BuildHasher")] +pub trait HashState { + /// Type of the hasher that will be created. + type Hasher: Hasher; + + /// Creates a new hasher based on the given state of this object. + fn hasher(&self) -> Self::Hasher; +} + +#[unstable(feature = "hashmap_hasher", reason = "hasher stuff is unclear", + issue = "27713")] +#[allow(deprecated)] +impl<T: HashState> BuildHasher for T { + type Hasher = T::Hasher; + fn build_hasher(&self) -> T::Hasher { self.hasher() } +} + ////////////////////////////////////////////////////////////////////////////// mod impls { |
