-
Notifications
You must be signed in to change notification settings - Fork 2k
/
GuidId.cs
118 lines (98 loc) · 3.3 KB
/
GuidId.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Runtime.Serialization;
using Orleans.Concurrency;
using Orleans.Serialization;
namespace Orleans.Runtime
{
/// <summary>
/// Wrapper object around Guid.
/// Can be used in places where Guid is optional and in those cases it can be set to null and will not use the storage of an empty Guid struct.
/// </summary>
[Serializable]
[Immutable]
public sealed class GuidId : IEquatable<GuidId>, IComparable<GuidId>, ISerializable
{
private static readonly Lazy<Interner<Guid, GuidId>> guidIdInternCache = new Lazy<Interner<Guid, GuidId>>(
() => new Interner<Guid, GuidId>(InternerConstants.SIZE_LARGE, InternerConstants.DefaultCacheCleanupFreq));
public readonly Guid Guid;
// TODO: Need to integrate with Orleans serializer to really use Interner.
private GuidId(Guid guid)
{
this.Guid = guid;
}
public static GuidId GetNewGuidId()
{
return FindOrCreateGuidId(Guid.NewGuid());
}
public static GuidId GetGuidId(Guid guid)
{
return FindOrCreateGuidId(guid);
}
private static GuidId FindOrCreateGuidId(Guid guid)
{
return guidIdInternCache.Value.FindOrCreate(guid, g => new GuidId(g));
}
public int CompareTo(GuidId other)
{
return this.Guid.CompareTo(other.Guid);
}
public bool Equals(GuidId other)
{
return other != null && this.Guid.Equals(other.Guid);
}
public override bool Equals(object obj)
{
return this.Equals(obj as GuidId);
}
public override int GetHashCode()
{
return this.Guid.GetHashCode();
}
public override string ToString()
{
return this.Guid.ToString();
}
internal string ToDetailedString()
{
return this.Guid.ToString();
}
public string ToParsableString()
{
return Guid.ToString();
}
public static GuidId FromParsableString(string guidId)
{
Guid id = System.Guid.Parse(guidId);
return GetGuidId(id);
}
public void SerializeToStream(IBinaryTokenStreamWriter stream)
{
stream.Write(this.Guid);
}
internal static GuidId DeserializeFromStream(IBinaryTokenStreamReader stream)
{
Guid guid = stream.ReadGuid();
return GuidId.GetGuidId(guid);
}
public static bool operator ==(GuidId a, GuidId b)
{
if (ReferenceEquals(a, b)) return true;
if (ReferenceEquals(a, null)) return false;
if (ReferenceEquals(b, null)) return false;
return a.Guid.Equals(b.Guid);
}
public static bool operator !=(GuidId a, GuidId b)
{
return !(a == b);
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("Guid", Guid, typeof(Guid));
}
// The special constructor is used to deserialize values.
private GuidId(SerializationInfo info, StreamingContext context)
{
Guid = (Guid) info.GetValue("Guid", typeof(Guid));
}
}
}