Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/3.3/Default/Xml/Compact/NumberArray2XmlFormatterBase.cs @ 1612

Last change on this file since 1612 was 1612, checked in by epitzer, 15 years ago

namespace refactoring (#548)

File size: 2.7 KB
Line 
1using System.Collections;
2using System.Text;
3using HeuristicLab.Persistence.Interfaces;
4using System;
5
6namespace HeuristicLab.Persistence.Default.Xml.Compact {
7
8  public abstract class NumberArray2XmlFormatterBase<T> : FormatterBase<T, XmlString> where T : class {
9
10    protected virtual string Separator { get { return ";"; } }
11    protected abstract string FormatValue(object o);
12    protected abstract object ParseValue(string o);
13
14    public override XmlString Format(T t) {     
15      Array a = (Array)(object)t;
16      int[] lengths = new int[a.Rank];
17      int[] lowerBounds = new int[a.Rank];
18      StringBuilder sb = new StringBuilder();
19      sb.Append(a.Rank);
20      for (int i = 0; i < a.Rank; i++) {
21        sb.Append(Separator);
22        sb.Append(a.GetLength(i));
23        lengths[i] = a.GetLength(i);
24      }
25      for (int i = 0; i < a.Rank; i++) {
26        sb.Append(Separator);
27        sb.Append(a.GetLowerBound(i));
28        lowerBounds[i] = a.GetLowerBound(i);
29      }
30      int[] positions = (int[])lowerBounds.Clone();
31      while (positions[a.Rank - 1] < lengths[a.Rank - 1] + lowerBounds[a.Rank - 1]) {
32        sb.Append(Separator);
33        sb.Append(FormatValue(a.GetValue(positions)));
34        positions[0] += 1;
35        for (int i = 0; i < a.Rank - 1; i++) {
36          if (positions[i] >= lengths[i] + lowerBounds[i]) {
37            positions[i] = lowerBounds[i];
38            positions[i + 1] += 1;
39          } else {
40            break;
41          }
42        }
43      }
44      return new XmlString(sb.ToString());
45    }
46
47    public override T Parse(XmlString x) {
48      IEnumerator values =
49        x.Data.Split(new[] { Separator },
50        StringSplitOptions.RemoveEmptyEntries).GetEnumerator();
51      values.MoveNext();
52      int rank = int.Parse((string)values.Current);
53      int[] lengths = new int[rank];
54      for (int i = 0; i < rank; i++) {
55        values.MoveNext();
56        lengths[i] = int.Parse((string)values.Current);
57      }
58      int[] lowerBounds = new int[rank];
59      for (int i = 0; i < rank; i++) {
60        values.MoveNext();
61        lowerBounds[i] = int.Parse((string)values.Current);
62      }
63      Array a = Array.CreateInstance(this.SourceType.GetElementType(), lengths, lowerBounds);
64      int[] positions = new int[rank];
65      while (values.MoveNext()) {
66        a.SetValue(ParseValue((string)values.Current), positions);
67        positions[0] += 1;
68        for (int i = 0; i < rank - 1; i++) {
69          if (positions[i] >= lengths[i]) {
70            positions[i] = 0;
71            positions[i + 1] += 1;
72          } else {
73            break;
74          }
75        }
76      }     
77      return (T)(object)a;
78    }
79  }
80
81}
Note: See TracBrowser for help on using the repository browser.