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.
14 //! Implementations of serialization for structures found in libcollections
17 use std
::default::Default
;
19 use std
::collections
::hash_state
::HashState
;
21 use {Decodable, Encodable, Decoder, Encoder}
;
22 use std
::collections
::{LinkedList, VecDeque, BTreeMap, BTreeSet, HashMap, HashSet, VecMap}
;
23 use collections
::enum_set
::{EnumSet, CLike}
;
27 > Encodable
for LinkedList
<T
> {
28 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
29 s
.emit_seq(self.len(), |s
| {
30 for (i
, e
) in self.iter().enumerate() {
31 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
38 impl<T
:Decodable
> Decodable
for LinkedList
<T
> {
39 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<LinkedList
<T
>, D
::Error
> {
41 let mut list
= LinkedList
::new();
43 list
.push_back(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
50 impl<T
: Encodable
> Encodable
for VecDeque
<T
> {
51 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
52 s
.emit_seq(self.len(), |s
| {
53 for (i
, e
) in self.iter().enumerate() {
54 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
61 impl<T
:Decodable
> Decodable
for VecDeque
<T
> {
62 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<VecDeque
<T
>, D
::Error
> {
64 let mut deque
: VecDeque
<T
> = VecDeque
::new();
66 deque
.push_back(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
74 K
: Encodable
+ PartialEq
+ Ord
,
75 V
: Encodable
+ PartialEq
76 > Encodable
for BTreeMap
<K
, V
> {
77 fn encode
<S
: Encoder
>(&self, e
: &mut S
) -> Result
<(), S
::Error
> {
78 e
.emit_map(self.len(), |e
| {
80 for (key
, val
) in self {
81 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
82 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
91 K
: Decodable
+ PartialEq
+ Ord
,
92 V
: Decodable
+ PartialEq
93 > Decodable
for BTreeMap
<K
, V
> {
94 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<BTreeMap
<K
, V
>, D
::Error
> {
96 let mut map
= BTreeMap
::new();
98 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
99 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
100 map
.insert(key
, val
);
108 T
: Encodable
+ PartialEq
+ Ord
109 > Encodable
for BTreeSet
<T
> {
110 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
111 s
.emit_seq(self.len(), |s
| {
114 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
123 T
: Decodable
+ PartialEq
+ Ord
124 > Decodable
for BTreeSet
<T
> {
125 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<BTreeSet
<T
>, D
::Error
> {
126 d
.read_seq(|d
, len
| {
127 let mut set
= BTreeSet
::new();
129 set
.insert(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
138 > Encodable
for EnumSet
<T
> {
139 fn encode
<S
: Encoder
>(&self, s
: &mut S
) -> Result
<(), S
::Error
> {
142 bits
|= item
.to_usize();
150 > Decodable
for EnumSet
<T
> {
151 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<EnumSet
<T
>, D
::Error
> {
152 let bits
= try
!(d
.read_uint());
153 let mut set
= EnumSet
::new();
154 for bit
in 0..usize::BITS
{
155 if bits
& (1 << bit
) != 0 {
156 set
.insert(CLike
::from_usize(1 << bit
));
163 impl<K
, V
, S
> Encodable
for HashMap
<K
, V
, S
>
164 where K
: Encodable
+ Hash
+ Eq
,
168 fn encode
<E
: Encoder
>(&self, e
: &mut E
) -> Result
<(), E
::Error
> {
169 e
.emit_map(self.len(), |e
| {
171 for (key
, val
) in self {
172 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
173 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
181 impl<K
, V
, S
> Decodable
for HashMap
<K
, V
, S
>
182 where K
: Decodable
+ Hash
+ Eq
,
184 S
: HashState
+ Default
,
186 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<HashMap
<K
, V
, S
>, D
::Error
> {
187 d
.read_map(|d
, len
| {
188 let state
= Default
::default();
189 let mut map
= HashMap
::with_capacity_and_hash_state(len
, state
);
191 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
192 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
193 map
.insert(key
, val
);
200 impl<T
, S
> Encodable
for HashSet
<T
, S
>
201 where T
: Encodable
+ Hash
+ Eq
,
204 fn encode
<E
: Encoder
>(&self, s
: &mut E
) -> Result
<(), E
::Error
> {
205 s
.emit_seq(self.len(), |s
| {
208 try
!(s
.emit_seq_elt(i
, |s
| e
.encode(s
)));
216 impl<T
, S
> Decodable
for HashSet
<T
, S
>
217 where T
: Decodable
+ Hash
+ Eq
,
218 S
: HashState
+ Default
,
220 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<HashSet
<T
, S
>, D
::Error
> {
221 d
.read_seq(|d
, len
| {
222 let state
= Default
::default();
223 let mut set
= HashSet
::with_capacity_and_hash_state(len
, state
);
225 set
.insert(try
!(d
.read_seq_elt(i
, |d
| Decodable
::decode(d
))));
232 impl<V
: Encodable
> Encodable
for VecMap
<V
> {
233 fn encode
<S
: Encoder
>(&self, e
: &mut S
) -> Result
<(), S
::Error
> {
234 e
.emit_map(self.len(), |e
| {
235 for (i
, (key
, val
)) in self.iter().enumerate() {
236 try
!(e
.emit_map_elt_key(i
, |e
| key
.encode(e
)));
237 try
!(e
.emit_map_elt_val(i
, |e
| val
.encode(e
)));
244 impl<V
: Decodable
> Decodable
for VecMap
<V
> {
245 fn decode
<D
: Decoder
>(d
: &mut D
) -> Result
<VecMap
<V
>, D
::Error
> {
246 d
.read_map(|d
, len
| {
247 let mut map
= VecMap
::new();
249 let key
= try
!(d
.read_map_elt_key(i
, |d
| Decodable
::decode(d
)));
250 let val
= try
!(d
.read_map_elt_val(i
, |d
| Decodable
::decode(d
)));
251 map
.insert(key
, val
);