forked from nhibernate/nhibernate-core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIdentitySet.cs
155 lines (124 loc) · 2.97 KB
/
IdentitySet.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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using System;
using System.Collections;
using System.Collections.Generic;
namespace NHibernate.Util
{
/// <summary>
/// Set implementation that use reference equals instead of Equals() as its comparison mechanism.
/// </summary>
// Since 5.3
[Obsolete("This class has no more usages and will be removed in a future version")]
public class IdentitySet : ISet<object>
{
private IDictionary map;
private static readonly object DumpValue = new object();
public IdentitySet()
{
map = IdentityMap.Instantiate(10);
}
public IdentitySet(IEnumerable<object> members)
{
map = IdentityMap.Instantiate(10);
foreach (var member in members)
Add(member);
}
#region Implementation of ICollection<object>
void ICollection<object>.Add(object item)
{
Add(item);
}
#endregion
public bool Add(object o)
{
object tempObject = map[o];
map[o] = DumpValue;
return tempObject == null;
}
public void Clear()
{
map.Clear();
}
public bool Contains(object o)
{
return map[o] == DumpValue;
}
public bool Remove(object o)
{
object tempObject = map[o];
map.Remove(o);
return tempObject == DumpValue;
}
public void CopyTo(object[] array, int index)
{
map.CopyTo(array, index);
}
public IEnumerator<object> GetEnumerator()
{
return new EnumeratorAdapter<object>(map.GetEnumerator());
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public int Count
{
get { return map.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
#region Implementation of ISet<object>
public void UnionWith(IEnumerable<object> other)
{
throw new NotImplementedException();
//foreach (var o in other)
// Add(o);
}
public void IntersectWith(IEnumerable<object> other)
{
throw new NotImplementedException();
// Potential crude implementation.
//var otherSet = new HashSet<object>(other, new IdentityEqualityComparer());
//var ours = map.Keys.Cast<object>().ToList();
//foreach (var key in ours)
// if (!otherSet.Contains(key))
// map.Remove(key);
//foreach (var obj in otherSet)
// Add(obj);
}
public void ExceptWith(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public void SymmetricExceptWith(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool IsSubsetOf(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool IsSupersetOf(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool IsProperSupersetOf(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool IsProperSubsetOf(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool Overlaps(IEnumerable<object> other)
{
throw new NotImplementedException();
}
public bool SetEquals(IEnumerable<object> other)
{
throw new NotImplementedException();
}
#endregion
}
}