annotate orange/serialization/archives/XMLArchive.d @ 22:963b756ed579

Resolved merge conflicts.
author Jacob Carlborg <doob@me.com>
date Mon, 04 Oct 2010 20:42:45 +0200
parents 8ab9588b92bf 51f05fd6a626
children 55f0a9d5df8d
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";
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
43 static const DataType enumTag = "enum";
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
44 static const DataType sliceTag = "slice";
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
45 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
46
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
47 private struct Attributes
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
48 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
49 static const DataType typeAttribute = "type";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
50 static const DataType versionAttribute = "version";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
51 static const DataType lengthAttribute = "length";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
52 static const DataType keyAttribute = "key";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
53 static const DataType runtimeTypeAttribute = "runtimeType";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
54 static const DataType idAttribute = "id";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
55 static const DataType keyTypeAttribute = "keyType";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
56 static const DataType valueTypeAttribute = "valueType";
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
57 static const DataType offsetAttribute = "offset";
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
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
60 private
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
61 {
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
62 struct ArrayNode
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
63 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
64 XMLDocument!(U).Node parent;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
65 XMLDocument!(U).Node node;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
66 DataType id;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
67 DataType key;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
68 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
69
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
70 struct Array
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
71 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
72 void* ptr;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
73 size_t length;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
74 size_t elementSize;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
75
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
76 static Array opCall (T) (T[] value)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
77 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
78 Array array;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
79 array.ptr = value.ptr;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
80 array.length = value.length;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
81 array.elementSize = T.sizeof;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
82
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
83 return array;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
84 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
85
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
86 bool isSliceOf (Array b)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
87 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
88 return ptr >= b.ptr && ptr + length * elementSize <= b.ptr + b.length * b.elementSize;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
89 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
90 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
91
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
92 struct Slice
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
93 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
94 size_t length;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
95 size_t offset;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
96 DataType id;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
97 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
98
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
99 DataType archiveType = "org.dsource.orange.xml";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
100 DataType archiveVersion = "0.1";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
101
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
102 XMLDocument!(U) doc;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
103 doc.Node lastElement;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
104 //DocPrinter!(U) printer;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
105 doc.Node lastElementSaved;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
106
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
107 bool hasBegunArchiving;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
108 bool hasBegunUnarchiving;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
109
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
110 DataType[void*] archivedReferences;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
111 void*[DataType] unarchivedReferences;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
112
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
113 ArrayNode[Array] arraysToBeArchived;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
114 void[][DataType] unarchivedSlices;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
115
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
116 size_t idCounter;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
117 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
118
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
119 this ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
120 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
121 doc = new XMLDocument!(U);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
122 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
123
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
124 public void beginArchiving ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
125 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
126 if (!hasBegunArchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
127 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
128 doc.header;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
129 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
130 .attribute(Attributes.typeAttribute, archiveType)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
131 .attribute(Attributes.versionAttribute, archiveVersion);
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
132 lastElement = lastElement.element(Tags.dataTag);
0
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 = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
135 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
136 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
137
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
138 public void beginUnarchiving (DataType data)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
139 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
140 if (!hasBegunUnarchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
141 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
142 doc.parse(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
143 hasBegunUnarchiving = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
144
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
145 auto set = doc.query[Tags.archiveTag][Tags.dataTag];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
146
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
147 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
148 lastElement = set.nodes[0];
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
149
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
150 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
151 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
152 if (errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
153 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
154 if (set.nodes.length == 0)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
155 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
156
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
157 else
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
158 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
159 }
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
160 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
161 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
162 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
163
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
164 public DataType data ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
165 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
166 /*if (!printer)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
167 printer = new DocPrinter!(U);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
168
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
169 return printer.print(doc);*/
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
170
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
171 return doc.toString();
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
172 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
173
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
174 public void reset ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
175 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
176 hasBegunArchiving = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
177 hasBegunUnarchiving = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
178 idCounter = 0;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
179 doc.reset;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
180 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
181
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
182 private void begin ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
183 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
184 lastElementSaved = lastElement;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
185 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
186
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
187 private void end ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
188 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
189 lastElement = lastElementSaved;
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 public void archive (T) (T value, DataType key, void delegate () dg = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
193 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
194 if (!hasBegunArchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
195 beginArchiving();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
196
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
197 restore(lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
198 bool callDelegate = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
199
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
200 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
201 archiveTypeDef(value, key);
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 static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
204 archiveObject(value, key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
205
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
206 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
207 archiveStruct(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
208
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
209 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
210 archiveString(value, 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 else static if (isArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
213 archiveArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
214
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
215 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
216 archiveAssociativeArray(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
217
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
218 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
219 archivePrimitive(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
220
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
221 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
222 archivePointer(value, key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
223
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
224 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
225 archiveEnum(value, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
226
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
227 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
228 static assert(false, format!(`The type "`, T, `" cannot be archived.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
229
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
230 if (callDelegate && dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
231 dg();
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
232 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
233 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
234
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
235 private void archiveObject (T) (T value, DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
236 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
237 if (!value)
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.element(Tags.nullTag)
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(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.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
242 callDelegate = false;
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 else if (auto reference = getArchivedReference(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
246 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
247 archiveReference(key, reference);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
248 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
249 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
250
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
251 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
252 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
253 DataType id = nextId;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
254
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
255 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
256 .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
257 .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
258 .attribute(Attributes.keyAttribute, key)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
259 .attribute(Attributes.idAttribute, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
260
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
261 addArchivedReference(value, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
262 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
263 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
264
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
265 private void archiveStruct (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
266 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
267 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
268 .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
269 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
270 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
271
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
272 private void archiveString (T) (T value, DataType key)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
273 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
274 archiveArrayImpl(value, key, Tags.stringTag, toDataType(value));
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
275 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
276
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
277 private void archiveArray (T) (T value, DataType key)
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
278 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
279 archiveArrayImpl(value, key, Tags.arrayTag);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
280 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
281
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
282 private void archiveArrayImpl (T) (T value, DataType key, DataType tag, DataType content = null)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
283 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
284 DataType id = nextId;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
285 auto parent = lastElement;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
286
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
287 if (value.length == 0)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
288 lastElement = lastElement.element(tag);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
289
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
290 else
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
291 lastElement = doc.createNode(tag, content);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
292
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
293 lastElement.attribute(Attributes.typeAttribute, toDataType(BaseTypeOfArray!(T).stringof))
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
294 .attribute(Attributes.lengthAttribute, toDataType(value.length))
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
295 .attribute(Attributes.keyAttribute, key)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
296 .attribute(Attributes.idAttribute, id);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
297
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
298 arraysToBeArchived[Array(value)] = ArrayNode(parent, lastElement, id, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
299 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
300
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
301 private void archiveAssociativeArray (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
302 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
303 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
304 .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
305 .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
306 .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
307 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
308 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
309
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
310 private void archivePointer (T) (T value, DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
311 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
312 if (auto reference = getArchivedReference(value))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
313 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
314 archiveReference(key, reference);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
315 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
316 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
317
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
318 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
319 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
320 DataType id = nextId;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
321
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
322 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
323 .attribute(Attributes.keyAttribute, key)
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
324 .attribute(Attributes.idAttribute, id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
325
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
326 addArchivedReference(value, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
327 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
328 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
329
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
330 private void archiveEnum (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
331 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
332 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
333 .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
334 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
335 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
336
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
337 private void archivePrimitive (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
338 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
339 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
340 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
341 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
342
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
343 private void archiveTypeDef (T) (T value, DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
344 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
345 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
346 .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
347 .attribute(Attributes.key, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
348 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
349
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
350 public T unarchive (T) (DataType key, T delegate (T) dg = null)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
351 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
352 if (!hasBegunUnarchiving)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
353 beginUnarchiving(data);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
354
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
355 return restore!(T)(lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
356 T value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
357
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
358 bool callDelegate = true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
359
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
360 static if (isTypeDef!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
361 value = unarchiveTypeDef!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
362
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
363 else static if (isObject!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
364 value = unarchiveObject!(T)(key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
365
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
366 else static if (isStruct!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
367 value = unarchiveStruct!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
368
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
369 else static if (isString!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
370 value = unarchiveString!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
371
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
372 else static if (isArray!(T))
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
373 value = unarchiveArray!(T)(key, callDelegate);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
374
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
375 else static if (isAssociativeArray!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
376 value = unarchiveAssociativeArray!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
377
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
378 else static if (isPrimitive!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
379 value = unarchivePrimitive!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
380
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
381 else static if (isPointer!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
382 value = unarchivePointer!(T)(key, callDelegate);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
383
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
384 else static if (isEnum!(T))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
385 value = unarchiveEnum!(T)(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
386
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
387 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
388 static assert(false, format!(`The type "`, T, `" cannot be unarchived.`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
389
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
390 if (callDelegate && dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
391 return dg(value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
392
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
393 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
394 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
395 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
396
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
397 private T unarchiveObject (T) (DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
398 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
399 DataType id = unarchiveReference(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
400
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
401 if (auto reference = getUnarchivedReference!(T)(id))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
402 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
403 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
404 return *reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
405 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
406
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
407 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
408
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
409 if (!tmp.isValid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
410 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
411 lastElement = getElement(Tags.nullTag, key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
412 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
413 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
414 }
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
415
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
416 lastElement = tmp;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
417
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
418 auto runtimeType = getValueOfAttribute(Attributes.runtimeTypeAttribute);
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
419
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
420 if (!runtimeType)
22
963b756ed579 Resolved merge conflicts.
Jacob Carlborg <doob@me.com>
parents: 19 21
diff changeset
421 return T.init;
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
422
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
423 auto name = fromDataType!(string)(runtimeType);
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
424 id = getValueOfAttribute(Attributes.idAttribute);
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
425
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
426 if (!id)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
427 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
428
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
429 T result = cast(T) newInstance(name);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
430
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
431 addUnarchivedReference(result, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
432
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
433 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
434 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
435
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
436 private T unarchiveStruct (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
437 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
438 auto element = getElement(Tags.structTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
439
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
440 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
441 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
442
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
443 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
444 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
445
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
446 private T unarchiveString (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
447 {
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
448 auto slice = unarchiveSlice(key);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
449
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
450 if (auto tmp = getUnarchivedSlice!(T)(slice))
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
451 return *tmp;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
452
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
453 auto element = getElement(Tags.stringTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
454
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
455 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
456 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
457
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
458 auto value = fromDataType!(T)(element.value);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
459 slice.id = getValueOfAttribute(Attributes.idAttribute, element);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
460
22
963b756ed579 Resolved merge conflicts.
Jacob Carlborg <doob@me.com>
parents: 19 21
diff changeset
461 if (!slice.id)
963b756ed579 Resolved merge conflicts.
Jacob Carlborg <doob@me.com>
parents: 19 21
diff changeset
462 return T.init;
963b756ed579 Resolved merge conflicts.
Jacob Carlborg <doob@me.com>
parents: 19 21
diff changeset
463
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
464 addUnarchivedSlice(value, slice.id);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
465
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
466 return value;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
467 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
468
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
469 private T unarchiveArray (T) (DataType key, ref bool callDelegate)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
470 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
471 auto slice = unarchiveSlice(key);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
472
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
473 if (auto tmp = getUnarchivedSlice!(T)(slice))
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
474 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
475 callDelegate = false;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
476 return *tmp;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
477 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
478
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
479 T value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
480
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
481 auto element = getElement(Tags.arrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
482
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
483 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
484 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
485
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
486 lastElement = element;
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
487 auto length = getValueOfAttribute(Attributes.lengthAttribute);
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
488
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
489 if (!length)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
490 return T.init;
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
491
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
492 value.length = fromDataType!(size_t)(length);
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
493 slice.id = getValueOfAttribute(Attributes.idAttribute);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
494
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
495 if (!slice.id)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
496 return T.init;
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
497
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
498 addUnarchivedSlice(value, slice.id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
501 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
502
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
503 private T unarchiveAssociativeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
504 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
505 auto element = getElement(Tags.associativeArrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
506
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
507 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
508 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
511 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
513 private T unarchivePointer (T) (DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
514 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 DataType id = unarchiveReference(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
516
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
517 if (auto reference = getUnarchivedReference!(T)(id))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
519 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
520 return *reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
521 }
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
522
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
523 auto element = getElement(Tags.pointerTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
524
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
525 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
526 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
527
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
528 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
529 id = getValueOfAttribute(Attributes.idAttribute);
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
530
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
531 if (!id)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
532 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
533
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
534 T result = new BaseTypeOfPointer!(T);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
535
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
536 addUnarchivedReference(result, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
537
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
538 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
539 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
540
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
541 private T unarchiveEnum (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
542 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
543 auto element = getElement(Tags.enumTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
544
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
545 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
546 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
547
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
548 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
550
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
551 private T unarchivePrimitive (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
552 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
553 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
554
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
555 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
556 return T.init;
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
557
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
558 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
559 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
560
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
561 private T unarchiveTypeDef (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
562 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
563 auto element = getElement(Tags.typedefTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
564
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
565 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
566 lastElement = element;
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 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
569 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571 public AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T)) unarchiveAssociativeArrayVisitor (T) ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573 return AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T))(this);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
575
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
576 public void archiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
577 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
578 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
579 .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
580 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
581 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
582
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
583 public void unarchiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
584 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
585 auto element = getElement(Tags.baseTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
586
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
587 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
588 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
589 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
590
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
591 version (Tango)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
592 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
593 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
594 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
595 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
596 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
597
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
598 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
599 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
600 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
601 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
602
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
603 else
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
604 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
605 mixin(
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
606 `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
607 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
608 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
609 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
610
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
611 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
612 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
613 }`
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
614 );
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
615 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
616
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 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
618 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
619 auto set = lastElement.query[tag].attribute((doc.Node node) {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620 if (node.name == attribute && node.value == key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
621 return true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
622
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623 return false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
624 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
625
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
626 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
627 return set.nodes[0].parent;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
628
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
629 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
630 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
631 if (throwOnError && errorCallback)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
632 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
633 if (set.nodes.length == 0)
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
634 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
635
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
636 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
637 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
638 }
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
639
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
640 return doc.Node.invalid;
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
641 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
642 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
643
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
644 private DataType getValueOfAttribute (DataType attribute, doc.Node element = doc.Node.invalid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
645 {
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
646 if (!element.isValid) element = lastElement;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
647
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
648 auto set = element.query.attribute(attribute);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
649
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
650 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
651 return set.nodes[0].value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
652
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
653 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
654 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
655 if (errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
656 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
657 if (set.nodes.length == 0)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
658 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
659
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
660 else
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
661 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
662 }
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
663 }
22
963b756ed579 Resolved merge conflicts.
Jacob Carlborg <doob@me.com>
parents: 19 21
diff changeset
664
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
665 return null;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
666 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
667
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
668 private void addArchivedReference (T) (T value, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
669 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
670 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
671
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
672 archivedReferences[cast(void*) value] = id;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
673 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
674
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
675 private void addUnarchivedReference (T) (T value, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
676 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
677 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
678
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
679 unarchivedReferences[id] = cast(void*) value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
680 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
681
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
682 private void addUnarchivedSlice (T) (T value, DataType id)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
683 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
684 static assert(isArray!(T) || isString!(T), format!(`The given type "`, T, `" is not a slice type, i.e. array or string.`));
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
685
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
686 unarchivedSlices[id] = value;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
687 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
688
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
689 private DataType getArchivedReference (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
690 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
691 if (auto tmp = cast(void*) value in archivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
692 return *tmp;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
693
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
694 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
695 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
696
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
697 private T* getUnarchivedReference (T) (DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
698 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
699 if (auto reference = id in unarchivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
700 return cast(T*) reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
701
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
702 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
703 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
704
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
705 private T* getUnarchivedSlice (T) (Slice slice)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
706 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
707 if (auto array = slice.id in unarchivedSlices)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
708 return &(cast(T) *array)[slice.offset .. slice.length + 1]; // dereference the array, cast it to the right type,
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
709 // slice it and then return a pointer to the result
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
710 return null;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
711 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
712
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
713 private DataType nextId ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
714 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
715 return toDataType(idCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
716 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
717
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
718 private void archiveReference (DataType key, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
719 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
720 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
721 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
722 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
723
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
724 private DataType unarchiveReference (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
725 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
726 auto element = getElement(Tags.referenceTag, key, Attributes.keyAttribute, false);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
727
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
728 if (element.isValid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
729 return element.value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
730
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
731 return cast(DataType) null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
732 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
733
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
734 private Slice unarchiveSlice (DataType key)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
735 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
736 auto element = getElement(Tags.sliceTag, key, Attributes.keyAttribute, false);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
737
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
738 if (element.isValid)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
739 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
740 auto length = fromDataType!(size_t)(getValueOfAttribute(Attributes.lengthAttribute, element));
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
741 auto offset = fromDataType!(size_t)(getValueOfAttribute(Attributes.offsetAttribute, element));
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
742
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
743 return Slice(length, offset, element.value);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
744 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
745
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
746 return Slice.init;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
747 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
748
6
ae24aae69a3b Added logo
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
749 private struct AssociativeArrayVisitor (Key, Value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
750 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
751 private XMLArchive archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
752
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
753 static AssociativeArrayVisitor opCall (XMLArchive archive)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
754 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
755 AssociativeArrayVisitor aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
756 aai.archive = archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
757
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
758 return aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
759 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
760
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
761 int opApply(int delegate(ref Key, ref Value) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
762 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
763 int result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
764
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
765 foreach (node ; archive.lastElement.children)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
766 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
767 restore(archive.lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
768 archive.lastElement = node;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
769
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
770 if (node.attributes.exist)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
771 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
772 Key key = to!(Key)(archive.getValueOfAttribute(Attributes.keyAttribute));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
773 Value value = to!(Value)(node.value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
774
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
775 result = dg(key, value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
776 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
777 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
778
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
779 if (result)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
780 break;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
781 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
782
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
783 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
784 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
785 }
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
786
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
787 public void postProcess ()
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
788 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
789 bool foundSlice = true;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
790
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
791 foreach (slice, sliceNode ; arraysToBeArchived)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
792 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
793 foreach (array, arrayNode ; arraysToBeArchived)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
794 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
795 if (slice.isSliceOf(array) && slice != array)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
796 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
797 sliceNode.parent.element(Tags.sliceTag, arrayNode.id)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
798 .attribute(Attributes.keyAttribute, sliceNode.key)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
799 .attribute(Attributes.offsetAttribute, toDataType((slice.ptr - array.ptr) / slice.elementSize))
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
800 .attribute(Attributes.lengthAttribute, toDataType(slice.length));
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
801
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
802 foundSlice = true;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
803 break;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
804 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
805
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
806 else
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
807 foundSlice = false;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
808 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
809
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
810 if (!foundSlice)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
811 sliceNode.parent.attach(sliceNode.node);
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
812 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
813 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
814 }