Changeset 3945


Ignore:
Timestamp:
06/24/10 11:17:04 (9 years ago)
Author:
epitzer
Message:

Remove casts in number array serializer and add handling of lower bounds (#1138)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/Compact/NumberArray2XmlSerializerBase.cs

    r3937 r3945  
    2727using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
    2828using HeuristicLab.Persistence.Auxiliary;
     29using HeuristicLab.Tracing;
     30using System.Collections.Generic;
    2931
    3032namespace HeuristicLab.Persistence.Default.Xml.Compact {
     
    4143      int[] lengths = new int[a.Rank];
    4244      int[] lowerBounds = new int[a.Rank];
    43       StringBuilder sb = new StringBuilder(a.Rank * 3);
     45      StringBuilder sb = new StringBuilder(3 + a.Rank * 3);
    4446      sb.Append(a.Rank);
    45       int capacity = 1;
     47      int nElements = 1;
    4648      for (int i = 0; i < a.Rank; i++) {
    4749        sb.Append(Separator);
    4850        sb.Append(a.GetLength(i));
    4951        lengths[i] = a.GetLength(i);
    50         capacity *= lengths[i];
    51       }
    52       sb.EnsureCapacity(capacity * 3);
     52        nElements *= lengths[i];
     53      }     
     54      sb.EnsureCapacity(sb.Length + nElements * 3);
    5355      for (int i = 0; i < a.Rank; i++) {
    5456        sb.Append(Separator);
     
    6971          }
    7072        }
    71       }
     73      }     
    7274      return new XmlString(sb.ToString());
    7375    }
     
    7577    public override T Parse(XmlString x) {
    7678      try {
    77         IEnumerator values = x.Data.GetSplitEnumerator(Separator);
     79        IEnumerator<string> values = x.Data.GetSplitEnumerator(Separator);
    7880        values.MoveNext();
    79         int rank = int.Parse((string)values.Current);
     81        int rank = int.Parse(values.Current);
    8082        int[] lengths = new int[rank];
    8183        for (int i = 0; i < rank; i++) {
    8284          values.MoveNext();
    83           lengths[i] = int.Parse((string)values.Current);
     85          lengths[i] = int.Parse(values.Current);
    8486        }
    8587        int[] lowerBounds = new int[rank];
    8688        for (int i = 0; i < rank; i++) {
    8789          values.MoveNext();
    88           lowerBounds[i] = int.Parse((string)values.Current);
     90          lowerBounds[i] = int.Parse(values.Current);
    8991        }
    9092        Array a = Array.CreateInstance(this.SourceType.GetElementType(), lengths, lowerBounds);
    9193        int[] positions = (int[])lowerBounds.Clone();
    92         while (values.MoveNext()) {
    93           a.SetValue(ParseValue((string)values.Current), positions);
     94        while (values.MoveNext()) {         
     95          a.SetValue(ParseValue(values.Current), positions);
    9496          positions[0] += 1;
    9597          for (int i = 0; i < rank - 1; i++) {
    96             if (positions[i] >= lengths[i]) {
    97               positions[i] = 0;
     98            if (positions[i] >= lowerBounds[i] + lengths[i]) {
     99              positions[i] = lowerBounds[i];
    98100              positions[i + 1] += 1;
    99101            } else {
Note: See TracChangeset for help on using the changeset viewer.