Free cookie consent management tool by TermsFeed Policy Generator

source: branches/PersistenceSpeedUp/HeuristicLab.Persistence/3.3/Core/TypeCache.cs @ 13831

Last change on this file since 13831 was 6737, checked in by epitzer, 13 years ago

#1530 Split type and serializer tokens and include special handling for CachedTypeSerializer (this should also fix #1527)

File size: 2.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using HeuristicLab.Persistence.Core.Tokens;
4
5namespace HeuristicLab.Persistence.Core {
6
7  public sealed class TypeCache {
8
9    private Dictionary<Type, int> type2id;
10    private Dictionary<int, Type> id2serializer;
11    private Type unpublishedType;
12    private int? unpublishedSerializer;
13
14    public bool HasUnpublishedType { get { return unpublishedType != null; } }
15    public bool HasUnpublishedSerializer { get { return unpublishedSerializer != null; } }
16
17    public TypeToken PublishUnpublishedType() {
18      TypeToken token = new TypeToken(type2id[unpublishedType], unpublishedType.AssemblyQualifiedName);
19      unpublishedType = null;
20      return token;
21    }
22
23    public SerializerToken PublishUnpublishedSerializer() {
24      SerializerToken token = new SerializerToken((int)unpublishedSerializer, id2serializer[(int)unpublishedSerializer].AssemblyQualifiedName);
25      unpublishedSerializer = null;
26      return token;
27    }
28
29    public TypeCache() {
30      type2id = new Dictionary<Type, int>();
31      id2serializer = new Dictionary<int, Type>();
32    }
33
34    public IEnumerable<Type> Types { get { return type2id.Keys; } }
35
36    public int GetOrCreateId(Type type) {
37      int id;
38      if (!type2id.TryGetValue(type, out id)) {
39        id = type2id.Count;
40        type2id.Add(type, id);
41        unpublishedType = type;
42      }
43      return id;
44    }
45
46    public void SetSerializer(int typeId, Type serializerType) {
47      Type serializer;
48      if (!id2serializer.TryGetValue(typeId, out serializer)) {
49        id2serializer.Add(typeId, serializerType);
50        unpublishedSerializer = typeId;
51      }
52    }
53
54    public Type GetSerializer(int id) {
55      Type serializer = null;
56      id2serializer.TryGetValue(id, out serializer);
57      return serializer;
58    }
59
60    public ReverseTypeCache Reverse() {
61      var reverse = new ReverseTypeCache();
62      foreach (var t in type2id)
63        reverse.AddType(t.Value, t.Key);
64      foreach (var s in id2serializer)
65        reverse.AddSerializer(s.Key, s.Value);
66      return reverse;
67    }
68  }
69}
Note: See TracBrowser for help on using the repository browser.