Terraria
v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
DoubleStack.cs
Go to the documentation of this file.
1
using
System
;
2
3
namespace
Terraria.DataStructures
;
4
5
public
class
DoubleStack
<T1>
6
{
7
private
T1[][]
_segmentList
;
8
9
private
readonly
int
_segmentSize
;
10
11
private
int
_segmentCount
;
12
13
private
readonly
int
_segmentShiftPosition
;
14
15
private
int
_start
;
16
17
private
int
_end
;
18
19
private
int
_size
;
20
21
private
int
_last
;
22
23
public
int
Count
=>
_size
;
24
25
public
DoubleStack
(
int
segmentSize = 1024,
int
initialSize = 0)
26
{
27
if
(segmentSize < 16)
28
{
29
segmentSize = 16;
30
}
31
_start
= segmentSize / 2;
32
_end
=
_start
;
33
_size
= 0;
34
_segmentShiftPosition
= segmentSize +
_start
;
35
initialSize +=
_start
;
36
int
num = initialSize / segmentSize + 1;
37
_segmentList
=
new
T1[num][];
38
for
(
int
i = 0; i < num; i++)
39
{
40
_segmentList
[i] =
new
T1[segmentSize];
41
}
42
_segmentSize
= segmentSize;
43
_segmentCount
= num;
44
_last
=
_segmentSize
*
_segmentCount
- 1;
45
}
46
47
public
void
PushFront
(T1 front)
48
{
49
if
(
_start
== 0)
50
{
51
T1[][]
array
=
new
T1[
_segmentCount
+ 1][];
52
for
(
int
i = 0; i <
_segmentCount
; i++)
53
{
54
array
[i + 1] =
_segmentList
[i];
55
}
56
array
[0] =
new
T1[
_segmentSize
];
57
_segmentList
=
array
;
58
_segmentCount
++;
59
_start
+=
_segmentSize
;
60
_end
+=
_segmentSize
;
61
_last
+=
_segmentSize
;
62
}
63
_start
--;
64
T1[]
obj
=
_segmentList
[
_start
/
_segmentSize
];
65
int
num =
_start
%
_segmentSize
;
66
obj
[num] = front;
67
_size
++;
68
}
69
70
public
T1
PopFront
()
71
{
72
if
(
_size
== 0)
73
{
74
throw
new
InvalidOperationException
(
"The DoubleStack is empty."
);
75
}
76
T1[]
obj
=
_segmentList
[
_start
/
_segmentSize
];
77
int
num =
_start
%
_segmentSize
;
78
T1 result =
obj
[num];
79
obj
[num] =
default
(T1);
80
_start
++;
81
_size
--;
82
if
(
_start
>=
_segmentShiftPosition
)
83
{
84
T1[]
array
=
_segmentList
[0];
85
for
(
int
i = 0; i <
_segmentCount
- 1; i++)
86
{
87
_segmentList
[i] =
_segmentList
[i + 1];
88
}
89
_segmentList
[
_segmentCount
- 1] =
array
;
90
_start
-=
_segmentSize
;
91
_end
-=
_segmentSize
;
92
}
93
if
(
_size
== 0)
94
{
95
_start
=
_segmentSize
/ 2;
96
_end
=
_start
;
97
}
98
return
result;
99
}
100
101
public
T1
PeekFront
()
102
{
103
if
(
_size
== 0)
104
{
105
throw
new
InvalidOperationException
(
"The DoubleStack is empty."
);
106
}
107
T1[]
obj
=
_segmentList
[
_start
/
_segmentSize
];
108
int
num =
_start
%
_segmentSize
;
109
return
obj
[num];
110
}
111
112
public
void
PushBack
(T1 back)
113
{
114
if
(
_end
==
_last
)
115
{
116
T1[][]
array
=
new
T1[
_segmentCount
+ 1][];
117
for
(
int
i = 0; i <
_segmentCount
; i++)
118
{
119
array
[i] =
_segmentList
[i];
120
}
121
array
[
_segmentCount
] =
new
T1[
_segmentSize
];
122
_segmentCount
++;
123
_segmentList
=
array
;
124
_last
+=
_segmentSize
;
125
}
126
T1[]
obj
=
_segmentList
[
_end
/
_segmentSize
];
127
int
num =
_end
%
_segmentSize
;
128
obj
[num] = back;
129
_end
++;
130
_size
++;
131
}
132
133
public
T1
PopBack
()
134
{
135
if
(
_size
== 0)
136
{
137
throw
new
InvalidOperationException
(
"The DoubleStack is empty."
);
138
}
139
T1[]
obj
=
_segmentList
[
_end
/
_segmentSize
];
140
int
num =
_end
%
_segmentSize
;
141
T1 result =
obj
[num];
142
obj
[num] =
default
(T1);
143
_end
--;
144
_size
--;
145
if
(
_size
== 0)
146
{
147
_start
=
_segmentSize
/ 2;
148
_end
=
_start
;
149
}
150
return
result;
151
}
152
153
public
T1
PeekBack
()
154
{
155
if
(
_size
== 0)
156
{
157
throw
new
InvalidOperationException
(
"The DoubleStack is empty."
);
158
}
159
T1[]
obj
=
_segmentList
[
_end
/
_segmentSize
];
160
int
num =
_end
%
_segmentSize
;
161
return
obj
[num];
162
}
163
164
public
void
Clear
(
bool
quickClear =
false
)
165
{
166
if
(!quickClear)
167
{
168
for
(
int
i = 0; i <
_segmentCount
; i++)
169
{
170
Array
.
Clear
(
_segmentList
[i], 0,
_segmentSize
);
171
}
172
}
173
_start
=
_segmentSize
/ 2;
174
_end
=
_start
;
175
_size
= 0;
176
}
177
}
System.Array.Clear
static unsafe void Clear(Array array)
Definition
Array.cs:755
System.Array
Definition
Array.cs:16
System.InvalidOperationException
Definition
InvalidOperationException.cs:9
Terraria.DataStructures.DoubleStack.PopFront
T1 PopFront()
Definition
DoubleStack.cs:70
Terraria.DataStructures.DoubleStack.PeekBack
T1 PeekBack()
Definition
DoubleStack.cs:153
Terraria.DataStructures.DoubleStack._start
int _start
Definition
DoubleStack.cs:15
Terraria.DataStructures.DoubleStack.PeekFront
T1 PeekFront()
Definition
DoubleStack.cs:101
Terraria.DataStructures.DoubleStack._segmentList
T1[][] _segmentList
Definition
DoubleStack.cs:7
Terraria.DataStructures.DoubleStack.PushBack
void PushBack(T1 back)
Definition
DoubleStack.cs:112
Terraria.DataStructures.DoubleStack._segmentSize
readonly int _segmentSize
Definition
DoubleStack.cs:9
Terraria.DataStructures.DoubleStack._end
int _end
Definition
DoubleStack.cs:17
Terraria.DataStructures.DoubleStack.Count
int Count
Definition
DoubleStack.cs:23
Terraria.DataStructures.DoubleStack.Clear
void Clear(bool quickClear=false)
Definition
DoubleStack.cs:164
Terraria.DataStructures.DoubleStack.DoubleStack
DoubleStack(int segmentSize=1024, int initialSize=0)
Definition
DoubleStack.cs:25
Terraria.DataStructures.DoubleStack._last
int _last
Definition
DoubleStack.cs:21
Terraria.DataStructures.DoubleStack.PopBack
T1 PopBack()
Definition
DoubleStack.cs:133
Terraria.DataStructures.DoubleStack.PushFront
void PushFront(T1 front)
Definition
DoubleStack.cs:47
Terraria.DataStructures.DoubleStack._segmentShiftPosition
readonly int _segmentShiftPosition
Definition
DoubleStack.cs:13
Terraria.DataStructures.DoubleStack._segmentCount
int _segmentCount
Definition
DoubleStack.cs:11
Terraria.DataStructures.DoubleStack._size
int _size
Definition
DoubleStack.cs:19
Terraria.DataStructures.DoubleStack
Definition
DoubleStack.cs:6
System.ExceptionArgument.obj
@ obj
System.ExceptionArgument.array
@ array
System
Definition
BlockingCollection.cs:8
Terraria.DataStructures
Definition
AEntitySource_OnHit.cs:1
source
Terraria.DataStructures
DoubleStack.cs
Generated by
1.10.0