comparison orange/serialization/Serializer.d @ 31:c68d29967c9f experimental

Fixed some bugs in the handling of pointers.
author Jacob Carlborg <doob@me.com>
date Sun, 21 Nov 2010 17:37:20 +0100
parents 9d1a8023bb89
children 9df3b7a46a51
comparison
equal deleted inserted replaced
30:9d1a8023bb89 31:c68d29967c9f
63 void*[Id] deserializedReferences; 63 void*[Id] deserializedReferences;
64 64
65 Array[Id] serializedArrays; 65 Array[Id] serializedArrays;
66 void[][Id] deserializedSlices; 66 void[][Id] deserializedSlices;
67 67
68 Id[void*] serializedPointers; 68 void*[Id] serializedPointers;
69 Id[void*] serializedValues; 69 Id[void*] serializedValues;
70 70
71 bool hasBegunSerializing; 71 bool hasBegunSerializing;
72 bool hasBegunDeserializing; 72 bool hasBegunDeserializing;
73 73
745 serializedValues[&value] = id; 745 serializedValues[&value] = id;
746 } 746 }
747 747
748 private void addSerializedPointer (T) (T value, Id id) 748 private void addSerializedPointer (T) (T value, Id id)
749 { 749 {
750 serializedPointers[value] = id; 750 serializedPointers[id] = value;
751 } 751 }
752 752
753 private Id getSerializedReference (T) (T value) 753 private Id getSerializedReference (T) (T value)
754 { 754 {
755 if (auto tmp = cast(void*) value in serializedReferences) 755 if (auto tmp = cast(void*) value in serializedReferences)
776 776
777 private T* getDeserializedArray (T) (Id id) 777 private T* getDeserializedArray (T) (Id id)
778 { 778 {
779 if (auto array = id in deserializedSlices) 779 if (auto array = id in deserializedSlices)
780 return cast(T*) array; 780 return cast(T*) array;
781 }
782
783 private Id getSerializedPointer (T) (T value)
784 {
785 if (auto tmp = cast(void*) value in serializedPointers)
786 return *tmp;
787
788 return Id.max;
789 } 781 }
790 782
791 private T[] toSlice (T) (T[] array, Slice slice) 783 private T[] toSlice (T) (T[] array, Slice slice)
792 { 784 {
793 return array[slice.offset .. slice.offset + slice.length]; 785 return array[slice.offset .. slice.offset + slice.length];
869 } 861 }
870 } 862 }
871 863
872 private void postProcessPointers () 864 private void postProcessPointers ()
873 { 865 {
874 foreach (key, pointerId ; serializedPointers) 866 foreach (pointerId, value ; serializedPointers)
875 { 867 {
876 if (auto pointeeId = key in serializedValues) 868 if (auto pointeeId = value in serializedValues)
877 archive.archivePointer(pointerId, *pointeeId); 869 archive.archivePointer(pointerId, *pointeeId);
878 870
879 else 871 else
880 archive.postProcessPointer(pointerId); 872 archive.postProcessPointer(pointerId);
881 } 873 }