diff 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
line wrap: on
line diff
--- a/orange/serialization/archives/Archive.d	Wed Oct 06 16:18:02 2010 +0200
+++ b/orange/serialization/archives/Archive.d	Tue Oct 19 10:22:10 2010 +0200
@@ -16,7 +16,11 @@
 }
 
 import orange.serialization.archives.ArchiveException;
-import orange.util.string;
+import orange.serialization.Serializer;
+import orange.core.string;
+
+version (Tango) alias void[] UntypedData;
+else mixin ("alias immutable(void)[] UntypedData;");
 
 private enum ArchiveMode
 {
@@ -40,80 +44,141 @@
 {
 	size_t length;
 	size_t offset;
-	size_t id;
+	size_t id = size_t.max;
 }
 
 interface IArchive
 {
-	version (Tango) alias void[] IDataType;
-	else mixin ("alias immutable(void)[] IDataType;");
+	alias Serializer.Id Id;
 	
 	void beginArchiving ();
-	void beginUnarchiving (IDataType data);
+	void beginUnarchiving (UntypedData data);
 	
-	IDataType data ();
-	void postProcess ();
+	UntypedData untypedData ();
 	void reset ();
 	
-	void archiveArray (Array array, string type, string key, size_t id, void delegate () dg);
-	void archiveAssociativeArray (string keyType, string valueType, size_t length, string key, size_t id, void delegate () dg);
+	void archiveArray (Array array, string type, string key, Id id, void delegate () dg);
+	void archiveAssociativeArray (string keyType, string valueType, size_t length, string key, Id id, void delegate () dg);
+	void archiveAssociativeArrayKey (string key, void delegate () dg);
+	void archiveAssociativeArrayValue (string key, void delegate () dg);
 	
-	void archiveEnum (bool value, string key, size_t id);
-	void archiveEnum (byte value, string key, size_t id);
-	void archiveEnum (char value, string key, size_t id);
-	void archiveEnum (dchar value, string key, size_t id);
-	void archiveEnum (int value, string key, size_t id);
-	void archiveEnum (long value, string key, size_t id);
-	void archiveEnum (short value, string key, size_t id);
-	void archiveEnum (ubyte value, string key, size_t id);
-	void archiveEnum (uint value, string key, size_t id);
-	void archiveEnum (ulong value, string key, size_t id);
-	void archiveEnum (ushort value, string key, size_t id);
-	void archiveEnum (wchar value, string key, size_t id);
+	void archiveEnum (bool value, string baseType, string key, Id id);
+	void archiveEnum (byte value, string baseType, string key, Id id);
+	void archiveEnum (char value, string baseType, string key, Id id);
+	void archiveEnum (dchar value, string baseType, string key, Id id);
+	void archiveEnum (int value, string baseType, string key, Id id);
+	void archiveEnum (long value, string baseType, string key, Id id);
+	void archiveEnum (short value, string baseType, string key, Id id);
+	void archiveEnum (ubyte value, string baseType, string key, Id id);
+	void archiveEnum (uint value, string baseType, string key, Id id);
+	void archiveEnum (ulong value, string baseType, string key, Id id);
+	void archiveEnum (ushort value, string baseType, string key, Id id);
+	void archiveEnum (wchar value, string baseType, string key, Id id);
 	
-	void archiveBaseClass (string type, string key, size_t id);
+	void archiveBaseClass (string type, string key, Id id);
 	void archiveNull (string type, string key);
-	void archiveObject (string runtimeType, string type, string key, size_t id, void delegate () dg);
-	void archivePointer (string key, size_t id);
-	void archiveReference (string key, size_t id);
-	//void archiveSlice (size_t length, size_t offset, string key, size_t id);
-	void archiveStruct (string type, string key, size_t id, void delegate () dg);
-	void archiveTypedef (string type, string key, size_t id, void delegate () dg);
+	void archiveObject (string runtimeType, string type, string key, Id id, void delegate () dg);
+	void archivePointer (string key, Id id, void delegate () dg);
+	void archiveReference (string key, Id id);
+	void archiveSlice (Slice slice, Id sliceId, Id arrayId);
+	void archiveStruct (string type, string key, Id id, void delegate () dg);
+	void archiveTypedef (string type, string key, Id id, void delegate () dg);
 
-	void archive (string value, string key, size_t id);
-	void archive (wstring value, string key, size_t id);
-	void archive (dstring value, string key, size_t id);	
-	void archive (bool value, string key, size_t id);
-	void archive (byte value, string key, size_t id);
-	//void archive (cdouble value, string key, size_t id);
-	//void archive (cent value, string key, size_t id);
-	//void archive (cfloat value, string key, size_t id);
-	void archive (char value, string key, size_t id);
-	//void archive (creal value, string key, size_t id);
-	void archive (dchar value, string key, size_t id);
-	void archive (double value, string key, size_t id);
-	void archive (float value, string key, size_t id);
-	//void archive (idouble value, string key, size_t id);
-	//void archive (ifloat value, string key, size_t id);
-	void archive (int value, string key, size_t id);
-	//void archive (ireal value, string key, size_t id);
-	void archive (long value, string key, size_t id);
-	void archive (real value, string key, size_t id);
-	void archive (short value, string key, size_t id);
-	void archive (ubyte value, string key, size_t id);
-	//void archive (ucent value, string key, size_t id);
-	void archive (uint value, string key, size_t id);
-	void archive (ulong value, string key, size_t id);
-	void archive (ushort value, string key, size_t id);
-	void archive (wchar value, string key, size_t id);
+	void archive (string value, string key, Id id);
+	void archive (wstring value, string key, Id id);
+	void archive (dstring value, string key, Id id);	
+	void archive (bool value, string key, Id id);
+	void archive (byte value, string key, Id id);
+	//void archive (cdouble value, string key, Id id); // currently not suppported by to!()
+	//void archive (cent value, string key, Id id);
+	//void archive (cfloat value, string key, Id id); // currently not suppported by to!()
+	void archive (char value, string key, Id id); // currently not implemented but a reserved keyword
+	//void archive (creal value, string key, Id id); // currently not suppported by to!()
+	void archive (dchar value, string key, Id id);
+	void archive (double value, string key, Id id);
+	void archive (float value, string key, Id id);
+	//void archive (idouble value, string key, Id id); // currently not suppported by to!()
+	//void archive (ifloat value, string key, Id id); // currently not suppported by to!()
+	void archive (int value, string key, Id id);
+	//void archive (ireal value, string key, Id id); // currently not suppported by to!()
+	void archive (long value, string key, Id id);
+	void archive (real value, string key, Id id);
+	void archive (short value, string key, Id id);
+	void archive (ubyte value, string key, Id id);
+	//void archive (ucent value, string key, Id id); // currently not implemented but a reserved keyword
+	void archive (uint value, string key, Id id);
+	void archive (ulong value, string key, Id id);
+	void archive (ushort value, string key, Id id);
+	void archive (wchar value, string key, Id id);
+	
+	Id unarchiveArray (string key, void delegate (size_t length) dg);
+	void unarchiveArray (Id id, void delegate (size_t length) dg);
+	void unarchiveAssociativeArray (string type, void delegate (size_t length) dg);
+	void unarchiveAssociativeArrayKey (string key, void delegate () dg);
+	void unarchiveAssociativeArrayValue (string key, void delegate () dg);
+	
+	bool unarchiveEnumBool (string key);
+	byte unarchiveEnumByte (string key);
+	char unarchiveEnumChar (string key);
+	dchar unarchiveEnumDchar (string key);
+	int unarchiveEnumInt (string key);
+	long unarchiveEnumLong (string key);
+	short unarchiveEnumShort (string key);
+	ubyte unarchiveEnumUbyte (string key);
+	uint unarchiveEnumUint (string key);
+	ulong unarchiveEnumUlong (string key);
+	ushort unarchiveEnumUshort (string key);
+	wchar unarchiveEnumWchar (string key);
+	
+	// Object unarchiveBaseClass (string key);
+	// void unarchiveNull (string key);
+	void unarchiveObject (string key, out Id id, out Object result, void delegate () dg);
+	Id unarchivePointer (string key, void delegate () dg);
+	Id unarchiveReference (string key);
+	Slice unarchiveSlice (string key);
+	void unarchiveStruct (string key, void delegate () dg);
+	void unarchiveTypedef (string key, void delegate () dg);
+	
+	string unarchiveString (string key, out Id id);
+	wstring unarchiveWstring (string key, out Id id);
+	dstring unarchiveDstring (string key, out Id id);
+	
+	string unarchiveString (Id id);
+	wstring unarchiveWstring (Id id);
+	dstring unarchiveDstring (Id id);
+    bool unarchiveBool (string key);
+    byte unarchiveByte (string key);
+    //cdouble unarchiveCdouble (string key); // currently not suppported by to!()
+    //cent unarchiveCent (string key); // currently not implemented but a reserved keyword
+    //cfloat unarchiveCfloat (string key); // currently not suppported by to!()
+    char unarchiveChar (string key); // currently not implemented but a reserved keyword
+    //creal unarchiveCreal (string key); // currently not suppported by to!()
+    dchar unarchiveDchar (string key);
+    double unarchiveDouble (string key);
+    float unarchiveFloat (string key);
+    //idouble unarchiveIdouble (string key); // currently not suppported by to!()
+    //ifloat unarchiveIfloat (string key); // currently not suppported by to!()*/
+    int unarchiveInt (string key);
+    //ireal unarchiveIreal (string key); // currently not suppported by to!()
+    long unarchiveLong (string key);
+    real unarchiveReal (string key);
+    short unarchiveShort (string key);
+    ubyte unarchiveUbyte (string key);
+    //ucent unarchiveCcent (string key); // currently not implemented but a reserved keyword
+    uint unarchiveUint (string key);
+    ulong unarchiveUlong (string key);
+    ushort unarchiveUshort (string key);
+    wchar unarchiveWchar (string key);
+	
+	void postProcessArray (Id id);
 }
 
 abstract class Archive (U) : IArchive
 {
-	version (Tango) alias U[] DataType;
-	else mixin ("alias immutable(U)[] DataType;");
+	version (Tango) alias U[] Data;
+	else mixin ("alias immutable(U)[] Data;");
 	
-	alias void delegate (ArchiveException exception, DataType[] data) ErrorCallback;
+	alias void delegate (ArchiveException exception, string[] data) ErrorCallback;
 	
 	protected ErrorCallback errorCallback;
 	
@@ -122,16 +187,16 @@
 		this.errorCallback = errorCallback;
 	}
 	
-	protected DataType toDataType (T) (T value)
+	protected Data toData (T) (T value)
 	{
 		try
-			return to!(DataType)(value);
+			return to!(Data)(value);
 		
 		catch (ConversionException e)
 			throw new ArchiveException(e);
 	}
 	
-	protected T fromDataType (T) (DataType value)
+	protected T fromData (T) (Data value)
 	{
 		try
 			return to!(T)(value);
@@ -140,6 +205,11 @@
 			throw new ArchiveException(e);
 	}
 	
+	protected Id toId (Data value)
+	{
+		return fromData!(Id)(value);
+	}
+	
 	protected bool isSliceOf (T, U = T) (T[] a, U[] b)
 	{
 		void* aPtr = a.ptr;