Mercurial > projects > orange
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 |