Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ PickPivotAndPartition() [1/2]

static int System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.PickPivotAndPartition ( Span< T > keys)
inlinestaticprivate

Definition at line 145 of file GenericArraySortHelper.cs.

146 {
147 ref T reference = ref MemoryMarshal.GetReference(keys);
148 ref T j = ref Unsafe.Add(ref reference, keys.Length - 1);
149 ref T reference2 = ref Unsafe.Add(ref reference, keys.Length - 1 >> 1);
150 SwapIfGreater(ref reference, ref reference2);
151 SwapIfGreater(ref reference, ref j);
152 SwapIfGreater(ref reference2, ref j);
153 ref T reference3 = ref Unsafe.Add(ref reference, keys.Length - 2);
154 T left = reference2;
155 Swap(ref reference2, ref reference3);
156 ref T reference4 = ref reference;
157 ref T reference5 = ref reference3;
158 while (Unsafe.IsAddressLessThan(ref reference4, ref reference5))
159 {
160 if (left == null)
161 {
162 while (Unsafe.IsAddressLessThan(ref reference4, ref reference3))
163 {
164 ref T reference6 = ref Unsafe.Add(ref reference4, 1);
165 reference4 = ref reference6;
166 if (reference6 != null)
167 {
168 break;
169 }
170 }
171 while (Unsafe.IsAddressGreaterThan(ref reference5, ref reference))
172 {
173 ref T reference7 = ref Unsafe.Add(ref reference5, -1);
174 reference5 = ref reference7;
175 if (reference7 == null)
176 {
177 break;
178 }
179 }
180 }
181 else
182 {
183 while (Unsafe.IsAddressLessThan(ref reference4, ref reference3))
184 {
185 ref T reference8 = ref Unsafe.Add(ref reference4, 1);
186 reference4 = ref reference8;
187 if (!GreaterThan(ref left, ref reference8))
188 {
189 break;
190 }
191 }
192 while (Unsafe.IsAddressGreaterThan(ref reference5, ref reference))
193 {
194 ref T reference9 = ref Unsafe.Add(ref reference5, -1);
195 reference5 = ref reference9;
196 if (!LessThan(ref left, ref reference9))
197 {
198 break;
199 }
200 }
201 }
202 if (!Unsafe.IsAddressLessThan(ref reference4, ref reference5))
203 {
204 break;
205 }
206 Swap(ref reference4, ref reference5);
207 }
208 if (!Unsafe.AreSame(ref reference4, ref reference3))
209 {
210 Swap(ref reference4, ref reference3);
211 }
212 return (int)((nint)Unsafe.ByteOffset(ref reference, ref reference4) / Unsafe.SizeOf<T>());
213 }

References System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.GreaterThan(), System.keys, System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.LessThan(), System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.Swap(), and System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.SwapIfGreater().

Referenced by System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.IntroSort(), and System.Collections.Generic.GenericArraySortHelper< TKey, TValue >.IntroSort().