1 | using System;
|
---|
2 | using System.Collections.Generic;
|
---|
3 | using HeuristicLab.Persistence.Core.Tokens;
|
---|
4 |
|
---|
5 | namespace 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 | }
|
---|