Skip to content

Commit 7555a0f

Browse files
ericktgraydon
authored andcommitted
---
yaml --- r: 24177 b: refs/heads/master c: 780b23a h: refs/heads/master i: 24175: 9b6176b v: v3
1 parent 7f79fb3 commit 7555a0f

File tree

3 files changed

+386
-2
lines changed

3 files changed

+386
-2
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 75935cea7f43c317fc876fe8f914c11ff43d1483
2+
refs/heads/master: 780b23af73540dad0ec78488949bbcd380efd71e
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: cd6f24f9d14ac90d167386a56e7a6ac1f0318195
55
refs/heads/try: ffbe0e0e00374358b789b0037bcb3a577cd218be

trunk/src/libstd/serialization2.rs

Lines changed: 382 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,382 @@
1+
//! Support code for serialization.
2+
3+
/*
4+
Core serialization interfaces.
5+
*/
6+
7+
trait Serializer {
8+
// Primitive types:
9+
fn emit_nil();
10+
fn emit_uint(v: uint);
11+
fn emit_u64(v: u64);
12+
fn emit_u32(v: u32);
13+
fn emit_u16(v: u16);
14+
fn emit_u8(v: u8);
15+
fn emit_int(v: int);
16+
fn emit_i64(v: i64);
17+
fn emit_i32(v: i32);
18+
fn emit_i16(v: i16);
19+
fn emit_i8(v: i8);
20+
fn emit_bool(v: bool);
21+
fn emit_float(v: float);
22+
fn emit_f64(v: f64);
23+
fn emit_f32(v: f32);
24+
fn emit_str(v: &str);
25+
26+
// Compound types:
27+
fn emit_enum(name: &str, f: fn());
28+
fn emit_enum_variant(v_name: &str, v_id: uint, sz: uint, f: fn());
29+
fn emit_enum_variant_arg(idx: uint, f: fn());
30+
fn emit_vec(len: uint, f: fn());
31+
fn emit_vec_elt(idx: uint, f: fn());
32+
fn emit_box(f: fn());
33+
fn emit_uniq(f: fn());
34+
fn emit_rec(f: fn());
35+
fn emit_rec_field(f_name: &str, f_idx: uint, f: fn());
36+
fn emit_tup(sz: uint, f: fn());
37+
fn emit_tup_elt(idx: uint, f: fn());
38+
}
39+
40+
trait Deserializer {
41+
// Primitive types:
42+
fn read_nil() -> ();
43+
fn read_uint() -> uint;
44+
fn read_u64() -> u64;
45+
fn read_u32() -> u32;
46+
fn read_u16() -> u16;
47+
fn read_u8() -> u8;
48+
fn read_int() -> int;
49+
fn read_i64() -> i64;
50+
fn read_i32() -> i32;
51+
fn read_i16() -> i16;
52+
fn read_i8() -> i8;
53+
fn read_bool() -> bool;
54+
fn read_f64() -> f64;
55+
fn read_f32() -> f32;
56+
fn read_float() -> float;
57+
fn read_str() -> ~str;
58+
59+
// Compound types:
60+
fn read_enum<T>(name: ~str, f: fn() -> T) -> T;
61+
fn read_enum_variant<T>(f: fn(uint) -> T) -> T;
62+
fn read_enum_variant_arg<T>(idx: uint, f: fn() -> T) -> T;
63+
fn read_vec<T>(f: fn(uint) -> T) -> T;
64+
fn read_vec_elt<T>(idx: uint, f: fn() -> T) -> T;
65+
fn read_box<T>(f: fn() -> T) -> T;
66+
fn read_uniq<T>(f: fn() -> T) -> T;
67+
fn read_rec<T>(f: fn() -> T) -> T;
68+
fn read_rec_field<T>(f_name: ~str, f_idx: uint, f: fn() -> T) -> T;
69+
fn read_tup<T>(sz: uint, f: fn() -> T) -> T;
70+
fn read_tup_elt<T>(idx: uint, f: fn() -> T) -> T;
71+
}
72+
73+
trait Serializable {
74+
fn serialize<S: Serializer>(s: S);
75+
static fn deserialize<D: Deserializer>(d: D) -> self;
76+
}
77+
78+
impl uint: Serializable {
79+
fn serialize<S: Serializer>(s: S) { s.emit_uint(self) }
80+
static fn deserialize<D: Deserializer>(d: D) -> uint { d.read_uint() }
81+
}
82+
83+
impl u8: Serializable {
84+
fn serialize<S: Serializer>(s: S) { s.emit_u8(self) }
85+
static fn deserialize<D: Deserializer>(d: D) -> u8 { d.read_u8() }
86+
}
87+
88+
impl u16: Serializable {
89+
fn serialize<S: Serializer>(s: S) { s.emit_u16(self) }
90+
static fn deserialize<D: Deserializer>(d: D) -> u16 { d.read_u16() }
91+
}
92+
93+
impl u32: Serializable {
94+
fn serialize<S: Serializer>(s: S) { s.emit_u32(self) }
95+
static fn deserialize<D: Deserializer>(d: D) -> u32 { d.read_u32() }
96+
}
97+
98+
impl u64: Serializable {
99+
fn serialize<S: Serializer>(s: S) { s.emit_u64(self) }
100+
static fn deserialize<D: Deserializer>(d: D) -> u64 { d.read_u64() }
101+
}
102+
103+
impl int: Serializable {
104+
fn serialize<S: Serializer>(s: S) { s.emit_int(self) }
105+
static fn deserialize<D: Deserializer>(d: D) -> int { d.read_int() }
106+
}
107+
108+
impl i8: Serializable {
109+
fn serialize<S: Serializer>(s: S) { s.emit_i8(self) }
110+
static fn deserialize<D: Deserializer>(d: D) -> i8 { d.read_i8() }
111+
}
112+
113+
impl i16: Serializable {
114+
fn serialize<S: Serializer>(s: S) { s.emit_i16(self) }
115+
static fn deserialize<D: Deserializer>(d: D) -> i16 { d.read_i16() }
116+
}
117+
118+
impl i32: Serializable {
119+
fn serialize<S: Serializer>(s: S) { s.emit_i32(self) }
120+
static fn deserialize<D: Deserializer>(d: D) -> i32 { d.read_i32() }
121+
}
122+
123+
impl i64: Serializable {
124+
fn serialize<S: Serializer>(s: S) { s.emit_i64(self) }
125+
static fn deserialize<D: Deserializer>(d: D) -> i64 { d.read_i64() }
126+
}
127+
128+
impl ~str: Serializable {
129+
fn serialize<S: Serializer>(s: S) { s.emit_str(self) }
130+
static fn deserialize<D: Deserializer>(d: D) -> ~str { d.read_str() }
131+
}
132+
133+
impl float: Serializable {
134+
fn serialize<S: Serializer>(s: S) { s.emit_float(self) }
135+
static fn deserialize<D: Deserializer>(d: D) -> float { d.read_float() }
136+
}
137+
138+
impl f32: Serializable {
139+
fn serialize<S: Serializer>(s: S) { s.emit_f32(self) }
140+
static fn deserialize<D: Deserializer>(d: D) -> f32 { d.read_f32() }
141+
}
142+
143+
impl f64: Serializable {
144+
fn serialize<S: Serializer>(s: S) { s.emit_f64(self) }
145+
static fn deserialize<D: Deserializer>(d: D) -> f64 { d.read_f64() }
146+
}
147+
148+
impl bool: Serializable {
149+
fn serialize<S: Serializer>(s: S) { s.emit_bool(self) }
150+
static fn deserialize<D: Deserializer>(d: D) -> bool { d.read_bool() }
151+
}
152+
153+
impl (): Serializable {
154+
fn serialize<S: Serializer>(s: S) { s.emit_nil() }
155+
static fn deserialize<D: Deserializer>(d: D) -> () { d.read_nil() }
156+
}
157+
158+
impl<T: Serializable> @T: Serializable {
159+
fn serialize<S: Serializer>(s: S) {
160+
s.emit_box(|| (*self).serialize(s))
161+
}
162+
163+
static fn deserialize<D: Deserializer>(d: D) -> @T {
164+
d.read_box(|| @deserialize(d))
165+
}
166+
}
167+
168+
impl<T: Serializable> ~T: Serializable {
169+
fn serialize<S: Serializer>(s: S) {
170+
s.emit_uniq(|| (*self).serialize(s))
171+
}
172+
173+
static fn deserialize<D: Deserializer>(d: D) -> ~T {
174+
d.read_uniq(|| ~deserialize(d))
175+
}
176+
}
177+
178+
impl<T: Serializable> ~[T]: Serializable {
179+
fn serialize<S: Serializer>(s: S) {
180+
do s.emit_vec(self.len()) {
181+
for self.eachi |i, e| {
182+
s.emit_vec_elt(i, || e.serialize(s))
183+
}
184+
}
185+
}
186+
187+
static fn deserialize<D: Deserializer>(d: D) -> ~[T] {
188+
do d.read_vec |len| {
189+
do vec::from_fn(len) |i| {
190+
d.read_vec_elt(i, || deserialize(d))
191+
}
192+
}
193+
}
194+
}
195+
196+
impl<T: Serializable> Option<T>: Serializable {
197+
fn serialize<S: Serializer>(s: S) {
198+
do s.emit_enum(~"option") {
199+
match self {
200+
None => do s.emit_enum_variant(~"none", 0u, 0u) {
201+
},
202+
203+
Some(v) => do s.emit_enum_variant(~"some", 1u, 1u) {
204+
s.emit_enum_variant_arg(0u, || v.serialize(s))
205+
}
206+
}
207+
}
208+
}
209+
210+
static fn deserialize<D: Deserializer>(d: D) -> Option<T> {
211+
do d.read_enum(~"option") {
212+
do d.read_enum_variant |i| {
213+
match i {
214+
0 => None,
215+
1 => Some(d.read_enum_variant_arg(0u, || deserialize(d))),
216+
_ => fail(#fmt("Bad variant for option: %u", i))
217+
}
218+
}
219+
}
220+
}
221+
}
222+
223+
impl<
224+
T0: Serializable,
225+
T1: Serializable
226+
> (T0, T1): Serializable {
227+
fn serialize<S: Serializer>(s: S) {
228+
match self {
229+
(t0, t1) => {
230+
do s.emit_tup(2) {
231+
s.emit_tup_elt(0, || t0.serialize(s));
232+
s.emit_tup_elt(1, || t1.serialize(s));
233+
}
234+
}
235+
}
236+
}
237+
238+
static fn deserialize<D: Deserializer>(d: D) -> (T0, T1) {
239+
do d.read_tup(2) {
240+
(
241+
d.read_tup_elt(0, || deserialize(d)),
242+
d.read_tup_elt(1, || deserialize(d))
243+
)
244+
}
245+
}
246+
}
247+
248+
impl<
249+
T0: Serializable,
250+
T1: Serializable,
251+
T2: Serializable
252+
> (T0, T1, T2): Serializable {
253+
fn serialize<S: Serializer>(s: S) {
254+
match self {
255+
(t0, t1, t2) => {
256+
do s.emit_tup(3) {
257+
s.emit_tup_elt(0, || t0.serialize(s));
258+
s.emit_tup_elt(1, || t1.serialize(s));
259+
s.emit_tup_elt(2, || t2.serialize(s));
260+
}
261+
}
262+
}
263+
}
264+
265+
static fn deserialize<D: Deserializer>(d: D) -> (T0, T1, T2) {
266+
do d.read_tup(3) {
267+
(
268+
d.read_tup_elt(0, || deserialize(d)),
269+
d.read_tup_elt(1, || deserialize(d)),
270+
d.read_tup_elt(2, || deserialize(d))
271+
)
272+
}
273+
}
274+
}
275+
276+
impl<
277+
T0: Serializable,
278+
T1: Serializable,
279+
T2: Serializable,
280+
T3: Serializable
281+
> (T0, T1, T2, T3): Serializable {
282+
fn serialize<S: Serializer>(s: S) {
283+
match self {
284+
(t0, t1, t2, t3) => {
285+
do s.emit_tup(4) {
286+
s.emit_tup_elt(0, || t0.serialize(s));
287+
s.emit_tup_elt(1, || t1.serialize(s));
288+
s.emit_tup_elt(2, || t2.serialize(s));
289+
s.emit_tup_elt(3, || t3.serialize(s));
290+
}
291+
}
292+
}
293+
}
294+
295+
static fn deserialize<D: Deserializer>(d: D) -> (T0, T1, T2, T3) {
296+
do d.read_tup(4) {
297+
(
298+
d.read_tup_elt(0, || deserialize(d)),
299+
d.read_tup_elt(1, || deserialize(d)),
300+
d.read_tup_elt(2, || deserialize(d)),
301+
d.read_tup_elt(3, || deserialize(d))
302+
)
303+
}
304+
}
305+
}
306+
307+
impl<
308+
T0: Serializable,
309+
T1: Serializable,
310+
T2: Serializable,
311+
T3: Serializable,
312+
T4: Serializable
313+
> (T0, T1, T2, T3, T4): Serializable {
314+
fn serialize<S: Serializer>(s: S) {
315+
match self {
316+
(t0, t1, t2, t3, t4) => {
317+
do s.emit_tup(5) {
318+
s.emit_tup_elt(0, || t0.serialize(s));
319+
s.emit_tup_elt(1, || t1.serialize(s));
320+
s.emit_tup_elt(2, || t2.serialize(s));
321+
s.emit_tup_elt(3, || t3.serialize(s));
322+
s.emit_tup_elt(4, || t4.serialize(s));
323+
}
324+
}
325+
}
326+
}
327+
328+
static fn deserialize<D: Deserializer>(d: D) -> (T0, T1, T2, T3, T4) {
329+
do d.read_tup(5) {
330+
(
331+
d.read_tup_elt(0, || deserialize(d)),
332+
d.read_tup_elt(1, || deserialize(d)),
333+
d.read_tup_elt(2, || deserialize(d)),
334+
d.read_tup_elt(3, || deserialize(d)),
335+
d.read_tup_elt(4, || deserialize(d))
336+
)
337+
}
338+
}
339+
}
340+
341+
// ___________________________________________________________________________
342+
// Helper routines
343+
//
344+
// In some cases, these should eventually be coded as traits.
345+
346+
fn emit_from_vec<S: Serializer, T>(s: S, v: ~[T], f: fn(T)) {
347+
do s.emit_vec(v.len()) {
348+
for v.eachi |i, e| {
349+
do s.emit_vec_elt(i) {
350+
f(*e)
351+
}
352+
}
353+
}
354+
}
355+
356+
fn read_to_vec<D: Deserializer, T: Copy>(d: D, f: fn() -> T) -> ~[T] {
357+
do d.read_vec |len| {
358+
do vec::from_fn(len) |i| {
359+
d.read_vec_elt(i, || f())
360+
}
361+
}
362+
}
363+
364+
trait SerializerHelpers {
365+
fn emit_from_vec<T>(v: ~[T], f: fn(T));
366+
}
367+
368+
impl<S: Serializer> S: SerializerHelpers {
369+
fn emit_from_vec<T>(v: ~[T], f: fn(T)) {
370+
emit_from_vec(self, v, f)
371+
}
372+
}
373+
374+
trait DeserializerHelpers {
375+
fn read_to_vec<T: Copy>(f: fn() -> T) -> ~[T];
376+
}
377+
378+
impl<D: Deserializer> D: DeserializerHelpers {
379+
fn read_to_vec<T: Copy>(f: fn() -> T) -> ~[T] {
380+
read_to_vec(self, f)
381+
}
382+
}

0 commit comments

Comments
 (0)