annotate orange/serialization/Serializer.d @ 8:613a0bb20207

Now works with dmd 1.062
author Jacob Carlborg <doob@me.com>
date Wed, 21 Jul 2010 13:44:08 +0200
parents 470ab5270d0c
children 99c52d46822a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2 * Copyright: Copyright (c) 2010 Jacob Carlborg.
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 * Version: Initial created: Jan 26, 2010
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module orange.serialization.Serializer;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 version (Tango)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
10 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
11 import tango.util.Convert : to, ConversionException;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
12 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
13
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
14 import orange.serialization._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
15 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 import orange.util._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
17
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 alias orange.util.CTFE.contains ctfeContains;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 private enum Mode
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 serializing,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 deserializing
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
26 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28 alias Mode.serializing serializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 alias Mode.deserializing deserializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 class Serializer (ArchiveType : IArchive)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 static assert(isArchive!(ArchiveType), format!(`The type "`, ArchiveType, `" does not implement the necessary methods to be an archive.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
36 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
38 ArchiveType archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
39 alias ArchiveType.DataType DataType;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
40
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
41 RegisterBase[string] serializers;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 RegisterBase[string] deserializers;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
43
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
44 size_t keyCounter;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
45
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46 bool hasBegunSerializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
47 bool hasBegunDeserializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 this ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 archive = new ArchiveType;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
54
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
55 void registerSerializer (T) (string type, void delegate (T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
56 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
57 serializers[type] = toSerializeRegisterWrapper(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
59
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 void registerSerializer (T) (string type, void function (T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
62 serializers[type] = toSerializeRegisterWrapper(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
63 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
64
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
65 void registerDeserializer (T) (string type, void delegate (ref T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
66 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67 deserializers[type] = toDeserializeRegisterWrapper(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
68 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
69
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
70 void registerDeserializer (T) (string type, void function (ref T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
71 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
72 deserializers[type] = toDeserializeRegisterWrapper(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
73 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
74
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
75 void reset ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
76 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
77 hasBegunSerializing = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
78 hasBegunDeserializing = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
79 resetCounters();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
80
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
81 archive.reset;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
82 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
83
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
84 DataType serialize (T) (T value, DataType key = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
85 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
86 if (!hasBegunSerializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
87 hasBegunSerializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
88
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
89 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
90 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
91
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
92 archive.beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
93
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
94 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
95 serializeTypeDef(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
96
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
97 static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
98 serializeObject(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
99
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
100 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
101 serializeStruct(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
102
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
103 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
104 serializeString(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
105
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
106 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
107 serializeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
108
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
109 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
110 serializeAssociativeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
111
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
112 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
113 serializePrimitive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
114
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
115 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
116 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
117 static if (isFunctionPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
118 goto error;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
121 serializePointer(value, key);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
122 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
123
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
124 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
125 serializeEnum(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
126
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
127 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
128 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
129 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
130 throw new SerializationException(format!(`The type "`, T, `" cannot be serialized.`), __FILE__, __LINE__);
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
131 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
132
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
133 return archive.data;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
135
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136 private void serializeObject (T) (T value, DataType key)
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
137 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138 triggerEvents(serializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 auto runtimeType = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
141
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
142 if (runtimeType in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144 auto wrapper = getSerializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
146 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
148 else static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
151 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
152 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
154 throw new SerializationException(`The object of the static type "` ~ T.stringof ~ `" have a different runtime type (` ~ runtimeType ~ `) and therefore needs to register a serializer for its type "` ~ runtimeType ~ `".`, __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
155
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
156 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
158 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
159 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
160 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162 private void serializeStruct (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
164 triggerEvents(serializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
166 auto type = toDataType(T.stringof);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
167
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168 if (type in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
169 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
170 auto wrapper = getSerializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
171 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
172 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176 static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
178
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
180 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
185
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186 private void serializeString (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
187 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
188 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
190
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
191 private void serializeArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
192 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 foreach (i, e ; value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195 archive.archive(e, toDataType(i));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
196 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
197 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
198
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
199 private void serializeAssociativeArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
201 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
202 foreach(k, v ; value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
203 archive.archive(v, toDataType(k));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
204 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
205 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
206
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 private void serializePointer (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 if (key in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
212 auto wrapper = getSerializerWrapper!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
213 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
214 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
215
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
216 else static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
217 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
220 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
221 static if (isVoid!(BaseTypeOfPointer!(T)))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222 throw new SerializationException(`The value with the key "` ~ to!(string)(key) ~ `"` ~ format!(` of the type "`, T, `" cannot be serialized on its own, either implement orange.serialization.Serializable.isSerializable or register a serializer.`), __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
225 serialize(*value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
226 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
227 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
228 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
229
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
230 private void serializeEnum (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
232 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
233 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
234
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
235 private void serializePrimitive (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237 archive.archive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
238 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
239
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
240 private void serializeTypeDef (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
241 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
242 archive.archive(value, key, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
243 serialize!(BaseTypeOfTypeDef!(T))(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
244 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
245 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
247 T deserialize (T) (DataType data, DataType key = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
248 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
249 if (hasBegunSerializing && !hasBegunDeserializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
250 resetCounters();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
251
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252 if (!hasBegunDeserializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253 hasBegunDeserializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
254
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
255 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
256 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258 archive.beginUnarchiving(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
259 return deserializeInternal!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262 private T deserializeInternal (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
265 return deserializeTypeDef!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
266
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
267 else static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
268 return deserializeObject!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
269
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
271 return deserializeStruct!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
273 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
274 return deserializeString!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
276 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
277 return deserializeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
278
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
279 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
280 return deserializeAssociativeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
281
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
282 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
283 return deserializePrimitive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
284
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
285 else static if (isPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
286 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
287 static if (isFunctionPointer!(T))
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
288 goto error;
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
289
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
290 return deserializePointer!(T)(key);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
291 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
292
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
293 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
294 return deserializeEnum!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
295
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
296 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
297 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
298 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
299 throw new SerializationException(format!(`The type "`, T, `" cannot be deserialized.`), __FILE__, __LINE__);
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
300 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
303 private T deserializeObject (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
304 {
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
305 T value = archive.unarchive!(T)(key, (T value) {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
306 triggerEvents(deserializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
307 auto runtimeType = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
308
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309 if (runtimeType in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
310 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 auto wrapper = getDeserializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
313 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315 else static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
318 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
320 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321 throw new SerializationException(`The object of the static type "` ~ T.stringof ~ `" have a different runtime type (` ~ runtimeType ~ `) and therefore needs to register a deserializer for its type "` ~ runtimeType ~ `".`, __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
322
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
323 objectStructDeserializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
324 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
325 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
326
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
327 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
328 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
329
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
331 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
332
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
333 private T deserializeStruct (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
334 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
336 triggerEvents(deserializing, value, {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
337 auto type = toDataType(T.stringof);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
338
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
339 if (type in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
340 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 auto wrapper = getDeserializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
345 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
346 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
350 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
351 objectStructDeserializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
352 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
353 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
354
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
355 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
359 private T deserializeString (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
360 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
363
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
364 private T deserializeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
365 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
366 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 foreach (i, ref e ; value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368 e = archive.unarchive!(typeof(e))(toDataType(i));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
371 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
373
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
374 private T deserializeAssociativeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
375 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377 foreach (k, v ; archive.unarchiveAssociativeArrayVisitor!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378 value[k] = v;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
381 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
382 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384 private T deserializePointer (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
387 if (key in deserializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389 auto wrapper = getDeserializerWrapper!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
391 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
392
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
393 else static if (isSerializable!(T, ArchiveType))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
394 value.fromData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398 static if (isVoid!(BaseTypeOfPointer!(T)))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 throw new SerializationException(`The value with the key "` ~ to!(string)(key) ~ `"` ~ format!(` of the type "`, T, `" cannot be deserialized on its own, either implement orange.serialization.Serializable.isSerializable or register a deserializer.`), __FILE__, __LINE__);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
401 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
402 *value = deserializeInternal!(BaseTypeOfPointer!(T))(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
403 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
404
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
405 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
406 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
408
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
409 private T deserializeEnum (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
410 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
411 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
412 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
413
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
414 private T deserializePrimitive (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
415 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
416 return archive.unarchive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
417 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
418
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
419 private T deserializeTypeDef (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
420 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
421 return archive.unarchive!(T)(key, (T value) {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
422 return deserializeInternal!(BaseTypeOfTypeDef!(T))(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
423 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
424 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
425
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
426 private void objectStructSerializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
427 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
428 static assert(isStruct!(T) || isObject!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
429 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
430
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
431 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
432 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
433 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
434
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
435 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
436 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
437 alias typeof(T.tupleof[i]) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
438 Type v = value.tupleof[i];
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
439 serialize(v, toDataType(field));
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
440 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
441 }
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
442
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
443 static if (isObject!(T) && !is(T == Object))
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
444 serializeBaseTypes(value);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
445 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
446
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
447 private void objectStructDeserializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
448 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
449 static assert(isStruct!(T) || isObject!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
450 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
451
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
452 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
453 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
454 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
455
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
456 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
457 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
458 alias TypeOfField!(T, field) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
459 auto fieldValue = deserializeInternal!(Type)(toDataType(field));
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
460 value.tupleof[i] = fieldValue;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
461 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
462 }
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
463
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
464 static if (isObject!(T) && !is(T == Object))
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
465 deserializeBaseTypes(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
466 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
467
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
468 private void serializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
469 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
470 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
471
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
472 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
473 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
474 archive.archiveBaseClass!(Base)(nextKey);
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
475 Base base = value;
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
476 objectStructSerializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
477 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
478 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
479
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
480 private void deserializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
481 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
482 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
483
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
484 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
485 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
486 archive.unarchiveBaseClass!(Base)(nextKey);
4
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
487 Base base = value;
470ab5270d0c Simplified the implementation of RegisterWrapper. Fixed: the base class of an object was not serialized
Jacob Carlborg <doob@me.com>
parents: 3
diff changeset
488 objectStructDeserializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
489 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
490 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
491
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
492 private SerializeRegisterWrapper!(T, ArchiveType) getSerializerWrapper (T) (string type)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
493 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
494 auto wrapper = cast(SerializeRegisterWrapper!(T, ArchiveType)) serializers[type];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
495
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
496 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
497 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
498
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
501
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
502 private DeserializeRegisterWrapper!(T, ArchiveType) getDeserializerWrapper (T) (string type)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
503 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
504 auto wrapper = cast(DeserializeRegisterWrapper!(T, ArchiveType)) deserializers[type];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
505
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
506 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
507 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
508
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
511
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512 private SerializeRegisterWrapper!(T, ArchiveType) toSerializeRegisterWrapper (T) (void delegate (T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
513 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
514 return new SerializeRegisterWrapper!(T, ArchiveType)(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
516
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
517 private SerializeRegisterWrapper!(T, ArchiveType) toSerializeRegisterWrapper (T) (void function (T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
519 return new SerializeRegisterWrapper!(T, ArchiveType)(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
520 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
521
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
522 private DeserializeRegisterWrapper!(T, ArchiveType) toDeserializeRegisterWrapper (T) (void delegate (ref T, Serializer, DataType) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
523 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
524 return new DeserializeRegisterWrapper!(T, ArchiveType)(dg);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
525 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
526
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
527 private DeserializeRegisterWrapper!(T, ArchiveType) toDeserializeRegisterWrapper (T) (void function (ref T, Serializer, DataType) func)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
528 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
529 return new DeserializeRegisterWrapper!(T, ArchiveType)(func);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
530 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
531
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
532 private DataType toDataType (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
533 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
534 try
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
535 return to!(DataType)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
536
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
537 catch (ConversionException e)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
538 throw new SerializationException(e);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
539 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
540
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
541 private bool isBaseClass (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
542 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
543 auto name = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
544 auto index = name.lastIndexOf('.');
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
545
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
546 return T.stringof != name[index + 1 .. $];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
547 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
548
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 private DataType nextKey ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
550 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
551 return toDataType(keyCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
552 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
553
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
554 private void resetCounters ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
555 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
556 keyCounter = 0;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
557 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
558
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
559 private void triggerEvent (string name, T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
560 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
561 static assert (isObject!(T) || isStruct!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
562
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
563 foreach (i, dummy ; typeof(T.tupleof))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
564 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
565 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
566
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
567 static if (field == name)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
568 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
569 alias TypeOfField!(T, field) Type;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570 auto event = getValueOfField!(T, Type, field)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571 event(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
575
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
576 private void triggerEvents (T) (Mode mode, T value, void delegate () dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
577 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
578 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
579 triggerEvent!(onSerializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
580
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
581 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
582 triggerEvent!(onDeserializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
583
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
584 dg();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
585
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
586 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
587 triggerEvent!(onSerializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
588
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
589 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
590 triggerEvent!(onDeserializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
591 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
592
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
593 private static string[] collectAnnotations (string name, T) ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
594 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
595 static assert (isObject!(T) || isStruct!(T), format!(`The given value of the type "`, T, `" is not a valid type, the only valid types for this method are objects and structs.`));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
596
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
597 string[] annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
598
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
599 foreach (i, type ; typeof(T.tupleof))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
600 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
601 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
602
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
603 static if (field == name)
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
604 annotations ~= type.field;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
605 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
606
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
607 return annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
608 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
609 }