1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
11 //! Implementations of serialization for structures found in libcollections
14 use std
::default::Default
;
16 use std
::collections
::hash_state
::HashState
;
18 use {Decodable, Encodable, Decoder, Encoder}
;
19 use std
::collections
::{LinkedList, VecDeque, BTreeMap, BTreeSet, HashMap, HashSet, VecMap}
;
20 use collections
::enum_set
::{EnumSet, CLike}
;
24 > Encodable
for LinkedList
<T
> {
25 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
26 s
.emit_seq(self.len(), |s
| {
27 for (i
, e
) in self.iter().enumerate() {
28 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
35 impl<T
:Decodable
> Decodable
for LinkedList
<T
> {
36 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<LinkedList
<T
>, D
::Error
> {
38 let mut list
= LinkedList
::new();
40 list
.push_back(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
47 impl<T
: Encodable
> Encodable
for VecDeque
<T
> {
48 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
49 s
.emit_seq(self.len(), |s
| {
50 for (i
, e
) in self.iter().enumerate() {
51 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
58 impl<T
:Decodable
> Decodable
for VecDeque
<T
> {
59 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<VecDeque
<T
>, D
::Error
> {
61 let mut deque
: VecDeque
<T
> = VecDeque
::new();
63 deque
.push_back(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
71 K
: Encodable
+ PartialEq
+ Ord
,
72 V
: Encodable
+ PartialEq
73 > Encodable
for BTreeMap
<K
, V
> {
74 fn encode
<S
: Encoder
>(&self, e
: &mut S
) -> Result
<(), S
::Error
> {
75 e
.emit_map(self.len(), |e
| {
77 for (key
, val
) in self {
78 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
79 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
88 K
: Decodable
+ PartialEq
+ Ord
,
89 V
: Decodable
+ PartialEq
90 > Decodable
for BTreeMap
<K
, V
> {
91 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<BTreeMap
<K
, V
>, D
::Error
> {
93 let mut map
= BTreeMap
::new();
95 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
96 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
105 T
: Encodable
+ PartialEq
+ Ord
106 > Encodable
for BTreeSet
<T
> {
107 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
108 s
.emit_seq(self.len(), |s
| {
111 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
120 T
: Decodable
+ PartialEq
+ Ord
121 > Decodable
for BTreeSet
<T
> {
122 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<BTreeSet
<T
>, D
::Error
> {
123 d
.read_seq(|d
, len
| {
124 let mut set
= BTreeSet
::new();
126 set
.insert(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
135 > Encodable
for EnumSet
<T
> {
136 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
139 bits
|= item
.to_usize();
147 > Decodable
for EnumSet
<T
> {
148 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<EnumSet
<T
>, D
::Error
> {
149 let bits
= try
!(d
.read_uint());
150 let mut set
= EnumSet
::new();
151 for bit
in 0..usize::BITS
{
152 if bits
& (1 << bit
) != 0 {
153 set
.insert(CLike
::from_usize(1 << bit
));
160 impl<K
, V
, S
> Encodable
for HashMap
<K
, V
, S
>
161 where K
: Encodable
+ Hash
+ Eq
,
165 fn encode
<E
: Encoder
>(&self, e
: &mut E
) -> Result
<(), E
::Error
> {
166 e
.emit_map(self.len(), |e
| {
168 for (key
, val
) in self {
169 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
170 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
178 impl<K
, V
, S
> Decodable
for HashMap
<K
, V
, S
>
179 where K
: Decodable
+ Hash
+ Eq
,
181 S
: HashState
+ Default
,
183 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<HashMap
<K
, V
, S
>, D
::Error
> {
184 d
.read_map(|d
, len
| {
185 let state
= Default
::default();
186 let mut map
= HashMap
::with_capacity_and_hash_state(len
, state
);
188 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
189 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
190 map
.insert(key
, val
);
197 impl<T
, S
> Encodable
for HashSet
<T
, S
>
198 where T
: Encodable
+ Hash
+ Eq
,
201 fn encode
<E
: Encoder
>(&self, s
: &mut E
) -> Result
<(), E
::Error
> {
202 s
.emit_seq(self.len(), |s
| {
205 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
213 impl<T
, S
> Decodable
for HashSet
<T
, S
>
214 where T
: Decodable
+ Hash
+ Eq
,
215 S
: HashState
+ Default
,
217 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<HashSet
<T
, S
>, D
::Error
> {
218 d
.read_seq(|d
, len
| {
219 let state
= Default
::default();
220 let mut set
= HashSet
::with_capacity_and_hash_state(len
, state
);
222 set
.insert(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
229 impl<V
: Encodable
> Encodable
for VecMap
<V
> {
230 fn encode
<S
: Encoder
>(&self, e
: &mut S
) -> Result
<(), S
::Error
> {
231 e
.emit_map(self.len(), |e
| {
232 for (i
, (key
, val
)) in self.iter().enumerate() {
233 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
234 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
241 impl<V
: Decodable
> Decodable
for VecMap
<V
> {
242 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<VecMap
<V
>, D
::Error
> {
243 d
.read_map(|d
, len
| {
244 let mut map
= VecMap
::new();
246 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
247 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
248 map
.insert(key
, val
);