Skip to content

Commit 0b54ca9

Browse files
authored
Merge pull request rust-lang#42 from Techcable/fix/deserialize-hasher
Fix serde deserialization for custom hashers.
2 parents 27af6e3 + c2349b7 commit 0b54ca9

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

src/serde.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ impl<K, V, S> Serialize for OrderMap<K, V, S>
2727
}
2828
}
2929

30-
struct OrderMapVisitor<K, V>(PhantomData<(K, V)>);
30+
struct OrderMapVisitor<K, V, S>(PhantomData<(K, V, S)>);
3131

32-
impl<'de, K, V> Visitor<'de> for OrderMapVisitor<K, V>
32+
impl<'de, K, V, S> Visitor<'de> for OrderMapVisitor<K, V, S>
3333
where K: Deserialize<'de> + Eq + Hash,
34-
V: Deserialize<'de>
34+
V: Deserialize<'de>,
35+
S: Default + BuildHasher
3536
{
36-
type Value = OrderMap<K, V>;
37+
type Value = OrderMap<K, V, S>;
3738

3839
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
3940
write!(formatter, "a map")
@@ -42,7 +43,7 @@ impl<'de, K, V> Visitor<'de> for OrderMapVisitor<K, V>
4243
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
4344
where A: MapAccess<'de>
4445
{
45-
let mut values = OrderMap::with_capacity(map.size_hint().unwrap_or(0));
46+
let mut values = OrderMap::with_capacity_and_hasher(map.size_hint().unwrap_or(0), Default::default());
4647

4748
while let Some((key, value)) = try!(map.next_entry()) {
4849
values.insert(key, value);
@@ -53,9 +54,10 @@ impl<'de, K, V> Visitor<'de> for OrderMapVisitor<K, V>
5354
}
5455

5556
/// Requires crate feature `"serde-1"`
56-
impl<'de, K, V> Deserialize<'de> for OrderMap<K, V>
57+
impl<'de, K, V, S> Deserialize<'de> for OrderMap<K, V, S>
5758
where K: Deserialize<'de> + Eq + Hash,
58-
V: Deserialize<'de>
59+
V: Deserialize<'de>,
60+
S: Default + BuildHasher
5961
{
6062
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
6163
where D: Deserializer<'de>

tests/serde.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#[macro_use]
44
extern crate ordermap;
55
extern crate serde_test;
6+
extern crate fnv;
67

78
use serde_test::{Token, assert_tokens};
89

@@ -17,3 +18,17 @@ fn test_serde() {
1718
Token::I32(4),
1819
Token::MapEnd]);
1920
}
21+
22+
#[test]
23+
fn test_serde_fnv_hasher() {
24+
let mut map: ::ordermap::OrderMap<i32, i32, ::fnv::FnvBuildHasher> = Default::default();
25+
map.insert(1, 2);
26+
map.insert(3, 4);
27+
assert_tokens(&map,
28+
&[Token::Map { len: Some(2) },
29+
Token::I32(1),
30+
Token::I32(2),
31+
Token::I32(3),
32+
Token::I32(4),
33+
Token::MapEnd]);
34+
}

0 commit comments

Comments
 (0)