Terraria
v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
WeakHashtable.cs
Go to the documentation of this file.
1
using
System.Collections
;
2
using
System.Collections.Generic
;
3
4
namespace
System.ComponentModel
;
5
6
internal
sealed
class
WeakHashtable
:
Hashtable
7
{
8
private
sealed
class
WeakKeyComparer
:
IEqualityComparer
9
{
10
bool
IEqualityComparer
.
Equals
(
object
x,
object
y)
11
{
12
if
(x ==
null
)
13
{
14
return
y ==
null
;
15
}
16
if
(y !=
null
&& x.GetHashCode() == y.GetHashCode())
17
{
18
if
(x
is
WeakReference
weakReference
)
19
{
20
if
(!
weakReference
.IsAlive)
21
{
22
return
false
;
23
}
24
x =
weakReference
.Target;
25
}
26
if
(y
is
WeakReference
weakReference2
)
27
{
28
if
(!
weakReference2
.IsAlive)
29
{
30
return
false
;
31
}
32
y =
weakReference2
.Target;
33
}
34
return
x == y;
35
}
36
return
false
;
37
}
38
39
int
IEqualityComparer
.
GetHashCode
(
object
obj
)
40
{
41
return
obj
.GetHashCode();
42
}
43
}
44
45
private
sealed
class
EqualityWeakReference
:
WeakReference
46
{
47
private
readonly
int
_hashCode
;
48
49
internal
EqualityWeakReference
(
object
o
)
50
:
base
(
o
)
51
{
52
_hashCode
=
o
.GetHashCode();
53
}
54
55
public
override
bool
Equals
(
object
o
)
56
{
57
if
(
o
?.
GetHashCode
() !=
_hashCode
)
58
{
59
return
false
;
60
}
61
if
(
o
==
this
|| (
IsAlive
&&
o
==
Target
))
62
{
63
return
true
;
64
}
65
return
false
;
66
}
67
68
public
override
int
GetHashCode
()
69
{
70
return
_hashCode
;
71
}
72
}
73
74
private
static
readonly
IEqualityComparer
s_comparer
=
new
WeakKeyComparer
();
75
76
private
long
_lastGlobalMem
;
77
78
private
int
_lastHashCount
;
79
80
internal
WeakHashtable
()
81
:
base
(
s_comparer
)
82
{
83
}
84
85
public
void
SetWeak
(
object
key
,
object
value
)
86
{
87
ScavengeKeys
();
88
this
[
new
EqualityWeakReference
(
key
)] =
value
;
89
}
90
91
private
void
ScavengeKeys
()
92
{
93
int
count
=
Count
;
94
if
(
count
== 0)
95
{
96
return
;
97
}
98
if
(
_lastHashCount
== 0)
99
{
100
_lastHashCount
=
count
;
101
return
;
102
}
103
long
totalMemory
=
GC
.
GetTotalMemory
(
forceFullCollection
:
false
);
104
if
(
_lastGlobalMem
== 0
L
)
105
{
106
_lastGlobalMem
=
totalMemory
;
107
return
;
108
}
109
float
num = (float)(
totalMemory
-
_lastGlobalMem
) / (float)
_lastGlobalMem
;
110
float
num2
= (float)(
count
-
_lastHashCount
) / (float)
_lastHashCount
;
111
if
(
num < 0f && num2 >
= 0f)
112
{
113
List<object>
list
=
null
;
114
foreach
(
object
key
in
Keys
)
115
{
116
if
(
key
is
WeakReference
{ IsAlive:
false
}
weakReference
)
117
{
118
if
(
list
==
null
)
119
{
120
list
=
new
List<object>
();
121
}
122
list
.Add(
weakReference
);
123
}
124
}
125
if
(
list
!=
null
)
126
{
127
foreach
(
object
item
in
list
)
128
{
129
Remove
(
item
);
130
}
131
}
132
}
133
_lastGlobalMem
=
totalMemory
;
134
_lastHashCount
=
count
;
135
}
136
}
System.Collections.Generic.Dictionary
Definition
Dictionary.cs:14
System.Collections.Hashtable.Count
virtual int Count
Definition
Hashtable.cs:538
System.Collections.Hashtable.Keys
virtual ICollection Keys
Definition
Hashtable.cs:532
System.Collections.Hashtable
Definition
Hashtable.cs:13
System.ComponentModel.WeakHashtable.EqualityWeakReference.EqualityWeakReference
EqualityWeakReference(object o)
Definition
WeakHashtable.cs:49
System.ComponentModel.WeakHashtable.EqualityWeakReference._hashCode
readonly int _hashCode
Definition
WeakHashtable.cs:47
System.ComponentModel.WeakHashtable.EqualityWeakReference.Equals
override bool Equals(object o)
Definition
WeakHashtable.cs:55
System.ComponentModel.WeakHashtable.EqualityWeakReference.GetHashCode
override int GetHashCode()
Definition
WeakHashtable.cs:68
System.ComponentModel.WeakHashtable.EqualityWeakReference
Definition
WeakHashtable.cs:46
System.ComponentModel.WeakHashtable.WeakKeyComparer
Definition
WeakHashtable.cs:9
System.ComponentModel.WeakHashtable._lastHashCount
int _lastHashCount
Definition
WeakHashtable.cs:78
System.ComponentModel.WeakHashtable.ScavengeKeys
void ScavengeKeys()
Definition
WeakHashtable.cs:91
System.ComponentModel.WeakHashtable.SetWeak
void SetWeak(object key, object value)
Definition
WeakHashtable.cs:85
System.ComponentModel.WeakHashtable.s_comparer
static readonly IEqualityComparer s_comparer
Definition
WeakHashtable.cs:74
System.ComponentModel.WeakHashtable.WeakHashtable
WeakHashtable()
Definition
WeakHashtable.cs:80
System.ComponentModel.WeakHashtable._lastGlobalMem
long _lastGlobalMem
Definition
WeakHashtable.cs:76
System.ComponentModel.WeakHashtable
Definition
WeakHashtable.cs:7
System.GC.GetTotalMemory
static long GetTotalMemory()
System.GC
Definition
GC.cs:8
System.WeakReference.Target
virtual ? object Target
Definition
WeakReference.cs:22
System.WeakReference.IsAlive
virtual bool IsAlive
Definition
WeakReference.cs:14
System.WeakReference
Definition
WeakReference.cs:77
System.Collections.Generic.IEqualityComparer.GetHashCode
int GetHashCode([DisallowNull] T obj)
System.Collections.Generic.IEqualityComparer.Equals
bool Equals(T? x, T? y)
System.Collections.Generic.IEqualityComparer
Definition
IEqualityComparer.cs:6
System.Collections.Generic
Definition
IHashKeyCollection.cs:1
System.Collections
Definition
BlockingCollection.cs:8
System.ComponentModel.CollectionChangeAction.Remove
@ Remove
System.ComponentModel
Definition
ColumnAttribute.cs:3
System.ExceptionArgument.list
@ list
System.ExceptionArgument.value
@ value
System.ExceptionArgument.key
@ key
System.ExceptionArgument.item
@ item
System.ExceptionArgument.obj
@ obj
System.ExceptionArgument.count
@ count
System.ConsoleKey.L
@ L
source
System.ComponentModel.TypeConverter
System.ComponentModel
WeakHashtable.cs
Generated by
1.10.0