Changeset 1625 for trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/CompactNumberArray2StringDecomposer.cs
- Timestamp:
- 04/23/09 14:22:29 (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/CompactNumberArray2StringDecomposer.cs
r1623 r1625 61 61 62 62 public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) { 63 var tagIter = metaInfo.GetEnumerator(); 64 tagIter.MoveNext(); 65 var valueIter = ((string)tagIter.Current.Value) 66 .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) 67 .GetEnumerator(); 68 valueIter.MoveNext(); 69 int rank = int.Parse((string)valueIter.Current); 70 int[] lengths = new int[rank]; 71 int[] lowerBounds = new int[rank]; 72 for (int i = 0; i < rank; i++) { 63 try { 64 var tagIter = metaInfo.GetEnumerator(); 65 tagIter.MoveNext(); 66 var valueIter = ((string)tagIter.Current.Value) 67 .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) 68 .GetEnumerator(); 73 69 valueIter.MoveNext(); 74 lengths[i] = int.Parse((string)valueIter.Current); 75 } 76 for (int i = 0; i < rank; i++) { 77 valueIter.MoveNext(); 78 lowerBounds[i] = int.Parse((string)valueIter.Current); 79 } 80 Type elementType = type.GetElementType(); 81 Array a = Array.CreateInstance(elementType, lengths, lowerBounds); 82 int[] positions = (int[])lowerBounds.Clone(); 83 while (valueIter.MoveNext()) { 84 a.SetValue( 85 numberConverter.Parse((string)valueIter.Current, elementType), 86 positions); 87 positions[0] += 1; 88 for (int i = 0; i < rank - 1; i++) { 89 if (positions[i] >= lengths[i] + lowerBounds[i]) { 90 positions[i + 1] += 1; 91 positions[i] = lowerBounds[i]; 92 } else { 93 break; 70 int rank = int.Parse((string)valueIter.Current); 71 int[] lengths = new int[rank]; 72 int[] lowerBounds = new int[rank]; 73 for (int i = 0; i < rank; i++) { 74 valueIter.MoveNext(); 75 lengths[i] = int.Parse((string)valueIter.Current); 76 } 77 for (int i = 0; i < rank; i++) { 78 valueIter.MoveNext(); 79 lowerBounds[i] = int.Parse((string)valueIter.Current); 80 } 81 Type elementType = type.GetElementType(); 82 Array a = Array.CreateInstance(elementType, lengths, lowerBounds); 83 int[] positions = (int[])lowerBounds.Clone(); 84 while (valueIter.MoveNext()) { 85 a.SetValue( 86 numberConverter.Parse((string)valueIter.Current, elementType), 87 positions); 88 positions[0] += 1; 89 for (int i = 0; i < rank - 1; i++) { 90 if (positions[i] >= lengths[i] + lowerBounds[i]) { 91 positions[i + 1] += 1; 92 positions[i] = lowerBounds[i]; 93 } else { 94 break; 95 } 94 96 } 95 97 } 96 } 97 return a; 98 return a; 99 } catch (InvalidOperationException e) { 100 throw new PersistenceException("Insufficient data to deserialize compact array", e); 101 } catch (InvalidCastException e) { 102 throw new PersistenceException("Invalid element data during compact array deserialization", e); 103 } 98 104 } 99 105 100 106 public void Populate(object instance, IEnumerable<Tag> tags, Type type) { 107 // Nothing to do: Compact arrays are already populated during instance creation. 101 108 } 102 109
Note: See TracChangeset
for help on using the changeset viewer.