// Copyright 2014 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. #![unstable(feature = "hashmap_hasher", reason = "hasher stuff is unclear", issue = "27713")] use clone::Clone; use default::Default; use hash; use marker; /// A trait representing stateful hashes which can be used to hash keys in a /// `HashMap`. /// /// A HashState is used as a factory for instances of `Hasher` which a `HashMap` /// can then use to hash keys independently. A `HashMap` by default uses a state /// which will create instances of a `SipHasher`, but a custom state factory can /// be provided to the `with_hash_state` function. /// /// If a hashing algorithm has no initial state, then the `Hasher` type for that /// algorithm can implement the `Default` trait and create hash maps with the /// `DefaultState` structure. This state is 0-sized and will simply delegate /// to `Default` when asked to create a hasher. pub trait HashState { /// Type of the hasher that will be created. type Hasher: hash::Hasher; /// Creates a new hasher based on the given state of this object. fn hasher(&self) -> Self::Hasher; } /// A structure which is a factory for instances of `Hasher` which implement the /// default trait. /// /// This struct is 0-sized and does not need construction. pub struct DefaultState(marker::PhantomData); impl HashState for DefaultState { type Hasher = H; fn hasher(&self) -> H { Default::default() } } impl Clone for DefaultState { fn clone(&self) -> DefaultState { DefaultState(marker::PhantomData) } } impl Default for DefaultState { fn default() -> DefaultState { DefaultState(marker::PhantomData) } }