|
| 1 | +export serializer; |
| 2 | +export serializer_helpers; |
| 3 | +export deserializer; |
| 4 | +export deserializer_helpers; |
| 5 | + |
| 6 | +/* |
| 7 | +Core serialization interfaces. |
| 8 | +*/ |
| 9 | + |
| 10 | +iface serializer { |
| 11 | + // Primitive types: |
| 12 | + fn emit_nil(); |
| 13 | + fn emit_uint(v: uint); |
| 14 | + fn emit_u64(v: u64); |
| 15 | + fn emit_u32(v: u32); |
| 16 | + fn emit_u16(v: u16); |
| 17 | + fn emit_u8(v: u8); |
| 18 | + fn emit_int(v: int); |
| 19 | + fn emit_i64(v: i64); |
| 20 | + fn emit_i32(v: i32); |
| 21 | + fn emit_i16(v: i16); |
| 22 | + fn emit_i8(v: i8); |
| 23 | + fn emit_bool(v: bool); |
| 24 | + fn emit_float(v: float); |
| 25 | + fn emit_f64(v: f64); |
| 26 | + fn emit_f32(v: f32); |
| 27 | + fn emit_str(v: str); |
| 28 | + |
| 29 | + // Compound types: |
| 30 | + fn emit_enum(name: str, f: fn()); |
| 31 | + fn emit_enum_variant(v_name: str, v_id: uint, sz: uint, f: fn()); |
| 32 | + fn emit_enum_variant_arg(idx: uint, f: fn()); |
| 33 | + fn emit_vec(len: uint, f: fn()); |
| 34 | + fn emit_vec_elt(idx: uint, f: fn()); |
| 35 | + fn emit_box(f: fn()); |
| 36 | + fn emit_uniq(f: fn()); |
| 37 | + fn emit_rec(f: fn()); |
| 38 | + fn emit_rec_field(f_name: str, f_idx: uint, f: fn()); |
| 39 | + fn emit_tup(sz: uint, f: fn()); |
| 40 | + fn emit_tup_elt(idx: uint, f: fn()); |
| 41 | +} |
| 42 | + |
| 43 | +iface deserializer { |
| 44 | + // Primitive types: |
| 45 | + fn read_nil() -> (); |
| 46 | + |
| 47 | + fn read_uint() -> uint; |
| 48 | + fn read_u64() -> u64; |
| 49 | + fn read_u32() -> u32; |
| 50 | + fn read_u16() -> u16; |
| 51 | + fn read_u8() -> u8; |
| 52 | + |
| 53 | + fn read_int() -> int; |
| 54 | + fn read_i64() -> i64; |
| 55 | + fn read_i32() -> i32; |
| 56 | + fn read_i16() -> i16; |
| 57 | + fn read_i8() -> i8; |
| 58 | + |
| 59 | + |
| 60 | + fn read_bool() -> bool; |
| 61 | + |
| 62 | + fn read_str() -> str; |
| 63 | + |
| 64 | + fn read_f64() -> f64; |
| 65 | + fn read_f32() -> f32; |
| 66 | + fn read_float() -> float; |
| 67 | + |
| 68 | + // Compound types: |
| 69 | + fn read_enum<T:copy>(name: str, f: fn() -> T) -> T; |
| 70 | + fn read_enum_variant<T:copy>(f: fn(uint) -> T) -> T; |
| 71 | + fn read_enum_variant_arg<T:copy>(idx: uint, f: fn() -> T) -> T; |
| 72 | + fn read_vec<T:copy>(f: fn(uint) -> T) -> T; |
| 73 | + fn read_vec_elt<T:copy>(idx: uint, f: fn() -> T) -> T; |
| 74 | + fn read_box<T:copy>(f: fn() -> T) -> T; |
| 75 | + fn read_uniq<T:copy>(f: fn() -> T) -> T; |
| 76 | + fn read_rec<T:copy>(f: fn() -> T) -> T; |
| 77 | + fn read_rec_field<T:copy>(f_name: str, f_idx: uint, f: fn() -> T) -> T; |
| 78 | + fn read_tup<T:copy>(sz: uint, f: fn() -> T) -> T; |
| 79 | + fn read_tup_elt<T:copy>(idx: uint, f: fn() -> T) -> T; |
| 80 | +} |
| 81 | + |
| 82 | +// ___________________________________________________________________________ |
| 83 | +// Helper routines |
| 84 | +// |
| 85 | +// These should eventually be coded as traits. |
| 86 | + |
| 87 | +fn emit_from_vec<S: serializer, T>(s: S, v: [T], f: fn(T)) { |
| 88 | + s.emit_vec(vec::len(v)) {|| |
| 89 | + vec::iteri(v) {|i,e| |
| 90 | + s.emit_vec_elt(i) {|| |
| 91 | + f(e) |
| 92 | + } |
| 93 | + } |
| 94 | + } |
| 95 | +} |
| 96 | + |
| 97 | +fn read_to_vec<D: deserializer, T>(d: D, f: fn() -> T) -> [T] { |
| 98 | + d.read_vec {|len| |
| 99 | + vec::init_fn(len) {|i| |
| 100 | + d.read_vec_elt(i) {|| f() } |
| 101 | + } |
| 102 | + } |
| 103 | +} |
| 104 | + |
| 105 | +impl serializer_helpers<S: serializer> for S { |
| 106 | + fn emit_from_vec<T>(v: [T], f: fn(T)) { |
| 107 | + emit_from_vec(self, v, f) |
| 108 | + } |
| 109 | +} |
| 110 | + |
| 111 | +impl deserializer_helpers<D: deserializer> for D { |
| 112 | + fn read_to_vec<T>(f: fn() -> T) -> [T] { |
| 113 | + read_to_vec(self, f) |
| 114 | + } |
| 115 | +} |
| 116 | + |
0 commit comments