comparison orange/serialization/archives/Archive.d @ 26:78e5fef4bbf2 experimental

Third step in refactoring the API. Stating to add unit tests.
author Jacob Carlborg <doob@me.com>
date Tue, 19 Oct 2010 10:22:10 +0200
parents b51e953f79eb
children bffcbc8c392b
comparison
equal deleted inserted replaced
25:b51e953f79eb 26:78e5fef4bbf2
14 import std.conv; 14 import std.conv;
15 alias ConvError ConversionException; 15 alias ConvError ConversionException;
16 } 16 }
17 17
18 import orange.serialization.archives.ArchiveException; 18 import orange.serialization.archives.ArchiveException;
19 import orange.util.string; 19 import orange.serialization.Serializer;
20 import orange.core.string;
21
22 version (Tango) alias void[] UntypedData;
23 else mixin ("alias immutable(void)[] UntypedData;");
20 24
21 private enum ArchiveMode 25 private enum ArchiveMode
22 { 26 {
23 archiving, 27 archiving,
24 unarchiving 28 unarchiving
38 42
39 struct Slice 43 struct Slice
40 { 44 {
41 size_t length; 45 size_t length;
42 size_t offset; 46 size_t offset;
43 size_t id; 47 size_t id = size_t.max;
44 } 48 }
45 49
46 interface IArchive 50 interface IArchive
47 { 51 {
48 version (Tango) alias void[] IDataType; 52 alias Serializer.Id Id;
49 else mixin ("alias immutable(void)[] IDataType;");
50 53
51 void beginArchiving (); 54 void beginArchiving ();
52 void beginUnarchiving (IDataType data); 55 void beginUnarchiving (UntypedData data);
53 56
54 IDataType data (); 57 UntypedData untypedData ();
55 void postProcess ();
56 void reset (); 58 void reset ();
57 59
58 void archiveArray (Array array, string type, string key, size_t id, void delegate () dg); 60 void archiveArray (Array array, string type, string key, Id id, void delegate () dg);
59 void archiveAssociativeArray (string keyType, string valueType, size_t length, string key, size_t id, void delegate () dg); 61 void archiveAssociativeArray (string keyType, string valueType, size_t length, string key, Id id, void delegate () dg);
60 62 void archiveAssociativeArrayKey (string key, void delegate () dg);
61 void archiveEnum (bool value, string key, size_t id); 63 void archiveAssociativeArrayValue (string key, void delegate () dg);
62 void archiveEnum (byte value, string key, size_t id); 64
63 void archiveEnum (char value, string key, size_t id); 65 void archiveEnum (bool value, string baseType, string key, Id id);
64 void archiveEnum (dchar value, string key, size_t id); 66 void archiveEnum (byte value, string baseType, string key, Id id);
65 void archiveEnum (int value, string key, size_t id); 67 void archiveEnum (char value, string baseType, string key, Id id);
66 void archiveEnum (long value, string key, size_t id); 68 void archiveEnum (dchar value, string baseType, string key, Id id);
67 void archiveEnum (short value, string key, size_t id); 69 void archiveEnum (int value, string baseType, string key, Id id);
68 void archiveEnum (ubyte value, string key, size_t id); 70 void archiveEnum (long value, string baseType, string key, Id id);
69 void archiveEnum (uint value, string key, size_t id); 71 void archiveEnum (short value, string baseType, string key, Id id);
70 void archiveEnum (ulong value, string key, size_t id); 72 void archiveEnum (ubyte value, string baseType, string key, Id id);
71 void archiveEnum (ushort value, string key, size_t id); 73 void archiveEnum (uint value, string baseType, string key, Id id);
72 void archiveEnum (wchar value, string key, size_t id); 74 void archiveEnum (ulong value, string baseType, string key, Id id);
73 75 void archiveEnum (ushort value, string baseType, string key, Id id);
74 void archiveBaseClass (string type, string key, size_t id); 76 void archiveEnum (wchar value, string baseType, string key, Id id);
77
78 void archiveBaseClass (string type, string key, Id id);
75 void archiveNull (string type, string key); 79 void archiveNull (string type, string key);
76 void archiveObject (string runtimeType, string type, string key, size_t id, void delegate () dg); 80 void archiveObject (string runtimeType, string type, string key, Id id, void delegate () dg);
77 void archivePointer (string key, size_t id); 81 void archivePointer (string key, Id id, void delegate () dg);
78 void archiveReference (string key, size_t id); 82 void archiveReference (string key, Id id);
79 //void archiveSlice (size_t length, size_t offset, string key, size_t id); 83 void archiveSlice (Slice slice, Id sliceId, Id arrayId);
80 void archiveStruct (string type, string key, size_t id, void delegate () dg); 84 void archiveStruct (string type, string key, Id id, void delegate () dg);
81 void archiveTypedef (string type, string key, size_t id, void delegate () dg); 85 void archiveTypedef (string type, string key, Id id, void delegate () dg);
82 86
83 void archive (string value, string key, size_t id); 87 void archive (string value, string key, Id id);
84 void archive (wstring value, string key, size_t id); 88 void archive (wstring value, string key, Id id);
85 void archive (dstring value, string key, size_t id); 89 void archive (dstring value, string key, Id id);
86 void archive (bool value, string key, size_t id); 90 void archive (bool value, string key, Id id);
87 void archive (byte value, string key, size_t id); 91 void archive (byte value, string key, Id id);
88 //void archive (cdouble value, string key, size_t id); 92 //void archive (cdouble value, string key, Id id); // currently not suppported by to!()
89 //void archive (cent value, string key, size_t id); 93 //void archive (cent value, string key, Id id);
90 //void archive (cfloat value, string key, size_t id); 94 //void archive (cfloat value, string key, Id id); // currently not suppported by to!()
91 void archive (char value, string key, size_t id); 95 void archive (char value, string key, Id id); // currently not implemented but a reserved keyword
92 //void archive (creal value, string key, size_t id); 96 //void archive (creal value, string key, Id id); // currently not suppported by to!()
93 void archive (dchar value, string key, size_t id); 97 void archive (dchar value, string key, Id id);
94 void archive (double value, string key, size_t id); 98 void archive (double value, string key, Id id);
95 void archive (float value, string key, size_t id); 99 void archive (float value, string key, Id id);
96 //void archive (idouble value, string key, size_t id); 100 //void archive (idouble value, string key, Id id); // currently not suppported by to!()
97 //void archive (ifloat value, string key, size_t id); 101 //void archive (ifloat value, string key, Id id); // currently not suppported by to!()
98 void archive (int value, string key, size_t id); 102 void archive (int value, string key, Id id);
99 //void archive (ireal value, string key, size_t id); 103 //void archive (ireal value, string key, Id id); // currently not suppported by to!()
100 void archive (long value, string key, size_t id); 104 void archive (long value, string key, Id id);
101 void archive (real value, string key, size_t id); 105 void archive (real value, string key, Id id);
102 void archive (short value, string key, size_t id); 106 void archive (short value, string key, Id id);
103 void archive (ubyte value, string key, size_t id); 107 void archive (ubyte value, string key, Id id);
104 //void archive (ucent value, string key, size_t id); 108 //void archive (ucent value, string key, Id id); // currently not implemented but a reserved keyword
105 void archive (uint value, string key, size_t id); 109 void archive (uint value, string key, Id id);
106 void archive (ulong value, string key, size_t id); 110 void archive (ulong value, string key, Id id);
107 void archive (ushort value, string key, size_t id); 111 void archive (ushort value, string key, Id id);
108 void archive (wchar value, string key, size_t id); 112 void archive (wchar value, string key, Id id);
113
114 Id unarchiveArray (string key, void delegate (size_t length) dg);
115 void unarchiveArray (Id id, void delegate (size_t length) dg);
116 void unarchiveAssociativeArray (string type, void delegate (size_t length) dg);
117 void unarchiveAssociativeArrayKey (string key, void delegate () dg);
118 void unarchiveAssociativeArrayValue (string key, void delegate () dg);
119
120 bool unarchiveEnumBool (string key);
121 byte unarchiveEnumByte (string key);
122 char unarchiveEnumChar (string key);
123 dchar unarchiveEnumDchar (string key);
124 int unarchiveEnumInt (string key);
125 long unarchiveEnumLong (string key);
126 short unarchiveEnumShort (string key);
127 ubyte unarchiveEnumUbyte (string key);
128 uint unarchiveEnumUint (string key);
129 ulong unarchiveEnumUlong (string key);
130 ushort unarchiveEnumUshort (string key);
131 wchar unarchiveEnumWchar (string key);
132
133 // Object unarchiveBaseClass (string key);
134 // void unarchiveNull (string key);
135 void unarchiveObject (string key, out Id id, out Object result, void delegate () dg);
136 Id unarchivePointer (string key, void delegate () dg);
137 Id unarchiveReference (string key);
138 Slice unarchiveSlice (string key);
139 void unarchiveStruct (string key, void delegate () dg);
140 void unarchiveTypedef (string key, void delegate () dg);
141
142 string unarchiveString (string key, out Id id);
143 wstring unarchiveWstring (string key, out Id id);
144 dstring unarchiveDstring (string key, out Id id);
145
146 string unarchiveString (Id id);
147 wstring unarchiveWstring (Id id);
148 dstring unarchiveDstring (Id id);
149 bool unarchiveBool (string key);
150 byte unarchiveByte (string key);
151 //cdouble unarchiveCdouble (string key); // currently not suppported by to!()
152 //cent unarchiveCent (string key); // currently not implemented but a reserved keyword
153 //cfloat unarchiveCfloat (string key); // currently not suppported by to!()
154 char unarchiveChar (string key); // currently not implemented but a reserved keyword
155 //creal unarchiveCreal (string key); // currently not suppported by to!()
156 dchar unarchiveDchar (string key);
157 double unarchiveDouble (string key);
158 float unarchiveFloat (string key);
159 //idouble unarchiveIdouble (string key); // currently not suppported by to!()
160 //ifloat unarchiveIfloat (string key); // currently not suppported by to!()*/
161 int unarchiveInt (string key);
162 //ireal unarchiveIreal (string key); // currently not suppported by to!()
163 long unarchiveLong (string key);
164 real unarchiveReal (string key);
165 short unarchiveShort (string key);
166 ubyte unarchiveUbyte (string key);
167 //ucent unarchiveCcent (string key); // currently not implemented but a reserved keyword
168 uint unarchiveUint (string key);
169 ulong unarchiveUlong (string key);
170 ushort unarchiveUshort (string key);
171 wchar unarchiveWchar (string key);
172
173 void postProcessArray (Id id);
109 } 174 }
110 175
111 abstract class Archive (U) : IArchive 176 abstract class Archive (U) : IArchive
112 { 177 {
113 version (Tango) alias U[] DataType; 178 version (Tango) alias U[] Data;
114 else mixin ("alias immutable(U)[] DataType;"); 179 else mixin ("alias immutable(U)[] Data;");
115 180
116 alias void delegate (ArchiveException exception, DataType[] data) ErrorCallback; 181 alias void delegate (ArchiveException exception, string[] data) ErrorCallback;
117 182
118 protected ErrorCallback errorCallback; 183 protected ErrorCallback errorCallback;
119 184
120 protected this (ErrorCallback errorCallback) 185 protected this (ErrorCallback errorCallback)
121 { 186 {
122 this.errorCallback = errorCallback; 187 this.errorCallback = errorCallback;
123 } 188 }
124 189
125 protected DataType toDataType (T) (T value) 190 protected Data toData (T) (T value)
126 { 191 {
127 try 192 try
128 return to!(DataType)(value); 193 return to!(Data)(value);
129 194
130 catch (ConversionException e) 195 catch (ConversionException e)
131 throw new ArchiveException(e); 196 throw new ArchiveException(e);
132 } 197 }
133 198
134 protected T fromDataType (T) (DataType value) 199 protected T fromData (T) (Data value)
135 { 200 {
136 try 201 try
137 return to!(T)(value); 202 return to!(T)(value);
138 203
139 catch (ConversionException e) 204 catch (ConversionException e)
140 throw new ArchiveException(e); 205 throw new ArchiveException(e);
141 } 206 }
142 207
208 protected Id toId (Data value)
209 {
210 return fromData!(Id)(value);
211 }
212
143 protected bool isSliceOf (T, U = T) (T[] a, U[] b) 213 protected bool isSliceOf (T, U = T) (T[] a, U[] b)
144 { 214 {
145 void* aPtr = a.ptr; 215 void* aPtr = a.ptr;
146 void* bPtr = b.ptr; 216 void* bPtr = b.ptr;
147 217