Skip to content

Commit d917422

Browse files
committed
first (functional) version of the auto_serialize syntax ext
1 parent 06c8acd commit d917422

19 files changed

+855
-540
lines changed

src/libcore/core.rc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export uint, u8, u16, u32, u64;
3131
export float, f32, f64;
3232
export box, char, str, ptr, vec, bool;
3333
export either, option, result, iter;
34-
export libc, os, io, run, rand, sys, unsafe, logging;
34+
export libc, os, ctypes, io, run, rand, sys, unsafe, logging, serialization;
3535
export comm, task, future;
3636
export extfmt;
3737
export tuple;
@@ -88,6 +88,7 @@ mod cmath;
8888
mod sys;
8989
mod unsafe;
9090
mod logging;
91+
mod serialization;
9192

9293
// Concurrency
9394
mod comm;

src/libcore/serialization.rs

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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+

src/libcore/uint.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,14 @@ fn compl(i: uint) -> uint {
192192
max_value ^ i
193193
}
194194

195+
fn serialize<S: serialization::serializer>(s: S, v: uint) {
196+
s.emit_uint(v);
197+
}
198+
199+
fn deserialize<D: serialization::deserializer>(d: D) -> uint {
200+
d.read_uint()
201+
}
202+
195203
#[cfg(test)]
196204
mod tests {
197205

src/libcore/vec.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ fn map<T, U>(v: [T], f: fn(T) -> U) -> [U] {
406406
}
407407

408408
fn flat_map<T, U>(v: [T], f: fn(T) -> [U]) -> [U] {
409-
let result = [];
409+
let mut result = [];
410410
for elem: T in v { result += f(elem); }
411411
ret result;
412412
}

0 commit comments

Comments
 (0)