annotate orange/serialization/Serializer.d @ 32:9df3b7a46a51 experimental

Updated the unit test with the latest changes.
author Jacob Carlborg <doob@me.com>
date Sun, 21 Nov 2010 18:51:05 +0100
parents c68d29967c9f
children 4fea56a5849f
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
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
18 import orange.core._;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 import orange.serialization._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21 import orange.util._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 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
26
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
27 enum Mode
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 serializing,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 deserializing
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 alias Mode.serializing serializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 alias Mode.deserializing deserializing;
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
35
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
36 private char toUpper (char c)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
37 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
38 if (c >= 'a' && c <= 'z')
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
39 return c - 32;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
40
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
41 return c;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
42 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
43 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
44
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
45 class Serializer
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
47 alias void delegate (ArchiveException exception, string[] data) ErrorCallback;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
48 alias UntypedData Data;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
49 alias size_t Id;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
50
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51 private
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
52 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
53 ErrorCallback errorCallback_;
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
54 Archive archive;
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
55
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
56 size_t keyCounter;
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
57 Id idCounter;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
59 RegisterBase[string] serializers;
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
60 RegisterBase[string] deserializers;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
61
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
62 Id[void*] serializedReferences;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
63 void*[Id] deserializedReferences;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
64
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
65 Array[Id] serializedArrays;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
66 void[][Id] deserializedSlices;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67
31
c68d29967c9f Fixed some bugs in the handling of pointers.
Jacob Carlborg <doob@me.com>
parents: 30
diff changeset
68 void*[Id] serializedPointers;
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
69 Id[void*] serializedValues;
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
70
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
71 bool hasBegunSerializing;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
72 bool hasBegunDeserializing;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
73
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
74 void delegate (ArchiveException exception, string[] data) throwOnErrorCallback;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
75 void delegate (ArchiveException exception, string[] data) doNothingOnErrorCallback;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
76 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
77
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
78 this (Archive archive)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
79 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
80 this.archive = archive;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
81
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
82 throwOnErrorCallback = (ArchiveException exception, string[] data) { throw exception; };
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
83 doNothingOnErrorCallback = (ArchiveException exception, string[] data) { /* do nothing */ };
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
84
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
85 setThrowOnErrorCallback();
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
86 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
87
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
88 ErrorCallback errorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
89 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
90 return errorCallback_;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
91 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
92
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
93 ErrorCallback errorCallback (ErrorCallback errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
94 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
95 return errorCallback_ = errorCallback;
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
96 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
97
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
98 void setThrowOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
99 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
100 errorCallback = throwOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
101 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
102
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
103 void setDoNothingOnErrorCallback ()
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
104 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
105 errorCallback = doNothingOnErrorCallback;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
106 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 17
diff changeset
107
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
108 void reset ()
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
109 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
110 resetCounters();
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
111
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
112 serializers = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
113 deserializers = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
114
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
115 serializedReferences = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
116 deserializedReferences = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
117
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
118 serializedArrays = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
119 deserializedSlices = null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
120
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
121 serializedValues = null;
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
122 serializedPointers = null;
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
123
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
124 hasBegunSerializing = false;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
125 hasBegunDeserializing = false;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
126
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
127 archive.reset;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
128 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
129
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
130 Data serialize (T) (T value, string key = null)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
131 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
132 if (!hasBegunSerializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
133 hasBegunSerializing = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
135 serializeInternal(value, key);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
136 postProcess;
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
137
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
138 return archive.untypedData;
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
139 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
140
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
141 private void serializeInternal (T) (T value, string key = null, Id id = Id.max)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
142 {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 if (!key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144 key = nextKey;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
146 if (id == Id.max)
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
147 id = nextId;
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
148
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149 archive.beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
151 static if ( is(T == typedef) )
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
152 serializeTypedef(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
154 else static if (isObject!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
155 serializeObject(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
156
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157 else static if (isStruct!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
158 serializeStruct(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
159
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
160 else static if (isString!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
161 serializeString(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163 else static if (isArray!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
164 serializeArray(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
166 else static if (isAssociativeArray!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
167 serializeAssociativeArray(value, key, id);
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 else static if (isPrimitive!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
170 serializePrimitive(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
171
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
172 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 static if (isFunctionPointer!(T))
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
175 goto error;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 else
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
178 serializePointer(value, key, id);
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
179 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181 else static if (isEnum!(T))
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
182 serializeEnum(value, key, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
185 {
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
186 error:
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
187 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
188 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
190
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
191 private void serializeObject (T) (T value, string key, Id id)
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
192 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
193 if (!value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
194 return archive.archiveNull(T.stringof, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
195
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
196 auto reference = getSerializedReference(value);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
197
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
198 if (reference != Id.max)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
199 return archive.archiveReference(key, reference);
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
200
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
201 auto runtimeType = value.classinfo.name;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
202
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
203 addSerializedReference(value, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
204
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
205 triggerEvents(serializing, value, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
206 archive.archiveObject(runtimeType, T.stringof, key, id, {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 if (runtimeType in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 auto wrapper = getSerializerWrapper!(T)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
212
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
213 else static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
214 value.toData(this, key);
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
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
217 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218 if (isBaseClass(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 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__);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
220
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
221 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
225 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
226
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
227 private void serializeStruct (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
228 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
229 string type = T.stringof;
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
230
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 triggerEvents(serializing, value, {
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
232 archive.archiveStruct(type, key, id, {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
233 if (type in serializers)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
234 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
235 auto wrapper = getSerializerWrapper!(T)(type);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236 wrapper(value, this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
238
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
239 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
240 {
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
241 static if (isSerializable!(T, Serializer))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
242 value.toData(this, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
243
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
244 else
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
245 objectStructSerializeHelper(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
247 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
248 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
249 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
250
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
251 private void serializeString (T) (T value, string key, Id id)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
253 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
254
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
255 archive.archive(value, key, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
256 addSerializedArray(array, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257 }
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
258
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
259 private void serializeArray (T) (T value, string key, Id id)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
260 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
261 auto array = Array(value.ptr, value.length, ElementTypeOfArray!(T).sizeof);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
262
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
263 archive.archiveArray(array, arrayToString!(T), key, id, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
264 foreach (i, e ; value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
265 serializeInternal(e, toData(i));
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
266 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
267
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
268 addSerializedArray(array, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
269 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
270
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
271 private void serializeAssociativeArray (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
272 {
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
273 auto reference = getSerializedReference(value);
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
274
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
275 if (reference != Id.max)
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
276 return archive.archiveReference(key, reference);
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
277
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
278 addSerializedReference(value, id);
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
279
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
280 string keyType = KeyTypeOfAssociativeArray!(T).stringof;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
281 string valueType = ValueTypeOfAssociativeArray!(T).stringof;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
282
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
283 archive.archiveAssociativeArray(keyType, valueType, value.length, key, id, {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
284 size_t i;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
285
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
286 foreach(k, v ; value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
287 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
288 archive.archiveAssociativeArrayKey(toData(i), {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
289 serializeInternal(k, toData(i));
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
290 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
291
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
292 archive.archiveAssociativeArrayValue(toData(i), {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
293 serializeInternal(v, toData(i));
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
294 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
295
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
296 i++;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
297 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
298 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
299 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
300
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
301 private void serializePointer (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
302 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
303 if (!value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
304 return archive.archiveNull(T.stringof, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
305
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
306 archive.archivePointer(key, id, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
307 if (key in serializers)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
308 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
309 auto wrapper = getSerializerWrapper!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
310 wrapper(value, this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
311 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
312
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
313 else static if (isSerializable!(T, Serializer))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
314 value.toData(this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
315
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
316 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
317 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
318 static if (isVoid!(BaseTypeOfPointer!(T)))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
319 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__);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
320
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
321 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
322 serializeInternal(*value, nextKey);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
323 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
324 });
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
325
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
326 addSerializedPointer(value, id);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
327 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
328
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
329 private void serializeEnum (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
330 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
331 alias BaseTypeOfEnum!(T) EnumBaseType;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
332 auto val = cast(EnumBaseType) value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
333 string type = T.stringof;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
334
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
335 archive.archiveEnum(val, type, key, id);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
336 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
337
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
338 private void serializePrimitive (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
339 {
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
340 archive.archive(value, key, id);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
341 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
342
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
343 private void serializeTypedef (T) (T value, string key, Id id)
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
344 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
345 archive.archiveTypedef(T.stringof, key, nextId, {
32
9df3b7a46a51 Updated the unit test with the latest changes.
Jacob Carlborg <doob@me.com>
parents: 31
diff changeset
346 serializeInternal!(BaseTypeOfTypedef!(T))(value, nextKey);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
350 T deserialize (T) (Data data, string key = null)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
351 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
352 if (hasBegunSerializing && !hasBegunDeserializing)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
353 resetCounters();
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
354
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
355 if (!hasBegunDeserializing)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
356 hasBegunDeserializing = true;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
357
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
358 if (!key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
359 key = nextKey;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
360
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
361 archive.beginUnarchiving(data);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
362 return deserializeInternal!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
363 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
364
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
365 private T deserializeInternal (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
366 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
367 static if (isTypedef!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
368 return deserializeTypedef!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
369
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
370 else static if (isObject!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
371 return deserializeObject!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
372
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
373 else static if (isStruct!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
374 return deserializeStruct!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
375
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
376 else static if (isString!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
377 return deserializeString!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
378
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
379 else static if (isArray!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
380 return deserializeArray!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
381
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
382 else static if (isAssociativeArray!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
383 return deserializeAssociativeArray!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
384
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
385 else static if (isPrimitive!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
386 return deserializePrimitive!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
387
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
388 else static if (isPointer!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
389 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
390 static if (isFunctionPointer!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
391 goto error;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
392
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
393 return deserializePointer!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
394 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
395
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
396 else static if (isEnum!(T))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
397 return deserializeEnum!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
398
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
399 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
400 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
401 error:
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
402 throw new SerializationException(format!(`The type "`, T, `" cannot be deserialized.`), __FILE__, __LINE__);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
403 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
404 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
405
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
406 private T deserializeObject (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
407 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
408 auto id = deserializeReference(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
409
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
410 if (auto reference = getDeserializedReference!(T)(id))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
411 return *reference;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
412
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
413 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
414 Object val = value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
415
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
416 archive.unarchiveObject(key, id, val, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
417 triggerEvents(deserializing, value, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
418 value = cast(T) val;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
419 auto runtimeType = value.classinfo.name;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
420
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
421 if (runtimeType in deserializers)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
422 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
423 auto wrapper = getDeserializerWrapper!(T)(runtimeType);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
424 wrapper(value, this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
425 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
426
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
427 else static if (isSerializable!(T, Serializer))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
428 value.fromData(this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
429
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
430 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
431 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
432 if (isBaseClass(value))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
433 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__);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
434
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
435 objectStructDeserializeHelper(value);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
436 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
437 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
438 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
439
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
440 addDeserializedReference(value, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
441
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
442 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
443 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
444
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
445 private T deserializeStruct (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
446 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
447 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
448
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
449 archive.unarchiveStruct(key, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
450 triggerEvents(deserializing, value, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
451 auto type = toData(T.stringof);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
452
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
453 if (type in deserializers)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
454 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
455 auto wrapper = getDeserializerWrapper!(T)(type);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
456 wrapper(value, this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
457 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
458
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
459 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
460 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
461 static if (isSerializable!(T, Serializer))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
462 value.fromData(this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
463
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
464 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
465 objectStructDeserializeHelper(value);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
466 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
467 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
468 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
469
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
470 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
471 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
472
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
473 private T deserializeString (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
474 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
475 auto slice = deserializeSlice(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
476
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
477 if (auto tmp = getDeserializedSlice!(T)(slice))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
478 return *tmp;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
479
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
480 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
481
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
482 if (slice.id != size_t.max)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
483 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
484 static if (is(T == string))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
485 value = archive.unarchiveString(slice.id).toSlice(slice);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
486
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
487 else static if (is(T == wstring))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
488 value = archive.unarchiveWstring(slice.id).toSlice(slice);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
489
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
490 else static if (is(T == dstring))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
491 value = archive.unarchiveDstring(slice.id).toSlice(slice);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
492 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
493
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
494 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
495 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
496 static if (is(T == string))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
497 value = archive.unarchiveString(key, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
498
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
499 else static if (is(T == wstring))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
500 value = archive.unarchiveWstring(key, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
501
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
502 else static if (is(T == dstring))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
503 value = archive.unarchiveDstring(key, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
504 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
505
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
506 addDeserializedSlice(value, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
507
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
508 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
509 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
510
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
511 private T deserializeArray (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
512 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
513 auto slice = deserializeSlice(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
514
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
515 if (auto tmp = getDeserializedSlice!(T)(slice))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
516 return *tmp;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
517
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
518 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
519
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
520 auto dg = (size_t length) {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
521 value.length = length;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
522
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
523 foreach (i, ref e ; value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
524 e = deserializeInternal!(typeof(e))(toData(i));
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
525 };
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
526
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
527 if (slice.id != size_t.max)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
528 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
529 archive.unarchiveArray(slice.id, dg);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
530 addDeserializedSlice(value, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
531
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
532 return value.toSlice(slice);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
533 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
534
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
535 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
536 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
537 slice.id = archive.unarchiveArray(key, dg);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
538
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
539 if (auto a = slice.id in deserializedSlices)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
540 return cast(T) *a;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
541
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
542 addDeserializedSlice(value, slice.id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
543
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
544 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
545 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
546 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
547
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
548 private T deserializeAssociativeArray (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
549 {
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
550 auto id = deserializeReference(key);
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
551
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
552 if (auto reference = getDeserializedReference!(T)(id))
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
553 return *reference;
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
554
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
555 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
556
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
557 alias KeyTypeOfAssociativeArray!(T) Key;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
558 alias ValueTypeOfAssociativeArray!(T) Value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
559
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
560 id = archive.unarchiveAssociativeArray(key, (size_t length) {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
561 for (size_t i = 0; i < length; i++)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
562 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
563 Key aaKey;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
564 Value aaValue;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
565 auto k = toData(i);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
566
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
567 archive.unarchiveAssociativeArrayKey(k, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
568 aaKey = deserializeInternal!(Key)(k);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
569 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
570
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
571 archive.unarchiveAssociativeArrayValue(k, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
572 aaValue = deserializeInternal!(Value)(k);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
573 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
574
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
575 value[aaKey] = aaValue;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
576 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
577 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
578
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
579 addDeserializedReference(value, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
580
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
581 return value;
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
582 }
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
583
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
584 private T deserializePointer (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
585 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
586 auto id = deserializeReference(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
587
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
588 if (auto reference = getDeserializedReference!(T)(id))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
589 return *reference;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
590
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
591 T value = new BaseTypeOfPointer!(T);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
592
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
593 id = archive.unarchivePointer(key, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
594 if (key in deserializers)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
595 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
596 auto wrapper = getDeserializerWrapper!(T)(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
597 wrapper(value, this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
598 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
599
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
600 else static if (isSerializable!(T, Serializer))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
601 value.fromData(this, key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
602
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
603 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
604 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
605 static if (isVoid!(BaseTypeOfPointer!(T)))
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
606 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__);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
607
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
608 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
609 *value = deserializeInternal!(BaseTypeOfPointer!(T))(nextKey);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
610 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
611 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
612
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
613 addDeserializedReference(value, id);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
614
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
615 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
616 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
617
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
618 private T deserializeEnum (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
619 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
620 alias BaseTypeOfEnum!(T) Enum;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
621
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
622 const functionName = toUpper(Enum.stringof[0]) ~ Enum.stringof[1 .. $];
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
623 mixin("return cast(T) archive.unarchiveEnum" ~ functionName ~ "(key);");
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
624 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
625
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
626 private T deserializePrimitive (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
627 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
628 const functionName = toUpper(T.stringof[0]) ~ T.stringof[1 .. $];
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
629 mixin("return archive.unarchive" ~ functionName ~ "(key);");
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
630 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
631
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
632 private T deserializeTypedef (T) (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
633 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
634 T value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
635
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
636 archive.unarchiveTypedef!(T)(key, {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
637 value = cast(T) deserializeInternal!(BaseTypeOfTypedef!(T))(nextKey);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
638 });
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
639
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
640 return value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
641 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
642
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
643 private Id deserializeReference (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
644 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
645 return archive.unarchiveReference(key);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
646 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
647
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
648 private Slice deserializeSlice (string key)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
649 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
650 return archive.unarchiveSlice(key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
651 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
652
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
653 private void objectStructSerializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
654 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
655 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
656 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
657
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
658 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
659 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
660 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
661
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
662 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
663 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
664 alias typeof(T.tupleof[i]) Type;
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
665 Type v = value.tupleof[i];
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
666 auto id = nextId;
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
667
30
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
668 addSerializedValue(value.tupleof[i], id);
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
669 serializeInternal(v, toData(field), id);
9d1a8023bb89 Added IDs to every serialized value.
Jacob Carlborg <doob@me.com>
parents: 29
diff changeset
670 }
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
671 }
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
672
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
673 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
674 serializeBaseTypes(value);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
675 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
676
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
677 private void objectStructDeserializeHelper (T) (ref T value)
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
678 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
679 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
680 const nonSerializedFields = collectAnnotations!(nonSerializedField, T);
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
681
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
682 foreach (i, dummy ; typeof(T.tupleof))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
683 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
684 const field = nameOfFieldAt!(T, i);
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
685
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
686 static if (!internalFields.ctfeContains(field) && !nonSerializedFields.ctfeContains(field))
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
687 {
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
688 alias TypeOfField!(T, field) Type;
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
689 auto fieldValue = deserializeInternal!(Type)(toData(field));
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
690 value.tupleof[i] = fieldValue;
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
691 }
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
692 }
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
693
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
694 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
695 deserializeBaseTypes(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
696 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
697
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
698 private void serializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
699 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
700 alias BaseTypeTupleOf!(T)[0] Base;
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
701
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
702 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
703 {
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
704 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
705 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
706 objectStructSerializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
707 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
708 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
709
2
ea37a9470e3e Fixed multiple NonSerialized
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
710 private void deserializeBaseTypes (T : Object) (T value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
711 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
712 alias BaseTypeTupleOf!(T)[0] Base;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
713
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
714 static if (!is(Base == Object))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
715 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
716 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
717 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
718 objectStructDeserializeHelper(base);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
719 }
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
720 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
721
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
722 private void addSerializedReference (T) (T value, Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
723 {
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
724 static assert(isReference!(T) || isAssociativeArray!(T), format!(`The given type "`, T, `" is not a reference type, i.e. object, pointer or associative array.`));
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
725
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
726 serializedReferences[cast(void*) value] = id;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
727 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
728
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
729 private void addDeserializedReference (T) (T value, Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
730 {
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
731 static assert(isReference!(T) || isAssociativeArray!(T), format!(`The given type "`, T, `" is not a reference type, i.e. object, pointer or associative array.`));
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
732
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
733 deserializedReferences[id] = cast(void*) value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
734 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
735
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
736 private void addDeserializedSlice (T) (T value, Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
737 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
738 static assert(isArray!(T) || isString!(T), format!(`The given type "`, T, `" is not a slice type, i.e. array or string.`));
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
739
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
740 deserializedSlices[id] = value;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
741 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
742
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
743 private void addSerializedValue (T) (ref T value, Id id)
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
744 {
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
745 serializedValues[&value] = id;
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
746 }
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
747
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
748 private void addSerializedPointer (T) (T value, Id id)
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
749 {
31
c68d29967c9f Fixed some bugs in the handling of pointers.
Jacob Carlborg <doob@me.com>
parents: 30
diff changeset
750 serializedPointers[id] = value;
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
751 }
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
752
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
753 private Id getSerializedReference (T) (T value)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
754 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
755 if (auto tmp = cast(void*) value in serializedReferences)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
756 return *tmp;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
757
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
758 return Id.max;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
759 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
760
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
761 private T* getDeserializedReference (T) (Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
762 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
763 if (auto reference = id in deserializedReferences)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
764 return cast(T*) reference;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
765
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
766 return null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
767 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
768
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
769 private T* getDeserializedSlice (T) (Slice slice)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
770 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
771 if (auto array = slice.id in deserializedSlices)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
772 return &(cast(T) *array)[slice.offset .. slice.offset + slice.length]; // dereference the array, cast it to the right type,
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
773 // slice it and then return a pointer to the result
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
774 return null;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
775 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
776
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
777 private T* getDeserializedArray (T) (Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
778 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
779 if (auto array = id in deserializedSlices)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
780 return cast(T*) array;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
781 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
782
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
783 private T[] toSlice (T) (T[] array, Slice slice)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
784 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
785 return array[slice.offset .. slice.offset + slice.length];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
786 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
787
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
788 private SerializeRegisterWrapper!(T, Serializer) getSerializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
789 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
790 auto wrapper = cast(SerializeRegisterWrapper!(T, Serializer)) serializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
791
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
792 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
793 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
794
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
795 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
796 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
797
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
798 private DeserializeRegisterWrapper!(T, Serializer) getDeserializerWrapper (T) (string type)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
799 {
15
9f6064f9505a Changed from archive to serializer in the register wrappers.
Jacob Carlborg <doob@me.com>
parents: 14
diff changeset
800 auto wrapper = cast(DeserializeRegisterWrapper!(T, Serializer)) deserializers[type];
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
801
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
802 if (wrapper)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
803 return wrapper;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
804
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
805 assert(false, "throw exception here");
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
806 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
807
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
808 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void delegate (T, Serializer, string) dg)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
809 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
810 return new SerializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
811 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
812
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
813 private SerializeRegisterWrapper!(T, Serializer) toSerializeRegisterWrapper (T) (void function (T, Serializer, string) func)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
814 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
815 return new SerializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
816 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
817
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
818 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
819 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
820 return new DeserializeRegisterWrapper!(T, Serializer)(dg);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
821 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
822
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
823 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
824 {
16
091ff1b263db Missed some in the previous commit.
Jacob Carlborg <doob@me.com>
parents: 15
diff changeset
825 return new DeserializeRegisterWrapper!(T, Serializer)(func);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
826 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
827
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
828 private void addSerializedArray (Array array, Id id)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
829 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
830 serializedArrays[id] = array;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
831 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
832
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
833 private void postProcess ()
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
834 {
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
835 postProcessArrays();
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
836 postProcessPointers();
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
837 }
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
838
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
839 private void postProcessArrays ()
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
840 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
841 bool foundSlice = true;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
842
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
843 foreach (sliceKey, slice ; serializedArrays)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
844 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
845 foreach (arrayKey, array ; serializedArrays)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
846 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
847 if (slice.isSliceOf(array) && slice != array)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
848 {
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
849 auto s = Slice(slice.length, (slice.ptr - array.ptr) / slice.elementSize);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
850 archive.archiveSlice(s, sliceKey, arrayKey);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
851 foundSlice = true;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
852 break;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
853 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
854
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
855 else
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
856 foundSlice = false;
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
857 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
858
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
859 if (!foundSlice)
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
860 archive.postProcessArray(sliceKey);
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
861 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
862 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
863
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
864 private void postProcessPointers ()
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
865 {
31
c68d29967c9f Fixed some bugs in the handling of pointers.
Jacob Carlborg <doob@me.com>
parents: 30
diff changeset
866 foreach (pointerId, value ; serializedPointers)
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
867 {
31
c68d29967c9f Fixed some bugs in the handling of pointers.
Jacob Carlborg <doob@me.com>
parents: 30
diff changeset
868 if (auto pointeeId = value in serializedValues)
29
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
869 archive.archivePointer(pointerId, *pointeeId);
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
870
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
871 else
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
872 archive.postProcessPointer(pointerId);
c422ff6477dd Better handling of serializing pointers.
Jacob Carlborg <doob@me.com>
parents: 28
diff changeset
873 }
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
874 }
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
875
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
876 private template arrayToString (T)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
877 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
878 const arrayToString = ElementTypeOfArray!(T).stringof;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
879 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
880
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
881 private bool isBaseClass (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
882 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
883 auto name = value.classinfo.name;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
884 auto index = name.lastIndexOf('.');
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
885
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
886 return T.stringof != name[index + 1 .. $];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
887 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
888
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
889 private Id nextId ()
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
890 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
891 return idCounter++;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
892 }
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
893
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
894 private string nextKey ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
895 {
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
896 return toData(keyCounter++);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
897 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
898
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
899 private void resetCounters ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
900 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
901 keyCounter = 0;
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
902 idCounter = 0;
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
903 }
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
904
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
905 private string toData (T) (T value)
25
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
906 {
b51e953f79eb Second step in refactoring the API.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
907 return to!(string)(value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
908 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
909
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
910 private void triggerEvent (string name, T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
911 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
912 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
913
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
914 foreach (i, dummy ; typeof(T.tupleof))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
915 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
916 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
917
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
918 static if (field == name)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
919 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
920 alias TypeOfField!(T, field) Type;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
921 auto event = getValueOfField!(T, Type, field)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
922 event(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
923 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
924 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
925 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
926
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
927 private void triggerEvents (T) (Mode mode, T value, void delegate () dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
928 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
929 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
930 triggerEvent!(onSerializingField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
931
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
932 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
933 triggerEvent!(onDeserializingField)(value);
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
934
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
935 dg();
26
78e5fef4bbf2 Third step in refactoring the API. Stating to add unit tests.
Jacob Carlborg <doob@me.com>
parents: 25
diff changeset
936
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
937 if (mode == serializing)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
938 triggerEvent!(onSerializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
939
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
940 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
941 triggerEvent!(onDeserializedField)(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
942 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
943
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
944 private static string[] collectAnnotations (string name, T) ()
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
945 {
3
3c155e4c3d56 Fixed structs
Jacob Carlborg <doob@me.com>
parents: 2
diff changeset
946 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
947
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
948 string[] annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
949
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
950 foreach (i, type ; typeof(T.tupleof))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
951 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
952 const field = nameOfFieldAt!(T, i);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
953
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
954 static if (field == name)
8
613a0bb20207 Now works with dmd 1.062
Jacob Carlborg <doob@me.com>
parents: 4
diff changeset
955 annotations ~= type.field;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
956 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
957
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
958 return annotations;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
959 }
28
bffcbc8c392b Associative arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 27
diff changeset
960 }