annotate orange/serialization/Serializer.d @ 25:b51e953f79eb experimental

Second step in refactoring the API.
author Jacob Carlborg <doob@me.com>
date Wed, 06 Oct 2010 16:18:02 +0200
parents 9a575087b961
children 78e5fef4bbf2
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)
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
10 import tango.util.Convert : to, ConversionException;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
11
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
12 else
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
13 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
14 import std.conv;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 8
diff changeset
15 alias ConvError ConversionException;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
17
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18 import orange.serialization._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 import orange.util._;
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
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 alias orange.util.CTFE.contains ctfeContains;
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
25
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
26 enum Mode
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28 serializing,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 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 alias Mode.serializing serializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 alias Mode.deserializing deserializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
36 class Serializer
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
38 alias void delegate (ArchiveException exception, IArchive.IDataType data) ErrorCallback;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
39 alias IArchive.IDataType DataType;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
40
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
41 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
43 ErrorCallback errorCallback_;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
44 IArchive archive;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
45
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
46 size_t keyCounter;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
47 size_t idCounter;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49 RegisterBase[string] serializers;
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
50 RegisterBase[string] deserializers;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 bool hasBegunSerializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 bool hasBegunDeserializing;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
54
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
55 void delegate (ArchiveException exception, DataType data) throwOnErrorCallback;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
56 void delegate (ArchiveException exception, DataType data) doNothingOnErrorCallback;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
57 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
59 this (IArchive archive)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
61 this.archive = archive;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
62
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
63 throwOnErrorCallback = (ArchiveException exception, IArchive.IDataType data) { throw exception; };
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
64 doNothingOnErrorCallback = (ArchiveException exception, IArchive.IDataType data) { /* do nothing */ };
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
65
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
66 setThrowOnErrorCallback();
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
68
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
69 ErrorCallback errorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
70 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
71 return errorCallback_;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
72 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
73
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
74 ErrorCallback errorCallback (ErrorCallback errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
75 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
76 return errorCallback_ = errorCallback;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
77 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
78
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
79 void setThrowOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
80 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
81 errorCallback = throwOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
82 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
83
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
84 void setDoNothingOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
85 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
86 errorCallback = doNothingOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
87 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
88
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
89 DataType serialize (T) (T value, string key = null)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
90 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
91 if (!hasBegunSerializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
92 hasBegunSerializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
93
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
94 serializeInternal(value, key);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
95 archive.postProcess;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
96
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
97 return archive.data;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
98 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
99
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
100 private void serializeInternal (T) (T value, string key = null)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
101 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
102 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
103 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
104
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
105 archive.beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
106
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
107 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
108 serializeTypeDef(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
109
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
110 static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
111 serializeObject(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
112
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
113 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
114 serializeStruct(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
115
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
116 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
117 serializeString(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
118
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 serializeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
121
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
122 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
123 serializeAssociativeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
124
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
125 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
126 serializePrimitive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
127
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
128 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
129 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
130 static if (isFunctionPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
131 goto error;
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 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134 serializePointer(value, key);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
135 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
137 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138 serializeEnum(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
141 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
142 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
143 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
144 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
146
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
147 private void serializeObject (T) (T value, string key)
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
148 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
149 auto runtimeType = value.classinfo.name;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
150
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
151 triggerEvents(serializing, value, {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
152 archive.archiveObject(runtimeType, T.stringof, key, nextId, {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153 if (runtimeType in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
154 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
155 auto wrapper = getSerializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
156 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
158
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
159 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
160 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
164 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165 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
166
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
167 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
169 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
170 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
171 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
172
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173 private void serializeStruct (T) (T value, DataType key)
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
174 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
175 auto type = T.stringof;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
176
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 triggerEvents(serializing, value, {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
178 archive.archive(type, key, nextId, {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 if (type in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181 auto wrapper = getSerializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 wrapper(value, this, key);
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 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186 {
17
c4e7e64ffb67 Changed toData/fromData to take an instance of the serializer instead of the archive.
Jacob Carlborg <doob@me.com>
parents: 16
diff changeset
187 static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
188 value.toData(this, 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 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
191 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
192 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
196
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
197 private void serializeString (T) (T value, string key)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
198 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
199 archive.archive(value, key, nextId);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
201
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
202 private void serializeArray (T) (T value, string key)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
203 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
204 auto array = Array(value.ptr, value.length, BaseTypeOfArray!(T).sizeof);
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
205
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
206 archive.archiveArray(array, arrayToString!(T), key, nextId, {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 foreach (i, e ; value)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
208 serializeInternal(e, toDataType(i));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
212 private void serializePrimitive (T) (T value, string key)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
213 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
214 archive.archive(value, key, nextId);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
215 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
216
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
217 private void objectStructSerializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
218 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
219 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
220 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
221
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
222 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
223 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
224 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
225
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
226 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
227 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
228 alias typeof(T.tupleof[i]) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
229 Type v = value.tupleof[i];
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
230 serializeInternal(v, toDataType(field));
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
231 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
232 }
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
233
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
234 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
235 serializeBaseTypes(value);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
236 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
237
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
238 private void objectStructDeserializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
239 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
240 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
241 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
242
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
243 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
244 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
245 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
246
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
247 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
248 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
249 alias TypeOfField!(T, field) Type;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
250 auto fieldValue = deserializeInternal!(Type)(toDataType(field));
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
251 value.tupleof[i] = fieldValue;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
252 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
253 }
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
254
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
255 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
256 deserializeBaseTypes(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
259 private void serializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
265 archive.archiveBaseClass(Base.stringof, nextKey, nextId);
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
266 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
267 objectStructSerializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
268 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
269 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
271 private void deserializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
273 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
274
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
276 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
277 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
278 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
279 objectStructDeserializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
280 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
281 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
282
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
283 private SerializeRegisterWrapper!(T, Serializer) getSerializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
284 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
285 auto wrapper = cast(SerializeRegisterWrapper!(T, Serializer)) serializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
286
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
287 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
288 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
289
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
290 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
291 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
292
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
293 private DeserializeRegisterWrapper!(T, Serializer) getDeserializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
294 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
295 auto wrapper = cast(DeserializeRegisterWrapper!(T, Serializer)) deserializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
296
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
297 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
298 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
299
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
300 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
303 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void delegate (T, Serializer, string) dg)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
304 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
305 return new SerializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
306 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
307
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
308 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void function (T, Serializer, string) func)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
310 return new SerializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
313 private DeserializeRegisterWrapper!(T, Serializer) toDeserializeRegisterWrapper (T) (void delegate (ref T, Serializer, string) dg)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
315 return new DeserializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
318 private DeserializeRegisterWrapper!(T, Serializer) toDeserializeRegisterWrapper (T) (void function (ref T, Serializer, string) func)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
320 return new DeserializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
322
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
323 private template arrayToString (T)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
324 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
325 const arrayToString = BaseTypeOfArray!(T).stringof;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
326 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
327
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
328 private bool isBaseClass (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
329 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330 auto name = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
331 auto index = name.lastIndexOf('.');
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
332
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
333 return T.stringof != name[index + 1 .. $];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
334 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
336 private size_t nextId ()
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
337 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
338 return idCounter++;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
339 }
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
340
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
341 private string nextKey ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 return toDataType(keyCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
345
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
346 private void resetCounters ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348 keyCounter = 0;
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
349 idCounter = 0;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
350 }
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
351
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
352 private string toDataType (T) (T value)
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
353 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
354 return to!(string)(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
355 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357 private void triggerEvent (string name, T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
359 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
360
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361 foreach (i, dummy ; typeof(T.tupleof))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
363 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
364
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
365 static if (field == name)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
366 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 alias TypeOfField!(T, field) Type;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368 auto event = getValueOfField!(T, Type, field)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369 event(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 }
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 void triggerEvents (T) (Mode mode, T value, void delegate () dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
375 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377 triggerEvent!(onSerializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380 triggerEvent!(onDeserializingField)(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 dg();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385 triggerEvent!(onSerializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
387 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388 triggerEvent!(onDeserializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
391 private static string[] collectAnnotations (string name, T) ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
392 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
393 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
394
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395 string[] annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
397 foreach (i, type ; typeof(T.tupleof))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
401 static if (field == name)
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
402 annotations ~= type.field;
0
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 annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
406 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407 }