Mercurial > projects > orange
comparison orange/serialization/RegisterWrapper.d @ 4:470ab5270d0c
Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
author | Jacob Carlborg <doob@me.com> |
---|---|
date | Mon, 31 May 2010 19:20:14 +0200 |
parents | f7b078e85f7f |
children | 9f6064f9505a |
comparison
equal
deleted
inserted
replaced
3:3c155e4c3d56 | 4:470ab5270d0c |
---|---|
17 class SerializeRegisterWrapper (T, ArchiveType : IArchive) : RegisterBase | 17 class SerializeRegisterWrapper (T, ArchiveType : IArchive) : RegisterBase |
18 { | 18 { |
19 private alias Serializer!(ArchiveType) SerializerType; | 19 private alias Serializer!(ArchiveType) SerializerType; |
20 private alias SerializerType.DataType DataType; | 20 private alias SerializerType.DataType DataType; |
21 private void delegate (T, SerializerType, DataType) dg; | 21 private void delegate (T, SerializerType, DataType) dg; |
22 private void function (T, SerializerType, DataType) func; | 22 private bool isDelegate; |
23 | 23 |
24 this (void delegate (T, SerializerType, DataType) dg) | 24 this (void delegate (T, SerializerType, DataType) dg) |
25 { | 25 { |
26 isDelegate = true; | |
26 this.dg = dg; | 27 this.dg = dg; |
27 } | 28 } |
28 | 29 |
29 this (void function (T, SerializerType, DataType) func) | 30 this (void function (T, SerializerType, DataType) func) |
30 { | 31 { |
31 this.func = func; | 32 dg.funcptr = func; |
32 } | 33 } |
33 | 34 |
34 void opCall (T value, SerializerType archive, DataType key) | 35 void opCall (T value, SerializerType archive, DataType key) |
35 { | 36 { |
36 if (dg) | 37 if (dg && isDelegate) |
37 dg(value, archive, key); | 38 dg(value, archive, key); |
38 | 39 |
39 else if (func) | 40 else if (dg) |
40 func(value, archive, key); | 41 dg.funcptr(value, archive, key); |
41 } | 42 } |
42 } | 43 } |
43 | 44 |
44 class DeserializeRegisterWrapper (T, ArchiveType : IArchive) : RegisterBase | 45 class DeserializeRegisterWrapper (T, ArchiveType : IArchive) : RegisterBase |
45 { | 46 { |
46 private alias Serializer!(ArchiveType) SerializerType; | 47 private alias Serializer!(ArchiveType) SerializerType; |
47 private alias SerializerType.DataType DataType; | 48 private alias SerializerType.DataType DataType; |
48 private void delegate (ref T, SerializerType, DataType) dg; | 49 private void delegate (ref T, SerializerType, DataType) dg; |
49 private void function (ref T, SerializerType, DataType) func; | 50 private bool isDelegate; |
50 | 51 |
51 this (void delegate (ref T, SerializerType, DataType) dg) | 52 this (void delegate (ref T, SerializerType, DataType) dg) |
52 { | 53 { |
54 isDelegate = true; | |
53 this.dg = dg; | 55 this.dg = dg; |
54 } | 56 } |
55 | 57 |
56 this (void function (ref T, SerializerType, DataType) func) | 58 this (void function (ref T, SerializerType, DataType) func) |
57 { | 59 { |
58 this.func = func; | 60 dg.funcptr = func; |
59 } | 61 } |
60 | 62 |
61 void opCall (ref T value, SerializerType archive, DataType key) | 63 void opCall (ref T value, SerializerType archive, DataType key) |
62 { | 64 { |
63 if (dg) | 65 if (dg && isDelegate) |
64 dg(value, archive, key); | 66 dg(value, archive, key); |
65 | 67 |
66 if (func) | 68 if (dg) |
67 func(value, archive, key); | 69 dg.funcptr(value, archive, key); |
68 } | 70 } |
69 } | 71 } |