Skip to content

Commit e5c7a9e

Browse files
committed
std: add serialization support for dlist, linearset, triemap, trieset, treemap, and treeset
1 parent 529ae38 commit e5c7a9e

File tree

1 file changed

+183
-1
lines changed

1 file changed

+183
-1
lines changed

src/libstd/serialize.rs

Lines changed: 183 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ Core encoding and decoding interfaces.
1717
#[forbid(non_camel_case_types)];
1818

1919
use core::prelude::*;
20-
use core::hashmap::linear::LinearMap;
20+
use core::dlist::DList;
21+
use core::hashmap::linear::{LinearMap, LinearSet};
22+
use core::trie::{TrieMap, TrieSet};
23+
use treemap::{TreeMap, TreeSet};
2124

2225
pub trait Encoder {
2326
// Primitive types:
@@ -531,6 +534,33 @@ impl<
531534
}
532535
}
533536

537+
impl<
538+
S: Encoder,
539+
T: Encodable<S> + Copy
540+
> Encodable<S> for @mut DList<T> {
541+
fn encode(&self, s: &S) {
542+
do s.emit_seq(self.size) {
543+
let mut i = 0;
544+
for self.each |e| {
545+
s.emit_seq_elt(i, || e.encode(s));
546+
i += 1;
547+
}
548+
}
549+
}
550+
}
551+
552+
impl<D:Decoder,T:Decodable<D>> Decodable<D> for @mut DList<T> {
553+
fn decode(d: &D) -> @mut DList<T> {
554+
let list = DList();
555+
do d.read_seq |len| {
556+
for uint::range(0, len) |i| {
557+
list.push(d.read_seq_elt(i, || Decodable::decode(d)));
558+
}
559+
}
560+
list
561+
}
562+
}
563+
534564
impl<
535565
E: Encoder,
536566
K: Encodable<E> + Hash + IterBytes + Eq,
@@ -566,6 +596,158 @@ impl<
566596
}
567597
}
568598

599+
impl<
600+
S: Encoder,
601+
T: Encodable<S> + Hash + IterBytes + Eq
602+
> Encodable<S> for LinearSet<T> {
603+
fn encode(&self, s: &S) {
604+
do s.emit_seq(self.len()) {
605+
let mut i = 0;
606+
for self.each |e| {
607+
s.emit_seq_elt(i, || e.encode(s));
608+
i += 1;
609+
}
610+
}
611+
}
612+
}
613+
614+
impl<
615+
D: Decoder,
616+
T: Decodable<D> + Hash + IterBytes + Eq
617+
> Decodable<D> for LinearSet<T> {
618+
fn decode(d: &D) -> LinearSet<T> {
619+
do d.read_seq |len| {
620+
let mut set = LinearSet::with_capacity(len);
621+
for uint::range(0, len) |i| {
622+
set.insert(d.read_seq_elt(i, || Decodable::decode(d)));
623+
}
624+
set
625+
}
626+
}
627+
}
628+
629+
impl<
630+
E: Encoder,
631+
V: Encodable<E>
632+
> Encodable<E> for TrieMap<V> {
633+
fn encode(&self, e: &E) {
634+
do e.emit_map(self.len()) {
635+
let mut i = 0;
636+
for self.each |&(key, val)| {
637+
e.emit_map_elt_key(i, || key.encode(e));
638+
e.emit_map_elt_val(i, || val.encode(e));
639+
i += 1;
640+
}
641+
}
642+
}
643+
}
644+
645+
impl<
646+
D: Decoder,
647+
V: Decodable<D>
648+
> Decodable<D> for TrieMap<V> {
649+
fn decode(d: &D) -> TrieMap<V> {
650+
do d.read_map |len| {
651+
let mut map = TrieMap::new();
652+
for uint::range(0, len) |i| {
653+
let key = d.read_map_elt_key(i, || Decodable::decode(d));
654+
let val = d.read_map_elt_val(i, || Decodable::decode(d));
655+
map.insert(key, val);
656+
}
657+
map
658+
}
659+
}
660+
}
661+
662+
impl<S: Encoder> Encodable<S> for TrieSet {
663+
fn encode(&self, s: &S) {
664+
do s.emit_seq(self.len()) {
665+
let mut i = 0;
666+
for self.each |e| {
667+
s.emit_seq_elt(i, || e.encode(s));
668+
i += 1;
669+
}
670+
}
671+
}
672+
}
673+
674+
impl<D: Decoder> Decodable<D> for TrieSet {
675+
fn decode(d: &D) -> TrieSet {
676+
do d.read_seq |len| {
677+
let mut set = TrieSet::new();
678+
for uint::range(0, len) |i| {
679+
set.insert(d.read_seq_elt(i, || Decodable::decode(d)));
680+
}
681+
set
682+
}
683+
}
684+
}
685+
686+
impl<
687+
E: Encoder,
688+
K: Encodable<E> + Eq + TotalOrd,
689+
V: Encodable<E> + Eq
690+
> Encodable<E> for TreeMap<K, V> {
691+
fn encode(&self, e: &E) {
692+
do e.emit_map(self.len()) {
693+
let mut i = 0;
694+
for self.each |&(key, val)| {
695+
e.emit_map_elt_key(i, || key.encode(e));
696+
e.emit_map_elt_val(i, || val.encode(e));
697+
i += 1;
698+
}
699+
}
700+
}
701+
}
702+
703+
impl<
704+
D: Decoder,
705+
K: Decodable<D> + Eq + TotalOrd,
706+
V: Decodable<D> + Eq
707+
> Decodable<D> for TreeMap<K, V> {
708+
fn decode(d: &D) -> TreeMap<K, V> {
709+
do d.read_map |len| {
710+
let mut map = TreeMap::new();
711+
for uint::range(0, len) |i| {
712+
let key = d.read_map_elt_key(i, || Decodable::decode(d));
713+
let val = d.read_map_elt_val(i, || Decodable::decode(d));
714+
map.insert(key, val);
715+
}
716+
map
717+
}
718+
}
719+
}
720+
721+
impl<
722+
S: Encoder,
723+
T: Encodable<S> + Eq + TotalOrd
724+
> Encodable<S> for TreeSet<T> {
725+
fn encode(&self, s: &S) {
726+
do s.emit_seq(self.len()) {
727+
let mut i = 0;
728+
for self.each |e| {
729+
s.emit_seq_elt(i, || e.encode(s));
730+
i += 1;
731+
}
732+
}
733+
}
734+
}
735+
736+
impl<
737+
D: Decoder,
738+
T: Decodable<D> + Eq + TotalOrd
739+
> Decodable<D> for TreeSet<T> {
740+
fn decode(d: &D) -> TreeSet<T> {
741+
do d.read_seq |len| {
742+
let mut set = TreeSet::new();
743+
for uint::range(0, len) |i| {
744+
set.insert(d.read_seq_elt(i, || Decodable::decode(d)));
745+
}
746+
set
747+
}
748+
}
749+
}
750+
569751
// ___________________________________________________________________________
570752
// Helper routines
571753
//

0 commit comments

Comments
 (0)