diff orange/serialization/Serializer.d @ 29:c422ff6477dd experimental

Better handling of serializing pointers.
author Jacob Carlborg <doob@me.com>
date Sun, 21 Nov 2010 16:53:46 +0100
parents bffcbc8c392b
children 9d1a8023bb89
line wrap: on
line diff
--- a/orange/serialization/Serializer.d	Fri Nov 19 11:55:04 2010 +0100
+++ b/orange/serialization/Serializer.d	Sun Nov 21 16:53:46 2010 +0100
@@ -65,6 +65,9 @@
 		Array[Id] serializedArrays;
 		void[][Id] deserializedSlices;
 		
+		Id[void*] serializedPointers;
+		Id[void*] serializedValues;
+		
 		bool hasBegunSerializing;
 		bool hasBegunDeserializing;
 		
@@ -115,6 +118,9 @@
 		serializedArrays = null;
 		deserializedSlices = null;
 		
+		serializedValues = null;
+		serializedPointers = null;
+		
 		hasBegunSerializing = false;
 		hasBegunDeserializing = false;
 		
@@ -298,14 +304,7 @@
 		if (!value)
 			return archive.archiveNull(T.stringof, key);
 		
-		auto reference = getSerializedReference(value);
-		
-		if (reference != Id.max)
-			return archive.archiveReference(key, reference);
-		
 		Id id = nextId;
-
-		addSerializedReference(value, id);
 		
 		archive.archivePointer(key, id, {
 			if (key in serializers)
@@ -326,6 +325,8 @@
 					serializeInternal(*value, nextKey);
 			}
 		});
+		
+		addSerializedPointer(value, id);
 	}
 	
 	private void serializeEnum (T) (T value, string key)
@@ -665,6 +666,8 @@
 			{
 				alias typeof(T.tupleof[i]) Type;				
 				Type v = value.tupleof[i];
+				
+				addSerializedValue(value.tupleof[i], nextId);
 				serializeInternal(v, toData(field));
 			}				
 		}
@@ -739,6 +742,16 @@
 		deserializedSlices[id] = value;
 	}
 	
+	private void addSerializedValue (T) (ref T value, Id id)
+	{
+		serializedValues[&value] = id;
+	}
+	
+	private void addSerializedPointer (T) (T value, Id id)
+	{
+		serializedPointers[value] = id;
+	}
+	
 	private Id getSerializedReference (T) (T value)
 	{
 		if (auto tmp = cast(void*) value in serializedReferences)
@@ -769,6 +782,14 @@
 			return cast(T*) array;
 	}
 	
+	private Id getSerializedPointer (T) (T value)
+	{
+		if (auto tmp = cast(void*) value in serializedPointers)
+			return *tmp;
+		
+		return Id.max;
+	}
+	
 	private T[] toSlice (T) (T[] array, Slice slice)
 	{
 		return array[slice.offset .. slice.offset + slice.length];
@@ -819,6 +840,12 @@
 		serializedArrays[id] = array;
 	}
 	
+	private void postProcess ()
+	{
+		postProcessArrays();
+		postProcessPointers();
+	}
+	
 	private void postProcessArrays ()
 	{
 		bool foundSlice = true;
@@ -844,9 +871,16 @@
 		}
 	}
 	
-	private void postProcess ()
+	private void postProcessPointers ()
 	{
-		postProcessArrays();
+		foreach (key, pointerId ; serializedPointers)
+		{
+			if (auto pointeeId = key in serializedValues)
+				archive.archivePointer(pointerId, *pointeeId);
+			
+			else
+				archive.postProcessPointer(pointerId);
+		}
 	}
 	
 	private template arrayToString (T)