std: rewrite Hash to make it more generic
This patch merges IterBytes and Hash traits, which clears up the confusion of using `#[deriving(IterBytes)]` to support hashing. Instead, it now is much easier to use the new `#[deriving(Hash)]` for making a type hashable with a stream hash. Furthermore, it supports custom non-stream-based hashers, such as if a value's hash was cached in a database. This does not yet replace the old IterBytes-hash with this new version.
This commit is contained in:
parent
0135b521ad
commit
d223dd1e57
25 changed files with 1154 additions and 15 deletions
|
|
@ -0,0 +1,27 @@
|
|||
// 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
||||
|
||||
#[feature(struct_variant)];
|
||||
extern crate extra;
|
||||
|
||||
use std::hash::Hash;
|
||||
|
||||
struct Error;
|
||||
|
||||
#[deriving(Hash)]
|
||||
enum Enum {
|
||||
A {
|
||||
x: Error //~ ERROR
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
27
src/test/compile-fail/deriving-span-Hash-enum.rs
Normal file
27
src/test/compile-fail/deriving-span-Hash-enum.rs
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
// 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
||||
|
||||
#[feature(struct_variant)];
|
||||
extern crate extra;
|
||||
|
||||
use std::hash::Hash;
|
||||
|
||||
struct Error;
|
||||
|
||||
#[deriving(Hash)]
|
||||
enum Enum {
|
||||
A(
|
||||
Error //~ ERROR
|
||||
)
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
25
src/test/compile-fail/deriving-span-Hash-struct.rs
Normal file
25
src/test/compile-fail/deriving-span-Hash-struct.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
||||
|
||||
#[feature(struct_variant)];
|
||||
extern crate extra;
|
||||
|
||||
use std::hash::Hash;
|
||||
|
||||
struct Error;
|
||||
|
||||
#[deriving(Hash)]
|
||||
struct Struct {
|
||||
x: Error //~ ERROR
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
25
src/test/compile-fail/deriving-span-Hash-tuple-struct.rs
Normal file
25
src/test/compile-fail/deriving-span-Hash-tuple-struct.rs
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// This file was auto-generated using 'src/etc/generate-keyword-span-tests.py'
|
||||
|
||||
#[feature(struct_variant)];
|
||||
extern crate extra;
|
||||
|
||||
use std::hash::Hash;
|
||||
|
||||
struct Error;
|
||||
|
||||
#[deriving(Hash)]
|
||||
struct Struct(
|
||||
Error //~ ERROR
|
||||
);
|
||||
|
||||
fn main() {}
|
||||
28
src/test/run-pass/deriving-hash.rs
Normal file
28
src/test/run-pass/deriving-hash.rs
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
// 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 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
// ignore-fast
|
||||
|
||||
use std::hash;
|
||||
use std::hash::Hash;
|
||||
|
||||
#[deriving(Hash)]
|
||||
struct Person {
|
||||
id: uint,
|
||||
name: ~str,
|
||||
phone: uint,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let person1 = Person { id: 5, name: ~"Janet", phone: 555_666_7777 };
|
||||
let person2 = Person { id: 5, name: ~"Bob", phone: 555_666_7777 };
|
||||
assert!(hash::hash(&person1) == hash::hash(&person1));
|
||||
assert!(hash::hash(&person1) != hash::hash(&person2));
|
||||
}
|
||||
|
|
@ -10,6 +10,8 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::hash_old::Hash;
|
||||
|
||||
#[deriving(Eq)]
|
||||
#[deriving(Clone)]
|
||||
#[deriving(IterBytes)]
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@
|
|||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::hash_old::Hash;
|
||||
|
||||
#[deriving(Eq, Clone, IterBytes)]
|
||||
struct Foo {
|
||||
bar: uint,
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@
|
|||
extern crate other1 = "typeid-intrinsic";
|
||||
extern crate other2 = "typeid-intrinsic2";
|
||||
|
||||
use std::hash_old::Hash;
|
||||
use std::unstable::intrinsics;
|
||||
use std::unstable::intrinsics::TypeId;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue