1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use super::*;

use std::default::Default;

use std::fmt;

use serde::ser::{Serialize, Serializer, SerializeSeq};
use serde::de::{Visitor, Deserialize, Deserializer, SeqAccess};

impl<Sym, H> Serialize for StringInterner<Sym, H>
	where Sym: Symbol,
	      H  : BuildHasher
{
	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
		where S: Serializer
	{
		let mut seq = serializer.serialize_seq(Some(self.len()))?;
		for s in self.iter_values() {
			seq.serialize_element(s)?
		}
		seq.end()
	}
}

impl<'de, Sym, H> Deserialize<'de> for StringInterner<Sym, H>
	where Sym: Symbol,
	      H  : BuildHasher + Default
{
	fn deserialize<D>(deserializer: D) -> Result<StringInterner<Sym, H>, D::Error>
		where D: Deserializer<'de>
	{
		deserializer.deserialize_seq(StringInternerVisitor::default())
	}
}

struct StringInternerVisitor<Sym, H>
	where Sym: Symbol, H: BuildHasher
{
	mark: marker::PhantomData<(Sym, H)>
}

impl<Sym, H> Default for StringInternerVisitor<Sym, H>
	where Sym: Symbol,
	      H  : BuildHasher
{
	fn default() -> Self {
		StringInternerVisitor{ mark: marker::PhantomData }
	}
}

impl<'de, Sym, H> Visitor<'de> for StringInternerVisitor<Sym, H>
	where Sym: Symbol,
	      H  : BuildHasher + Default
	{
	type Value = StringInterner<Sym, H>;

	fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
		formatter.write_str("Expected a contiguous sequence of strings.")
	}

	fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
		where A: SeqAccess<'de>
	{
		let mut interner: StringInterner<Sym, H> = StringInterner::with_capacity_and_hasher(
			seq.size_hint().unwrap_or(0), H::default());
		while let Some(s) = seq.next_element::<Box<str>>()? {
			interner.get_or_intern(s);
		}
		Ok(interner)
	}
}