auto merge of #12522 : erickt/rust/hash, r=alexcrichton
This patch series does a couple things: * replaces manual `Hash` implementations with `#[deriving(Hash)]` * adds `Hash` back to `std::prelude` * minor cleanup of whitespace and variable names.
This commit is contained in:
commit
25d68366b7
14 changed files with 68 additions and 83 deletions
|
@ -754,7 +754,6 @@ pub fn mono_data_classify(t: ty::t) -> MonoDataClass {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
#[deriving(Eq, Hash)]
|
||||
pub struct mono_id_ {
|
||||
def: ast::DefId,
|
||||
|
|
|
@ -4926,13 +4926,11 @@ pub fn trait_method_of_method(tcx: ctxt,
|
|||
/// Creates a hash of the type `t` which will be the same no matter what crate
|
||||
/// context it's calculated within. This is used by the `type_id` intrinsic.
|
||||
pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
||||
use std::hash::{sip, Hash};
|
||||
let mut state = sip::SipState::new(0, 0);
|
||||
macro_rules! byte( ($b:expr) => { ($b as u8).hash(&mut state) } );
|
||||
macro_rules! hash( ($e:expr) => { $e.hash(&mut state) } );
|
||||
|
||||
let mut hash = sip::SipState::new(0, 0);
|
||||
macro_rules! byte( ($b:expr) => { ($b as u8).hash(&mut hash) } );
|
||||
macro_rules! hash( ($e:expr) => { $e.hash(&mut hash) } );
|
||||
|
||||
let region = |_hash: &mut sip::SipState, r: Region| {
|
||||
let region = |_state: &mut sip::SipState, r: Region| {
|
||||
match r {
|
||||
ReStatic => {}
|
||||
|
||||
|
@ -4946,27 +4944,27 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
|||
}
|
||||
}
|
||||
};
|
||||
let vstore = |hash: &mut sip::SipState, v: vstore| {
|
||||
let vstore = |state: &mut sip::SipState, v: vstore| {
|
||||
match v {
|
||||
vstore_fixed(_) => 0u8.hash(hash),
|
||||
vstore_uniq => 1u8.hash(hash),
|
||||
vstore_fixed(_) => 0u8.hash(state),
|
||||
vstore_uniq => 1u8.hash(state),
|
||||
vstore_slice(r) => {
|
||||
2u8.hash(hash);
|
||||
region(hash, r);
|
||||
2u8.hash(state);
|
||||
region(state, r);
|
||||
}
|
||||
}
|
||||
};
|
||||
let did = |hash: &mut sip::SipState, did: DefId| {
|
||||
let did = |state: &mut sip::SipState, did: DefId| {
|
||||
let h = if ast_util::is_local(did) {
|
||||
local_hash.clone()
|
||||
} else {
|
||||
tcx.sess.cstore.get_crate_hash(did.krate)
|
||||
};
|
||||
h.as_bytes().hash(hash);
|
||||
did.node.hash(hash);
|
||||
h.as_bytes().hash(state);
|
||||
did.node.hash(state);
|
||||
};
|
||||
let mt = |hash: &mut sip::SipState, mt: mt| {
|
||||
mt.mutbl.hash(hash);
|
||||
let mt = |state: &mut sip::SipState, mt: mt| {
|
||||
mt.mutbl.hash(state);
|
||||
};
|
||||
ty::walk_ty(t, |t| {
|
||||
match ty::get(t).sty {
|
||||
|
@ -5002,17 +5000,17 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
|||
}
|
||||
ty_vec(m, v) => {
|
||||
byte!(11);
|
||||
mt(&mut hash, m);
|
||||
vstore(&mut hash, v);
|
||||
mt(&mut state, m);
|
||||
vstore(&mut state, v);
|
||||
}
|
||||
ty_ptr(m) => {
|
||||
byte!(12);
|
||||
mt(&mut hash, m);
|
||||
mt(&mut state, m);
|
||||
}
|
||||
ty_rptr(r, m) => {
|
||||
byte!(13);
|
||||
region(&mut hash, r);
|
||||
mt(&mut hash, m);
|
||||
region(&mut state, r);
|
||||
mt(&mut state, m);
|
||||
}
|
||||
ty_bare_fn(ref b) => {
|
||||
byte!(14);
|
||||
|
@ -5025,16 +5023,16 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
|||
hash!(c.sigil);
|
||||
hash!(c.onceness);
|
||||
hash!(c.bounds);
|
||||
region(&mut hash, c.region);
|
||||
region(&mut state, c.region);
|
||||
}
|
||||
ty_trait(d, _, store, m, bounds) => {
|
||||
byte!(17);
|
||||
did(&mut hash, d);
|
||||
did(&mut state, d);
|
||||
match store {
|
||||
UniqTraitStore => byte!(0),
|
||||
RegionTraitStore(r) => {
|
||||
byte!(1)
|
||||
region(&mut hash, r);
|
||||
region(&mut state, r);
|
||||
}
|
||||
}
|
||||
hash!(m);
|
||||
|
@ -5042,7 +5040,7 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
|||
}
|
||||
ty_struct(d, _) => {
|
||||
byte!(18);
|
||||
did(&mut hash, d);
|
||||
did(&mut state, d);
|
||||
}
|
||||
ty_tup(ref inner) => {
|
||||
byte!(19);
|
||||
|
@ -5051,22 +5049,22 @@ pub fn hash_crate_independent(tcx: ctxt, t: t, local_hash: ~str) -> u64 {
|
|||
ty_param(p) => {
|
||||
byte!(20);
|
||||
hash!(p.idx);
|
||||
did(&mut hash, p.def_id);
|
||||
did(&mut state, p.def_id);
|
||||
}
|
||||
ty_self(d) => {
|
||||
byte!(21);
|
||||
did(&mut hash, d);
|
||||
did(&mut state, d);
|
||||
}
|
||||
ty_infer(_) => unreachable!(),
|
||||
ty_err => byte!(23),
|
||||
ty_unboxed_vec(m) => {
|
||||
byte!(24);
|
||||
mt(&mut hash, m);
|
||||
mt(&mut state, m);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
hash.result()
|
||||
state.result()
|
||||
}
|
||||
|
||||
impl Variance {
|
||||
|
|
|
@ -18,13 +18,12 @@ use str::OwnedStr;
|
|||
use container::Container;
|
||||
use cast;
|
||||
use fmt;
|
||||
use hash::{Hash, sip};
|
||||
use iter::Iterator;
|
||||
use vec::{ImmutableVector, MutableVector, Vector};
|
||||
use option::{Option, Some, None};
|
||||
|
||||
/// Datatype to hold one ascii character. It wraps a `u8`, with the highest bit always zero.
|
||||
#[deriving(Clone, Eq, Ord, TotalOrd, TotalEq)]
|
||||
#[deriving(Clone, Eq, Ord, TotalOrd, TotalEq, Hash)]
|
||||
pub struct Ascii { priv chr: u8 }
|
||||
|
||||
impl Ascii {
|
||||
|
@ -306,13 +305,6 @@ impl IntoStr for ~[Ascii] {
|
|||
}
|
||||
}
|
||||
|
||||
impl Hash for Ascii {
|
||||
#[inline]
|
||||
fn hash(&self, s: &mut sip::SipState) {
|
||||
self.to_byte().hash(s)
|
||||
}
|
||||
}
|
||||
|
||||
/// Trait to convert to an owned byte array by consuming self
|
||||
pub trait IntoBytes {
|
||||
/// Converts to an owned byte array by consuming self
|
||||
|
|
|
@ -55,7 +55,6 @@ pub struct SocketAddr {
|
|||
port: Port,
|
||||
}
|
||||
|
||||
|
||||
impl fmt::Show for SocketAddr {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
match self.ip {
|
||||
|
|
|
@ -151,7 +151,6 @@ pub mod container;
|
|||
pub mod default;
|
||||
pub mod any;
|
||||
|
||||
|
||||
/* Common data structures */
|
||||
|
||||
pub mod option;
|
||||
|
|
|
@ -8,14 +8,13 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::hash::{Hash, sip};
|
||||
use std::fmt;
|
||||
use std::fmt::Show;
|
||||
|
||||
#[deriving(Eq)]
|
||||
pub enum Os { OsWin32, OsMacos, OsLinux, OsAndroid, OsFreebsd, }
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Eq, Hash)]
|
||||
pub enum Abi {
|
||||
// NB: This ordering MUST match the AbiDatas array below.
|
||||
// (This is ensured by the test indices_are_correct().)
|
||||
|
@ -267,12 +266,6 @@ impl AbiSet {
|
|||
}
|
||||
}
|
||||
|
||||
impl Hash for Abi {
|
||||
fn hash(&self, s: &mut sip::SipState) {
|
||||
self.index().hash(s)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Show for Abi {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
self.data().name.fmt(f)
|
||||
|
|
|
@ -75,8 +75,7 @@ impl<T:Eq + Hash + Freeze + Clone + 'static> Interner<T> {
|
|||
vect.get().len()
|
||||
}
|
||||
|
||||
pub fn find_equiv<Q:Hash + Equiv<T>>(&self, val: &Q)
|
||||
-> Option<Name> {
|
||||
pub fn find_equiv<Q:Hash + Equiv<T>>(&self, val: &Q) -> Option<Name> {
|
||||
let map = self.map.borrow();
|
||||
match map.get().find_equiv(val) {
|
||||
Some(v) => Some(*v),
|
||||
|
@ -207,8 +206,7 @@ impl StrInterner {
|
|||
vect.get().len()
|
||||
}
|
||||
|
||||
pub fn find_equiv<Q:Hash + Equiv<RcStr>>(&self, val: &Q)
|
||||
-> Option<Name> {
|
||||
pub fn find_equiv<Q:Hash + Equiv<RcStr>>(&self, val: &Q) -> Option<Name> {
|
||||
let map = self.map.borrow();
|
||||
match map.get().find_equiv(val) {
|
||||
Some(v) => Some(*v),
|
||||
|
|
|
@ -27,18 +27,21 @@ mod submod {
|
|||
// function calls, then being in a submodule will (correctly)
|
||||
// cause errors about unrecognised module `std` (or `extra`)
|
||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||
Hash,
|
||||
Clone, DeepClone,
|
||||
Show, Rand,
|
||||
Encodable, Decodable)]
|
||||
enum A { A1(uint), A2(int) }
|
||||
|
||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||
Hash,
|
||||
Clone, DeepClone,
|
||||
Show, Rand,
|
||||
Encodable, Decodable)]
|
||||
struct B { x: uint, y: int }
|
||||
|
||||
#[deriving(Eq, Ord, TotalEq, TotalOrd,
|
||||
Hash,
|
||||
Clone, DeepClone,
|
||||
Show, Rand,
|
||||
Encodable, Decodable)]
|
||||
|
|
|
@ -10,8 +10,9 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Clone)]
|
||||
use std::hash::hash;
|
||||
|
||||
#[deriving(Eq, Clone, Hash)]
|
||||
struct Foo {
|
||||
bar: uint,
|
||||
baz: int
|
||||
|
@ -22,4 +23,5 @@ pub fn main() {
|
|||
|
||||
a == a; // check for Eq impl w/o testing its correctness
|
||||
a.clone(); // check for Clone impl w/o testing its correctness
|
||||
hash(&a); // check for Hash impl w/o testing its correctness
|
||||
}
|
||||
|
|
|
@ -10,7 +10,9 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[deriving(Eq, Clone)]
|
||||
use std::hash::hash;
|
||||
|
||||
#[deriving(Eq, Clone, Hash)]
|
||||
struct Foo {
|
||||
bar: uint,
|
||||
baz: int
|
||||
|
@ -21,4 +23,5 @@ pub fn main() {
|
|||
|
||||
a == a; // check for Eq impl w/o testing its correctness
|
||||
a.clone(); // check for Clone impl w/o testing its correctness
|
||||
hash(&a); // check for Hash impl w/o testing its correctness
|
||||
}
|
||||
|
|
|
@ -10,8 +10,7 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Hash)]
|
||||
#[deriving(Eq, Hash)]
|
||||
struct Foo<T> {
|
||||
x: int,
|
||||
y: T,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue