2025-02-02 21:40:31 +03:00
|
|
|
#include <BH/Algo.h>
|
|
|
|
|
#include <BH/Unit.h>
|
2025-01-18 17:24:36 +03:00
|
|
|
#include <string.h>
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int DBG_IntEqual(const void *lhs,
|
|
|
|
|
const void *rhs)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
return *(const int*)lhs - *(const int*)rhs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int DBG_VerifyPartition(size_t index,
|
|
|
|
|
int pivot,
|
|
|
|
|
int *array,
|
|
|
|
|
size_t size)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t i;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < index; i++)
|
|
|
|
|
if (array[i] >= pivot)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
for (i = index; i < size; i++)
|
|
|
|
|
if (array[i] < pivot)
|
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int DBG_VerifyHeap(int *array,
|
|
|
|
|
size_t size)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t i, left, right;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < size; i++)
|
|
|
|
|
{
|
|
|
|
|
left = i * 2 + 1;
|
|
|
|
|
right = i * 2 + 2;
|
|
|
|
|
|
|
|
|
|
if (left < size && array[i] < array[left])
|
|
|
|
|
return -1;
|
|
|
|
|
if (right < size && array[i] < array[right])
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int DBG_ReferenceRand(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
static uint32_t next = 2025;
|
|
|
|
|
next = next * 1103515245 + 12345;
|
|
|
|
|
return (next / 65536) % 32768;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static void DBG_ReferenceSort(int *array,
|
|
|
|
|
size_t size)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t i, j;
|
|
|
|
|
int tmp;
|
|
|
|
|
|
|
|
|
|
/* Reference sort is... buble sort! */
|
|
|
|
|
for (i = 0; i < size; i++)
|
|
|
|
|
{
|
|
|
|
|
for (j = 1; j < size; j++)
|
|
|
|
|
{
|
|
|
|
|
if (array[j - 1] > array[j])
|
|
|
|
|
{
|
|
|
|
|
tmp = array[j - 1];
|
|
|
|
|
array[j - 1] = array[j];
|
|
|
|
|
array[j] = tmp;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static void DBG_FillArrays(int *array,
|
|
|
|
|
int *reference,
|
|
|
|
|
size_t size,
|
|
|
|
|
int mask)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t i;
|
|
|
|
|
int negate;
|
|
|
|
|
|
|
|
|
|
/* Check if mask needs to be negated */
|
|
|
|
|
negate = mask < 0;
|
|
|
|
|
if (negate)
|
|
|
|
|
mask = -mask;
|
|
|
|
|
|
|
|
|
|
/* Fill the array */
|
|
|
|
|
for (i = 0; i < size; ++i)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
array[i] = DBG_ReferenceRand();
|
2025-01-18 17:24:36 +03:00
|
|
|
|
|
|
|
|
if (mask > 1)
|
|
|
|
|
array[i] = array[i] % mask;
|
|
|
|
|
|
|
|
|
|
if (negate)
|
|
|
|
|
array[i] = -array[i];
|
|
|
|
|
|
|
|
|
|
if (reference)
|
|
|
|
|
reference[i] = array[i];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckSort(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t sizes[] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0}, *size;
|
|
|
|
|
int reference[317], data[317];
|
|
|
|
|
|
|
|
|
|
/* Test empty array and one element arrays */
|
|
|
|
|
data[0] = 1; data[1] = 2; data[2] = 3;
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_Sort(data, 0, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(data[0] == 1);
|
|
|
|
|
BH_VERIFY(data[1] == 2);
|
|
|
|
|
BH_VERIFY(data[2] == 3);
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_Sort(data, 1, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(data[0] == 1);
|
|
|
|
|
BH_VERIFY(data[1] == 2);
|
|
|
|
|
BH_VERIFY(data[2] == 3);
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
|
|
|
|
BH_Sort(data, *size, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(reference, data, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against negative values */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, -1);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
|
|
|
|
BH_Sort(data, *size, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(reference, data, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against duplicates */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 4);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
|
|
|
|
BH_Sort(data, *size, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(reference, data, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckPartition(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t sizes[] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0}, *size;
|
|
|
|
|
int reference[317], data[317], value, *pivot;
|
|
|
|
|
|
|
|
|
|
/* Test empty array and one element array */
|
|
|
|
|
data[0] = 1; data[1] = 2; data[2] = 3;
|
|
|
|
|
value = 0;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, 0, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(pivot != NULL);
|
|
|
|
|
BH_VERIFY(data[0] == 1);
|
|
|
|
|
BH_VERIFY(data[1] == 2);
|
|
|
|
|
BH_VERIFY(data[2] == 3);
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, 1, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(pivot == data);
|
|
|
|
|
BH_VERIFY(data[0] == 1);
|
|
|
|
|
BH_VERIFY(data[1] == 2);
|
|
|
|
|
BH_VERIFY(data[2] == 3);
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = 16384;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against negative values */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, -1);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = -16384;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against duplicates */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 4);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = 2;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test array against small pivots */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = -100;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test array against large pivots */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = 65536;
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(&value, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes (pivot inside the array) */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = data[0];
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(data, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against negative values (pivot inside the array) */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, -1);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = data[0];
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(data, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against duplicates (pivot inside the array) */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 4);
|
2025-01-18 17:24:36 +03:00
|
|
|
value = data[0];
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(data, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Same data test */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
|
|
|
|
memset(data, 0, sizeof(int) * *size);
|
|
|
|
|
memset(reference, 0, sizeof(int) * *size);
|
|
|
|
|
value = data[*size - 1];
|
2025-01-30 13:53:26 +03:00
|
|
|
pivot = BH_Partition(data + *size - 1, data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyPartition(pivot - data, value, data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size * sizeof(int)) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckHeapMake(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t sizes[] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0}, *size;
|
|
|
|
|
int data[317];
|
|
|
|
|
|
|
|
|
|
/* Test empty array */
|
|
|
|
|
data[0] = 1; data[1] = 2; data[2] = 3;
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapMake(data, 0, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(data[0] == 1);
|
|
|
|
|
BH_VERIFY(data[1] == 2);
|
|
|
|
|
BH_VERIFY(data[2] == 3);
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, NULL, *size, 0);
|
|
|
|
|
BH_HeapMake(data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test array against negative values */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, NULL, *size, -1);
|
|
|
|
|
BH_HeapMake(data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test against duplicates */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, NULL, *size, 4);
|
|
|
|
|
BH_HeapMake(data, *size, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, *size) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckHeapInsert(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t sizes[] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0}, *size;
|
|
|
|
|
int data[317], reference[317];
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
|
|
|
|
size_t i;
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
for (i = 0; i < *size; ++i)
|
|
|
|
|
{
|
|
|
|
|
int value;
|
|
|
|
|
|
|
|
|
|
value = data[i];
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapInsert(&value, data, i, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, i + 1) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes (inplace)*/
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
|
|
|
|
size_t i;
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
for (i = 0; i < *size; ++i)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapInsert(NULL, data, i, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, i + 1) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckHeapRemove(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
size_t sizes[] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0}, *size;
|
|
|
|
|
int data[317], reference[317];
|
|
|
|
|
|
|
|
|
|
/* Test array against different sizes */
|
|
|
|
|
for (size = sizes; *size; ++size)
|
|
|
|
|
{
|
|
|
|
|
size_t i;
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_FillArrays(data, reference, *size, 0);
|
|
|
|
|
BH_HeapMake(data, *size, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
|
|
|
|
for (i = *size; i > 0; i--)
|
|
|
|
|
{
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, i) == 0);
|
|
|
|
|
BH_HeapRemove(data, i, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
}
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
DBG_ReferenceSort(data, *size);
|
|
|
|
|
DBG_ReferenceSort(reference, *size);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, *size) == 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
static int CheckHeapReplace(void)
|
2025-01-18 17:24:36 +03:00
|
|
|
{
|
|
|
|
|
int data[11] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0};
|
|
|
|
|
int reference[11] = {1, 2, 3, 5, 11, 23, 41, 79, 163, 317, 0};
|
|
|
|
|
int value;
|
|
|
|
|
|
|
|
|
|
/* Prepare test arrays */
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapMake(data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapMake(reference, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, 10) == 0);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(reference, 10) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
|
|
|
|
/* Verfify heap replace */
|
|
|
|
|
value = 20;
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapReplace(&value, data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapRemove(reference, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapInsert(&value, reference, 9, sizeof(int), DBG_IntEqual);
|
|
|
|
|
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, 10) == 0);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(reference, 10) == 0);
|
|
|
|
|
BH_Sort(data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_Sort(reference, 10, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, 10 * sizeof(int)) == 0);
|
|
|
|
|
|
|
|
|
|
/* Verify heap replace on single element array */
|
|
|
|
|
value = 400;
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapReplace(&value, data, 1, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapRemove(reference, 1, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapInsert(&value, reference, 0, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, 1) == 0);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(reference, 1) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, 1 * sizeof(int)) == 0);
|
|
|
|
|
|
|
|
|
|
/* Prepare test arrays */
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_Sort(data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_Sort(reference, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapMake(data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapMake(reference, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, 10) == 0);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(reference, 10) == 0);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
|
|
|
|
data[10] = 1000;
|
|
|
|
|
value = 1000;
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_HeapReplace(NULL, data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapRemove(reference, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_HeapInsert(&value, reference, 9, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(data, 10) == 0);
|
|
|
|
|
BH_VERIFY(DBG_VerifyHeap(reference, 10) == 0);
|
|
|
|
|
BH_Sort(data, 10, sizeof(int), DBG_IntEqual);
|
|
|
|
|
BH_Sort(reference, 10, sizeof(int), DBG_IntEqual);
|
2025-01-18 17:24:36 +03:00
|
|
|
BH_VERIFY(memcmp(data, reference, 10 * sizeof(int)) == 0);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
|
{
|
|
|
|
|
BH_UNUSED(argc);
|
|
|
|
|
BH_UNUSED(argv);
|
|
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
BH_UnitAdd("Sort", CheckSort);
|
|
|
|
|
BH_UnitAdd("Partition", CheckPartition);
|
|
|
|
|
BH_UnitAdd("HeapMake", CheckHeapMake);
|
|
|
|
|
BH_UnitAdd("HeapInsert", CheckHeapInsert);
|
|
|
|
|
BH_UnitAdd("HeapRemove", CheckHeapRemove);
|
|
|
|
|
BH_UnitAdd("HeapReplace", CheckHeapReplace);
|
2025-01-18 17:24:36 +03:00
|
|
|
|
2025-01-30 13:53:26 +03:00
|
|
|
return BH_UnitRun();
|
2025-01-29 09:19:34 +03:00
|
|
|
}
|