annotate orange/serialization/archives/XMLArchive.d @ 21:51f05fd6a626

Merged changes from dsource repository.
author Jacob Carlborg <doob@me.com>
date Mon, 04 Oct 2010 20:18:02 +0200
parents 9a575087b961
children 963b756ed579
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
1 /**
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
2 * Copyright: Copyright (c) 2010 Jacob Carlborg.
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
3 * Authors: Jacob Carlborg
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
4 * Version: Initial created: Jan 26, 2010
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
6 */
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
7 module orange.serialization.archives.XMLArchive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
8
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
9 version (Tango)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
10 import tango.util.Convert : to;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
11
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
12 else
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
13 import std.conv;
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
14
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
15 import orange.serialization.archives._;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
16 import orange.util._;
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
17 import orange.xml.XMLDocument;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
18
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
19 private enum ArchiveMode
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
20 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
21 archiving,
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
22 unarchiving
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
23 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
24
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
25 class XMLArchive (U = char) : Archive!(U)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
26 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
27 static assert (isChar!(U), format!(`The given type "`, U, `" is not a valid type. Valid types are: "char", "wchar" and "dchar".`));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
28
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
29 private struct Tags
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
30 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
31 static const DataType structTag = "struct";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
32 static const DataType dataTag = "data";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
33 static const DataType archiveTag = "archive";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
34 static const DataType arrayTag = "array";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
35 static const DataType objectTag = "object";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
36 static const DataType baseTag = "base";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
37 static const DataType stringTag = "string";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
38 static const DataType referenceTag = "reference";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
39 static const DataType pointerTag = "pointer";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
40 static const DataType associativeArrayTag = "associativeArray";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
41 static const DataType typedefTag = "typedef";
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
42 static const DataType nullTag = "null";
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)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
421 return T.init;
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;
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
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
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
461 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
462
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
463 return value;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
464 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
465
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
466 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
467 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
468 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
469
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
470 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
471 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
472 callDelegate = false;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
473 return *tmp;
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
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
476 T value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
477
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
478 auto element = getElement(Tags.arrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
479
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
480 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
481 return T.init;
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 lastElement = element;
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
484 auto length = getValueOfAttribute(Attributes.lengthAttribute);
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
485
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
486 if (!length)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
487 return T.init;
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
488
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
489 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
490 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
491
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
492 if (!slice.id)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
493 return T.init;
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
494
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
495 addUnarchivedSlice(value, slice.id);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
496
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
497 return value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
498 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
499
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
500 private T unarchiveAssociativeArray (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
501 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
502 auto element = getElement(Tags.associativeArrayTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
503
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
504 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
505 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
506
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
507 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
508 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
509
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
510 private T unarchivePointer (T) (DataType key, ref bool callDelegate)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
511 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
512 DataType id = unarchiveReference(key);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
513
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
514 if (auto reference = getUnarchivedReference!(T)(id))
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
515 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
516 callDelegate = false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
517 return *reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
518 }
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
519
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
520 auto element = getElement(Tags.pointerTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
521
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
522 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
523 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
524
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
525 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
526 id = getValueOfAttribute(Attributes.idAttribute);
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
527
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
528 if (!id)
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
529 return T.init;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
530
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
531 T result = new BaseTypeOfPointer!(T);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
532
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
533 addUnarchivedReference(result, id);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
534
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
535 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
536 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
537
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
538 private T unarchiveEnum (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
539 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
540 auto element = getElement(Tags.enumTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
541
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
542 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
543 return T.init;
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 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
546 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
547
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
548 private T unarchivePrimitive (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
549 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
550 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
551
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
552 if (!element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
553 return T.init;
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 return fromDataType!(T)(element.value);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
556 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
557
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
558 private T unarchiveTypeDef (T) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
559 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
560 auto element = getElement(Tags.typedefTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
561
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
562 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
563 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
564
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
565 return T.init;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
566 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
567
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
568 public AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T)) unarchiveAssociativeArrayVisitor (T) ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
569 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
570 return AssociativeArrayVisitor!(KeyTypeOfAssociativeArray!(T), ValueTypeOfAssociativeArray!(T))(this);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
571 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
572
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
573 public void archiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
574 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
575 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
576 .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
577 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
578 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
579
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
580 public void unarchiveBaseClass (T : Object) (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
581 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
582 auto element = getElement(Tags.baseTag, key);
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
583
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
584 if (element.isValid)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
585 lastElement = element;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
586 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
587
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
588 version (Tango)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
589 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
590 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
591 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
592 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
593 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
594
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
595 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
596 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
597 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
598 }
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
599
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
600 else
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 mixin(
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
603 `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
604 {
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
605 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
606 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
607
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
608 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
609 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
610 }`
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
611 );
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
612 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
613
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
614 private 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
615 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
616 auto set = lastElement.query[tag].attribute((doc.Node node) {
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
617 if (node.name == attribute && node.value == key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
618 return true;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
619
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
620 return false;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
621 });
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
622
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
623 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
624 return set.nodes[0].parent;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
625
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
626 else
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
627 {
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
628 if (throwOnError && errorCallback)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
629 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
630 if (set.nodes.length == 0)
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
631 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
632
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
633 else
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 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
635 }
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
636
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
637 return doc.Node.invalid;
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
638 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
639 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
640
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
641 private DataType getValueOfAttribute (DataType attribute, doc.Node element = doc.Node.invalid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
642 {
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
643 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
644
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
645 auto set = element.query.attribute(attribute);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
646
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
647 if (set.nodes.length == 1)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
648 return set.nodes[0].value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
649
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
650 else
18
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
651 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
652 if (errorCallback)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
653 {
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
654 if (set.nodes.length == 0)
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
655 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
656
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
657 else
3d42ea434d46 Added an error callback. Fixes #3 and #4.
Jacob Carlborg <doob@me.com>
parents: 11
diff changeset
658 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
659 }
21
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
660 }
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
661
51f05fd6a626 Merged changes from dsource repository.
Jacob Carlborg <doob@me.com>
parents: 20
diff changeset
662 return null;
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
663 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
664
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
665 private void addArchivedReference (T) (T value, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
666 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
667 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
668
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
669 archivedReferences[cast(void*) value] = id;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
670 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
671
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
672 private void addUnarchivedReference (T) (T value, DataType 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 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
675
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
676 unarchivedReferences[id] = cast(void*) value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
677 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
678
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
679 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
680 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
681 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
682
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
683 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
684 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
685
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
686 private DataType getArchivedReference (T) (T value)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
687 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
688 if (auto tmp = cast(void*) value in archivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
689 return *tmp;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
690
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
691 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
692 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
693
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
694 private T* getUnarchivedReference (T) (DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
695 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
696 if (auto reference = id in unarchivedReferences)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
697 return cast(T*) reference;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
698
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
699 return null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
700 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
701
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
702 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
703 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
704 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
705 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
706 // 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
707 return null;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
708 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
709
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
710 private DataType nextId ()
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
711 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
712 return toDataType(idCounter++);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
713 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
714
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
715 private void archiveReference (DataType key, DataType id)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
716 {
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
717 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
718 .attribute(Attributes.keyAttribute, key);
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
719 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
720
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
721 private DataType unarchiveReference (DataType key)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
722 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
723 auto element = getElement(Tags.referenceTag, key, Attributes.keyAttribute, false);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
724
9
99c52d46822a Serialization works now with D2, deserialization still doesn't work
Jacob Carlborg <doob@me.com>
parents: 6
diff changeset
725 if (element.isValid)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
726 return element.value;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
727
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
728 return cast(DataType) null;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
729 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
730
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
731 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
732 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
733 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
734
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
735 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
736 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
737 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
738 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
739
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
740 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
741 }
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.init;
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
6
ae24aae69a3b Added logo
Jacob Carlborg <doob@me.com>
parents: 0
diff changeset
746 private struct AssociativeArrayVisitor (Key, Value)
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
747 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
748 private XMLArchive archive;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
749
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
750 static AssociativeArrayVisitor opCall (XMLArchive archive)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
751 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
752 AssociativeArrayVisitor aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
753 aai.archive = 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 return aai;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
756 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
757
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
758 int opApply(int delegate(ref Key, ref Value) dg)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
759 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
760 int result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
761
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
762 foreach (node ; archive.lastElement.children)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
763 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
764 restore(archive.lastElement) in {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
765 archive.lastElement = node;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
766
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
767 if (node.attributes.exist)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
768 {
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
769 Key key = to!(Key)(archive.getValueOfAttribute(Attributes.keyAttribute));
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
770 Value value = to!(Value)(node.value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
771
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
772 result = dg(key, value);
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
773 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
774 };
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
775
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
776 if (result)
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
777 break;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
778 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
779
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
780 return result;
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
781 }
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
782 }
20
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
783
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
784 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
785 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
786 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
787
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
788 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
789 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
790 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
791 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
792 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
793 {
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
794 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
795 .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
796 .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
797 .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
798
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
799 foundSlice = true;
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
800 break;
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
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
803 else
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
804 foundSlice = false;
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
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
807 if (!foundSlice)
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
808 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
809 }
9a575087b961 Added support for slices. Strings and arrays are now treated as references.
Jacob Carlborg <doob@me.com>
parents: 18
diff changeset
810 }
0
f7b078e85f7f First commit
Jacob Carlborg <doob@me.com>
parents:
diff changeset
811 }