diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2016-01-21 10:28:39 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2016-01-26 08:39:07 -0800 |
| commit | 1fa0be2bc038e0575a601ba0273cd83d91d064f2 (patch) | |
| tree | 7f73d02c1762d6958e343176469b934b46ef31cc /src/libcore/hash | |
| parent | 670f5b06e47d847b3fc8c61392a65202f1d3dfa2 (diff) | |
| download | rust-1fa0be2bc038e0575a601ba0273cd83d91d064f2.tar.gz rust-1fa0be2bc038e0575a601ba0273cd83d91d064f2.zip | |
std: Stabilize custom hasher support in HashMap
This commit implements the stabilization of the custom hasher support intended for 1.7 but left out due to some last-minute questions that needed some decisions. A summary of the actions done in this PR are: Stable * `std::hash::BuildHasher` * `BuildHasher::Hasher` * `BuildHasher::build_hasher` * `std::hash::BuildHasherDefault` * `HashMap::with_hasher` * `HashMap::with_capacity_and_hasher` * `HashSet::with_hasher` * `HashSet::with_capacity_and_hasher` * `std::collections::hash_map::RandomState` * `RandomState::new` Deprecated * `std::collections::hash_state` * `std::collections::hash_state::HashState` - this trait was also moved into `std::hash` with a reexport here to ensure that we can have a blanket impl to prevent immediate breakage on nightly. Note that this is unstable in both location. * `HashMap::with_hash_state` - renamed * `HashMap::with_capacity_and_hash_state` - renamed * `HashSet::with_hash_state` - renamed * `HashSet::with_capacity_and_hash_state` - renamed Closes #27713
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 { |
