9 #define RANGES_OVERLAP(S1, E1, S2, E2) (!((E1) < (S2) || (S1) > (E2))) 16 _In_ size_t SizeOfElements,
39 right = (Length / SizeOfElements);
41 switch (SizeOfElements)
44 dst = *((
BYTE *)Target);
47 dst = *((
WORD *)Target);
50 dst = *((
DWORD *)Target);
53 dst = *((
QWORD *)Target);
61 size_t midd = (left + right) / 2;
63 switch (SizeOfElements)
66 src = *((
BYTE *)Buffer + midd * SizeOfElements);
69 src = *((
WORD *)((
BYTE *)Buffer + midd * SizeOfElements));
72 src = *((
DWORD *)((
BYTE *)Buffer + midd * SizeOfElements));
75 src = *((
QWORD *)((
BYTE *)Buffer + midd * SizeOfElements));
105 _In_ size_t MaximumLength,
106 _In_ size_t SizeOfElements,
123 if (MaximumLength < Length + SizeOfElements)
128 switch (SizeOfElements)
131 dst = *((
BYTE *)Target);
134 dst = *((
WORD *)Target);
137 dst = *((
DWORD *)Target);
140 dst = *((
QWORD *)Target);
146 for (i = Length; i > 0; i -= SizeOfElements)
148 switch (SizeOfElements)
151 src = *((
BYTE *)Buffer + i - SizeOfElements);
154 src = *((
WORD *)((
BYTE *)Buffer + i - SizeOfElements));
157 src = *((
DWORD *)((
BYTE *)Buffer + i - SizeOfElements));
160 src = *((
QWORD *)((
BYTE *)Buffer + i - SizeOfElements));
168 memcpy((
BYTE *)Buffer + i, &dst, SizeOfElements);
169 return i / SizeOfElements;
173 memcpy((
BYTE *)Buffer + i, &src, SizeOfElements);
178 memcpy(Buffer, Target, SizeOfElements);
189 #define QUICKSORT_FUNCTION(Array, TypeOfArray) \ 191 _QuickSort##TypeOfArray( \ 192 _Inout_updates_all_(NumberOfElements) TypeOfArray *Array, \ 193 _In_ const DWORD NumberOfElements \ 196 DWORD begin[64] = {0}, end[64] = {0}; \ 201 end[0] = NumberOfElements; \ 205 int left = begin[i]; \ 206 int right = end[i] - 1; \ 210 pivot = Array[left]; \ 212 while (left < right) \ 214 while (Array[right] >= pivot && left < right) \ 221 Array[left++] = Array[right]; \ 224 while (Array[left] <= pivot && left < right) \ 231 Array[right--] = Array[left]; \ 235 Array[left] = pivot; \ 237 begin[i + 1] = left + 1; \ 238 end[i + 1] = end[i]; \ 241 if (end[i] - begin[i] > end[i - 1] - begin[i - 1]) \ 244 begin[i] = begin[i - 1]; \ 245 begin[i - 1] = swap; \ 248 end[i] = end[i - 1]; \ 276 _QuickSortBYTE(Array, NumberOfElements);
279 _QuickSortWORD(Array, NumberOfElements);
282 _QuickSortDWORD(Array, NumberOfElements);
285 _QuickSortQWORD(Array, NumberOfElements);
295 _In_ size_t SizeOfElements,
326 dst = *((
BYTE *)Target);
329 dst = *((
WORD *)Target);
332 dst = *((
DWORD *)Target);
335 dst = *((
QWORD *)Target);
343 size_t midd = (left + right) / 2;
348 src = *((
BYTE *)Buffer + midd * SizeOfElements + CompareFieldOffset);
351 src = *((
WORD *)((
BYTE *)Buffer + midd * SizeOfElements + CompareFieldOffset));
354 src = *((
DWORD *)((
BYTE *)Buffer + midd * SizeOfElements + CompareFieldOffset));
357 src = *((
QWORD *)((
BYTE *)Buffer + midd * SizeOfElements + CompareFieldOffset));
397 for (
size_t i = 0; i < NumberOfElements - j; i++)
399 if (Array[i] > Array[i + 1])
401 QWORD tmp = Array[i];
402 Array[i] = Array[i + 1];
415 _In_ size_t BufferSize
418 static const char zeroPage[
PAGE_SIZE] = { 0 };
420 if (BufferSize >
PAGE_SIZE || NULL == Buffer)
425 return memcmp(Buffer, zeroPage, BufferSize) == 0;
void UtilSortQwords(QWORD *Array, const DWORD NumberOfElements)
BOOLEAN UtilIsBufferZero(void *Buffer, size_t BufferSize)
#define _In_bytecount_(expr)
#define _Inout_updates_bytes_(expr)
#define QUICKSORT_FUNCTION(Array, TypeOfArray)
size_t UtilBinarySearchStructure(void *Buffer, size_t Count, size_t SizeOfElements, DWORD CompareFieldOffset, void *Target, DWORD TargetSize)
#define _Inout_updates_(expr)
void UtilQuickSort(void *Array, const DWORD NumberOfElements, const BYTE ElementSize)
size_t UtilBinarySearch(void *Buffer, size_t Length, size_t SizeOfElements, void *Target)
size_t UtilInsertOrdered(void *Buffer, size_t Length, size_t MaximumLength, size_t SizeOfElements, void *Target)