annotate orange/serialization/archives/XMLArchive.d @ 19:8ab9588b92bf

getValueOfAtrribute has no return at end of method. Fixes #5.
author Jacob Carlborg <doob@me.com>
date Sat, 14 Aug 2010 17:24:42 +0200
parents 3d42ea434d46
children 963b756ed579
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.archives.XMLArchive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 version (Tango)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
10 import tango.util.Convert : to;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
11
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
12 else
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
13 import std.conv;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
14
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
15 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 import orange.util._;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
17 import orange.xml.XMLDocument;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 private enum ArchiveMode
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21 archiving,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 unarchiving
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 class XMLArchive (U = char) : Archive!(U)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
26 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 static assert (isChar!(U), format!(`The given type "`, U, `" is not a valid type. Valid types are: "char", "wchar" and "dchar".`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 private struct Tags
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31 static const DataType structTag = "struct";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 static const DataType dataTag = "data";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 static const DataType archiveTag = "archive";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 static const DataType arrayTag = "array";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35 static const DataType objectTag = "object";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
36 static const DataType baseTag = "base";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 static const DataType stringTag = "string";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
38 static const DataType referenceTag = "reference";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
39 static const DataType pointerTag = "pointer";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
40 static const DataType associativeArrayTag = "associativeArray";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
41 static const DataType typedefTag = "typedef";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 static const DataType nullTag = "null";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
43 static const DataType enumTag = "enum";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
44 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
45
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46 private struct Attributes
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
47 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48 static const DataType typeAttribute = "type";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49 static const DataType versionAttribute = "version";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 static const DataType lengthAttribute = "length";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51 static const DataType keyAttribute = "key";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 static const DataType runtimeTypeAttribute = "runtimeType";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 static const DataType idAttribute = "id";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
54 static const DataType keyTypeAttribute = "keyType";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
55 static const DataType valueTypeAttribute = "valueType";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
56 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
57
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
58 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
59 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 DataType archiveType = "org.dsource.orange.xml";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61 DataType archiveVersion = "0.1";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
62
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
63 XMLDocument!(U) doc;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
64 doc.Node lastElement;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
65 //DocPrinter!(U) printer;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
66 doc.Node lastElementSaved;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
67
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
68 bool hasBegunArchiving;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
69 bool hasBegunUnarchiving;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
70
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
71 DataType[void*] archivedReferences;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
72 void*[DataType] unarchivedReferences;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
73
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
74 size_t idCounter;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
75 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
76
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
77 this ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
78 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
79 doc = new XMLDocument!(U);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
80 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
81
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
82 public void beginArchiving ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
83 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
84 if (!hasBegunArchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
85 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
86 doc.header;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
87 lastElement = doc.tree.element(Tags.archiveTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
88 .attribute(Attributes.typeAttribute, archiveType)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
89 .attribute(Attributes.versionAttribute, archiveVersion);
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
90 lastElement = lastElement.element(Tags.dataTag);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
91
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
92 hasBegunArchiving = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
93 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
94 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
95
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
96 public void beginUnarchiving (DataType data)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
97 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
98 if (!hasBegunUnarchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
99 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
100 doc.parse(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
101 hasBegunUnarchiving = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
102
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
103 auto set = doc.query[Tags.archiveTag][Tags.dataTag];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
104
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
105 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
106 lastElement = set.nodes[0];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
107
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
108 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
109 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
110 if (errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
111 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
112 if (set.nodes.length == 0)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
113 errorCallback(new ArchiveException(errorMessage!(ArchiveMode.unarchiving) ~ `The "` ~ to!(string)(Tags.dataTag) ~ `" tag could not be found.`, __FILE__, __LINE__), [Tags.dataTag]);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
114
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
115 else
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
116 errorCallback(new ArchiveException(errorMessage!(ArchiveMode.unarchiving) ~ `There were more than one "` ~ to!(string)(Tags.dataTag) ~ `" tag.`, __FILE__, __LINE__), [Tags.dataTag]);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
117 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
118 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
121
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
122 public DataType data ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
123 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
124 /*if (!printer)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
125 printer = new DocPrinter!(U);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
126
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
127 return printer.print(doc);*/
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
128
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
129 return doc.toString();
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
130 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
131
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
132 public void reset ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
133 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
134 hasBegunArchiving = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
135 hasBegunUnarchiving = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136 idCounter = 0;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
137 doc.reset;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 private void begin ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
141 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
142 lastElementSaved = lastElement;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 private void end ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
146 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147 lastElement = lastElementSaved;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
148 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150 public void archive (T) (T value, DataType key, void delegate () dg = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
151 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
152 if (!hasBegunArchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
153 beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
154
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
155 restore(lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
156 bool callDelegate = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
157
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
158 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
159 archiveTypeDef(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
160
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161 else static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162 archiveObject(value, key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
164 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165 archiveStruct(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
166
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
167 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168 archiveString(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
169
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
170 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
171 archiveArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
172
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 archiveAssociativeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 archivePrimitive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
178
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180 archivePointer(value, key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183 archiveEnum(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
185 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186 static assert(false, format!(`The type "`, T, `" cannot be archived.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
187
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
188 if (callDelegate && dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 dg();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
190 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
191 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
192
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 private void archiveObject (T) (T value, DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195 if (!value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
196 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
197 lastElement.element(Tags.nullTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
198 .attribute(Attributes.typeAttribute, toDataType(T.stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
199 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
201 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
202
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
203 else if (auto reference = getArchivedReference(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
204 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
205 archiveReference(key, reference);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
206 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
211 DataType id = nextId;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
212
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
213 lastElement = lastElement.element(Tags.objectTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
214 .attribute(Attributes.runtimeTypeAttribute, toDataType(value.classinfo.name))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
215 .attribute(Attributes.typeAttribute, toDataType(T.stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
216 .attribute(Attributes.keyAttribute, key)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
217 .attribute(Attributes.idAttribute, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 addArchivedReference(value, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
220 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
221 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223 private void archiveStruct (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
225 lastElement = lastElement.element(Tags.structTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
226 .attribute(Attributes.typeAttribute, toDataType(T.stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
227 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
228 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
229
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
230 private void archiveString (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
232 lastElement.element(Tags.stringTag, toDataType(value))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
233 .attribute(Attributes.typeAttribute, toDataType(BaseTypeOfArray!(T).stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
234 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
235 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237 private void archiveArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
238 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
239 lastElement = lastElement.element(Tags.arrayTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
240 .attribute(Attributes.typeAttribute, toDataType(BaseTypeOfArray!(T).stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
241 .attribute(Attributes.lengthAttribute, toDataType(value.length))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
242 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
243 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
244
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
245 private void archiveAssociativeArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
247 lastElement = lastElement.element(Tags.associativeArrayTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
248 .attribute(Attributes.keyTypeAttribute, toDataType(KeyTypeOfAssociativeArray!(T).stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
249 .attribute(Attributes.valueTypeAttribute, toDataType(ValueTypeOfAssociativeArray!(T).stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
250 .attribute(Attributes.lengthAttribute, toDataType(value.length))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
251 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
254 private void archivePointer (T) (T value, DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
255 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
256 if (auto reference = getArchivedReference(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
257 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
258 archiveReference(key, reference);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
259 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264 DataType id = nextId;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
265
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
266 lastElement = lastElement.element(Tags.pointerTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
267 .attribute(Attributes.keyAttribute, key)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
268 .attribute(Attributes.idAttribute, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
269
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270 addArchivedReference(value, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
271 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
273
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
274 private void archiveEnum (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
276 lastElement.element(Tags.enumTag, toDataType(value))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
277 .attribute(Attributes.typeAttribute, toDataType(T.stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
278 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
279 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
280
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
281 private void archivePrimitive (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
282 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
283 lastElement.element(toDataType(T.stringof), toDataType(value))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
284 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
285 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
286
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
287 private void archiveTypeDef (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
288 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
289 lastElement = lastElement.element(Tags.typedefTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
290 .attribute(Attributes.typeAttribute, toDataType(BaseTypeOfTypeDef!(T).stringof));
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
291 .attribute(Attributes.key, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
292 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
293
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
294 public T unarchive (T) (DataType key, T delegate (T) dg = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
295 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
296 if (!hasBegunUnarchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
297 beginUnarchiving(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
298
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
299 return restore!(T)(lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
300 T value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302 bool callDelegate = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
303
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
304 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
305 value = unarchiveTypeDef!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
306
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
307 else static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
308 value = unarchiveObject!(T)(key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
310 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 value = unarchiveStruct!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
313 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 value = unarchiveString!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317 value = unarchiveArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
318
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
320 value = unarchiveAssociativeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
322 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
323 value = unarchivePrimitive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
324
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
325 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
326 value = unarchivePointer!(T)(key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
327
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
328 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
329 value = unarchiveEnum!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
331 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
332 static assert(false, format!(`The type "`, T, `" cannot be unarchived.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
333
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
334 if (callDelegate && dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335 return dg(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
336
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
337 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
338 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
339 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
340
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 private T unarchiveObject (T) (DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 DataType id = unarchiveReference(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
345 if (auto reference = getUnarchivedReference!(T)(id))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
346 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
347 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348 return *reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
350
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
351 auto tmp = getElement(Tags.objectTag, key, Attributes.keyAttribute, false);
11
27c5b6c5425f Deserialization now works as well using D2. Compiles again with D1 and Tango. Cleaned up orange.util.io a bit.
Jacob Carlborg <doob@me.com>
parents: 10
diff changeset
352
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
353 if (!tmp.isValid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
354 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
355 lastElement = getElement(Tags.nullTag, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358 }
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
359
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
360 lastElement = tmp;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362 auto runtimeType = getValueOfAttribute(Attributes.runtimeTypeAttribute);
19
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
363
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
364 if (!runtimeType)
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
365 return T.init;
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
366
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 auto name = fromDataType!(string)(runtimeType);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368 id = getValueOfAttribute(Attributes.idAttribute);
19
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
369
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
370 if (!id)
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
371 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
373 T result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
374
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
375 /*static if (is(typeof(T._ctor)))
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377 ParameterTupleOf!(typeof(T._ctor)) params;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378 result = factory!(T, typeof(params))(name, params);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
381 else*/
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
382 result = cast(T) newInstance(name);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384 addUnarchivedReference(result, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
387 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389 private T unarchiveStruct (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
391 auto element = getElement(Tags.structTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
392
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
393 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
394 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 private T unarchiveString (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
401 auto element = getElement(Tags.stringTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
402
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
403 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
404 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
405
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
406 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
408
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
409 private T unarchiveArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
410 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
411 T value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
412
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
413 auto element = getElement(Tags.arrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
414
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
415 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
416 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
417
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
418 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
419 auto length = getValueOfAttribute(Attributes.lengthAttribute);
19
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
420
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
421 if (!length)
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
422 return T.init;
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
423
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
424 value.length = fromDataType!(size_t)(length);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
425
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
426 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
427 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
428
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
429 private T unarchiveAssociativeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
430 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
431 auto element = getElement(Tags.associativeArrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
432
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
433 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
434 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
435
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
436 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
437 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
438
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
439 private T unarchivePointer (T) (DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
440 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
441 DataType id = unarchiveReference(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
442
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
443 if (auto reference = getUnarchivedReference!(T)(id))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
444 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
445 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
446 return *reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
447 }
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
448
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
449 auto element = getElement(Tags.pointerTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
450
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
451 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
452 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
453
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
454 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
455 id = getValueOfAttribute(Attributes.idAttribute);
19
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
456
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
457 if (!id)
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
458 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
459
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
460 T result = new BaseTypeOfPointer!(T);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
461
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
462 addUnarchivedReference(result, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
463
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
464 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
465 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
466
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
467 private T unarchiveEnum (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
468 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
469 auto element = getElement(Tags.enumTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
470
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
471 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
472 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
473
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
474 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
475 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
476
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
477 private T unarchivePrimitive (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
478 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
479 auto element = getElement(toDataType(T.stringof), key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
480
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
481 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
482 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
483
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
484 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
485 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
486
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
487 private T unarchiveTypeDef (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
488 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
489 auto element = getElement(Tags.typedefTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
490
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
491 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
492 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
493
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
494 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
495 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
496
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
497 public AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T)) unarchiveAssociativeArrayVisitor (T) ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
498 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499 return AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T))(this);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
501
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
502 public void archiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
503 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
504 lastElement = lastElement.element(Tags.baseTag)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
505 .attribute(Attributes.typeAttribute, toDataType(T.stringof))
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
506 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
507 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
508
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509 public void unarchiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
511 auto element = getElement(Tags.baseTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
512
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
513 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
514 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
516
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
517 version (Tango)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
519 template errorMessage (ArchiveMode mode = ArchiveMode.archiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
520 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
521 static if (mode == ArchiveMode.archiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
522 const errorMessage = "Could not continue archiving due to unrecognized data format: ";
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
523
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
524 else static if (mode == ArchiveMode.unarchiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
525 const errorMessage = "Could not continue unarchiving due to unrecognized data format: ";
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
526 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
527 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
528
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
529 else
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
530 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
531 mixin(
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
532 `template errorMessage (ArchiveMode mode = ArchiveMode.archiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
533 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
534 static if (mode == ArchiveMode.archiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
535 enum errorMessage = "Could not continue archiving due to unrecognized data format: ";
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
536
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
537 else static if (mode == ArchiveMode.unarchiving)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
538 enum errorMessage = "Could not continue unarchiving due to unrecognized data format: ";
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
539 }`
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
540 );
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
541 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
542
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
543 private doc.Node getElement (DataType tag, DataType key, DataType attribute = Attributes.keyAttribute, bool throwOnError = true)
11
27c5b6c5425f Deserialization now works as well using D2. Compiles again with D1 and Tango. Cleaned up orange.util.io a bit.
Jacob Carlborg <doob@me.com>
parents: 10
diff changeset
544 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
545 auto set = lastElement.query[tag].attribute((doc.Node node) {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
546 if (node.name == attribute && node.value == key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
547 return true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
548
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 return false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
550 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
551
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
552 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
553 return set.nodes[0].parent;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
554
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
555 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
556 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
557 if (throwOnError && errorCallback)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
558 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
559 if (set.nodes.length == 0)
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
560 errorCallback(new ArchiveException(`Could not find an element "` ~ to!(string)(tag) ~ `" with the attribute "` ~ to!(string)(Attributes.keyAttribute) ~ `" with the value "` ~ to!(string)(key) ~ `".`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
561
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
562 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
563 errorCallback(new ArchiveException(`Could not unarchive the value with the key "` ~ to!(string)(key) ~ `" due to malformed data.`, __FILE__, __LINE__), [tag, Attributes.keyAttribute, key]);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
564 }
11
27c5b6c5425f Deserialization now works as well using D2. Compiles again with D1 and Tango. Cleaned up orange.util.io a bit.
Jacob Carlborg <doob@me.com>
parents: 10
diff changeset
565
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
566 return doc.Node.invalid;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
567 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
568 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
569
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570 private DataType getValueOfAttribute (DataType attribute)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572 auto set = lastElement.query.attribute(attribute);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
575 return set.nodes[0].value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
576
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
577 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
578 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
579 if (errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
580 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
581 if (set.nodes.length == 0)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
582 errorCallback(new ArchiveException(`Could not find the attribute "` ~ to!(string)(attribute) ~ `".`, __FILE__, __LINE__), [attribute]);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
583
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
584 else
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
585 errorCallback(new ArchiveException(`Could not unarchive the value of the attribute "` ~ to!(string)(attribute) ~ `" due to malformed data.`, __FILE__, __LINE__), [attribute]);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
586 }
19
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
587 }
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
588
8ab9588b92bf getValueOfAtrribute has no return at end of method. Fixes #5.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
589 return null;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
590 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
591
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
592 private void addArchivedReference (T) (T value, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
593 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
594 static assert(isReference!(T), format!(`The given type "`, T, `" is not a reference type, i.e. object or pointer.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
595
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
596 archivedReferences[cast(void*) value] = id;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
597 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
598
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
599 private void addUnarchivedReference (T) (T value, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
600 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
601 static assert(isReference!(T), format!(`The given type "`, T, `" is not a reference type, i.e. object or pointer.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
602
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
603 unarchivedReferences[id] = cast(void*) value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
604 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
605
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
606 private DataType getArchivedReference (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
607 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
608 if (auto tmp = cast(void*) value in archivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
609 return *tmp;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
610
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
611 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
612 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
613
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
614 private T* getUnarchivedReference (T) (DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
615 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
616 if (auto reference = id in unarchivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 return cast(T*) reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
618
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
619 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
621
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
622 private DataType nextId ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
624 return toDataType(idCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
625 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
626
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
627 private void archiveReference (DataType key, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
628 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
629 lastElement.element(Tags.referenceTag, id)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
630 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
631 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
632
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
633 private DataType unarchiveReference (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
634 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
635 auto element = getElement(Tags.referenceTag, key, Attributes.keyAttribute, false);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
636
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
637 if (element.isValid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
638 return element.value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
639
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
640 return cast(DataType) null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
641 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
642
6
ae24aae69a3b Added logo
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
643 private struct AssociativeArrayVisitor (Key, Value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
644 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
645 private XMLArchive archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
646
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
647 static AssociativeArrayVisitor opCall (XMLArchive archive)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
648 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
649 AssociativeArrayVisitor aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
650 aai.archive = archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
651
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
652 return aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
653 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
654
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
655 int opApply(int delegate(ref Key, ref Value) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
656 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
657 int result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
658
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
659 foreach (node ; archive.lastElement.children)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
660 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
661 restore(archive.lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
662 archive.lastElement = node;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
663
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
664 if (node.attributes.exist)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
665 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
666 Key key = to!(Key)(archive.getValueOfAttribute(Attributes.keyAttribute));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
667 Value value = to!(Value)(node.value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
668
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
669 result = dg(key, value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
670 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
671 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
672
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
673 if (result)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
674 break;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
675 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
676
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
677 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
678 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
679 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
680 }