@@ -17,7 +17,10 @@ Core encoding and decoding interfaces.
1717#[ forbid( non_camel_case_types) ] ;
1818
1919use 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
2225pub 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+
534564impl <
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