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