Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Persistence/3.3/Default/Decomposers/CompactNumberArray2StringDecomposer.cs @ 1567

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

One file per class; rename ViewOnlyFormat -> DebugStringFormat (#548)

File size: 3.3 KB
Line 
1using System;
2using HeuristicLab.Persistence.Interfaces;
3using HeuristicLab.Persistence.Core;
4using System.Collections.Generic;
5using System.Reflection;
6using System.Globalization;
7using System.Text;
8
9namespace HeuristicLab.Persistence.Default.Decomposers {
10
11  [EmptyStorableClass]
12  public class CompactNumberArray2StringDecomposer : IDecomposer {
13
14    public int Priority {
15      get { return 200; }
16    }
17
18    private static readonly Number2StringConverter numberConverter =
19      new Number2StringConverter();
20
21    public bool CanDecompose(Type type) {
22      return
23        (type.IsArray || type == typeof(Array)) &&
24        numberConverter.CanDecompose(type.GetElementType());
25    }
26
27    public IEnumerable<Tag> CreateMetaInfo(object obj) {
28      Array a = (Array)obj;
29      int[] lengths = new int[a.Rank];
30      int[] lowerBounds = new int[a.Rank];
31      StringBuilder sb = new StringBuilder();
32      sb.Append(a.Rank).Append(';');
33      for (int i = 0; i < a.Rank; i++) {
34        sb.Append(a.GetLength(i)).Append(';');
35        lengths[i] = a.GetLength(i);
36      }
37      for (int i = 0; i < a.Rank; i++) {
38        sb.Append(a.GetLowerBound(i)).Append(';');
39        lowerBounds[i] = a.GetLowerBound(i);
40      }
41      int[] positions = (int[])lowerBounds.Clone();
42      while (positions[a.Rank - 1] < lengths[a.Rank - 1] + lowerBounds[a.Rank - 1]) {
43        sb.Append(numberConverter.Format(a.GetValue(positions))).Append(';');
44        positions[0] += 1;
45        for (int i = 0; i < a.Rank - 1; i++) {
46          if (positions[i] >= lengths[i] + lowerBounds[i]) {
47            positions[i] = lowerBounds[i];
48            positions[i + 1] += 1;
49          } else {
50            break;
51          }
52        }
53      }
54      yield return new Tag("compact array", sb.ToString());
55    }
56
57    public IEnumerable<Tag> Decompose(object obj) {
58      return new Tag[] { };
59    }
60
61    public object CreateInstance(Type type, IEnumerable<Tag> metaInfo) {
62      var tagIter = metaInfo.GetEnumerator();
63      tagIter.MoveNext();
64      var valueIter = ((string)tagIter.Current.Value)
65        .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
66        .GetEnumerator();
67      valueIter.MoveNext();
68      int rank = int.Parse((string)valueIter.Current);
69      int[] lengths = new int[rank];
70      int[] lowerBounds = new int[rank];
71      for (int i = 0; i < rank; i++) {
72        valueIter.MoveNext();
73        lengths[i] = int.Parse((string)valueIter.Current);
74      }
75      for (int i = 0; i < rank; i++) {
76        valueIter.MoveNext();
77        lowerBounds[i] = int.Parse((string)valueIter.Current);
78      }
79      Type elementType = type.GetElementType();
80      Array a = Array.CreateInstance(elementType, lengths, lowerBounds);
81      int[] positions = (int[])lowerBounds.Clone();
82      while (valueIter.MoveNext()) {
83        a.SetValue(
84          numberConverter.Parse((string)valueIter.Current, elementType),
85          positions);
86        positions[0] += 1;
87        for (int i = 0; i < rank - 1; i++) {
88          if (positions[i] >= lengths[i] + lowerBounds[i]) {
89            positions[i + 1] += 1;
90            positions[i] = lowerBounds[i];
91          } else {
92            break;
93          }
94        }
95      }
96      return a;
97    }
98
99    public void Populate(object instance, IEnumerable<Tag> tags, Type type) {
100    }
101
102  }
103
104}
Note: See TracBrowser for help on using the repository browser.