mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
@@ -5,15 +5,19 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
Toy_Array* Toy_resizeArray(Toy_Array* paramArray, unsigned int capacity) {
|
Toy_Array* Toy_resizeArray(Toy_Array* paramArray, unsigned int capacity) {
|
||||||
|
//TODO: slip in a call to free the complex values here
|
||||||
|
|
||||||
if (capacity == 0) {
|
if (capacity == 0) {
|
||||||
free(paramArray);
|
free(paramArray);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Toy_Array* array = realloc(paramArray, capacity + sizeof(Toy_Array));
|
unsigned int originalCapacity = paramArray == NULL ? 0 : paramArray->capacity;
|
||||||
|
|
||||||
|
Toy_Array* array = realloc(paramArray, capacity * sizeof(Toy_Value) + sizeof(Toy_Array));
|
||||||
|
|
||||||
if (array == NULL) {
|
if (array == NULL) {
|
||||||
fprintf(stderr, TOY_CC_ERROR "ERROR: Failed to allocate a 'Toy_Array' of %d capacity\n" TOY_CC_RESET, (int)capacity);
|
fprintf(stderr, TOY_CC_ERROR "ERROR: Failed to resize a 'Toy_Array' from %d to %d capacity\n" TOY_CC_RESET, (int)originalCapacity, (int)capacity);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,25 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "toy_common.h"
|
#include "toy_common.h"
|
||||||
|
#include "toy_value.h"
|
||||||
|
|
||||||
//standard generic array
|
//standard generic array
|
||||||
typedef struct Toy_Array { //32 | 64 BITNESS
|
typedef struct Toy_Array { //32 | 64 BITNESS
|
||||||
unsigned int capacity; //4 | 4
|
unsigned int capacity; //4 | 4
|
||||||
unsigned int count; //4 | 4
|
unsigned int count; //4 | 4
|
||||||
char data[]; //- | -
|
Toy_Value data[]; //- | -
|
||||||
} Toy_Array; //8 | 8
|
} Toy_Array; //8 | 8
|
||||||
|
|
||||||
TOY_API Toy_Array* Toy_resizeArray(Toy_Array* array, unsigned int capacity);
|
TOY_API Toy_Array* Toy_resizeArray(Toy_Array* array, unsigned int capacity);
|
||||||
|
|
||||||
#define TOY_ALLOCATE_ARRAY(type, count) \
|
|
||||||
Toy_resizeArray(NULL, sizeof(type)*(count))
|
|
||||||
|
|
||||||
#define TOY_FREE_ARRAY(type, array) \
|
|
||||||
Toy_resizeArray(array, 0)
|
|
||||||
|
|
||||||
#define TOY_ADJUST_ARRAY(type, array, newCapacity) \
|
|
||||||
Toy_resizeArray(array, sizeof(type) * newCapacity)
|
|
||||||
|
|
||||||
#define TOY_DOUBLE_ARRAY_CAPACITY(type, array) \
|
|
||||||
Toy_resizeArray(array, sizeof(type) * array->capacity < 8 ? sizeof(type) * 8 : sizeof(type) * array->capacity * 2)
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "toy_common.h"
|
#include "toy_common.h"
|
||||||
|
|
||||||
#include "toy_value.h"
|
#include "toy_value.h"
|
||||||
|
|
||||||
//key-value entry, and probe sequence length - https://programming.guide/robin-hood-hashing.html
|
//key-value entry, and probe sequence length - https://programming.guide/robin-hood-hashing.html
|
||||||
|
|||||||
@@ -3,33 +3,33 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
int test_resizeArray() {
|
int test_array() {
|
||||||
//test single pointer
|
//test allocation and free
|
||||||
{
|
{
|
||||||
Toy_Array* array = TOY_ALLOCATE_ARRAY(int, 1);
|
Toy_Array* array = Toy_resizeArray(NULL, 1);
|
||||||
TOY_FREE_ARRAY(int, array);
|
array = Toy_resizeArray(array, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//test single pointer array
|
//test initial data
|
||||||
{
|
{
|
||||||
Toy_Array* array = TOY_ALLOCATE_ARRAY(int, 10);
|
Toy_Array* array = Toy_resizeArray(NULL, 10);
|
||||||
|
|
||||||
//check you can access the memory
|
//check you can access the memory
|
||||||
array->data[1] = 42;
|
array->data[1] = TOY_VALUE_FROM_INTEGER(42);
|
||||||
|
|
||||||
TOY_FREE_ARRAY(int, array);
|
Toy_resizeArray(array, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
//test multiple pointer arrays
|
//test multiple arrays (no overlaps or conflicts)
|
||||||
{
|
{
|
||||||
Toy_Array* array1 = TOY_ALLOCATE_ARRAY(int, 10);
|
Toy_Array* array1 = Toy_resizeArray(NULL, 10);
|
||||||
Toy_Array* array2 = TOY_ALLOCATE_ARRAY(int, 10);
|
Toy_Array* array2 = Toy_resizeArray(NULL, 10);
|
||||||
|
|
||||||
array1->data[1] = 42; //access the given memory
|
array1->data[1] = TOY_VALUE_FROM_INTEGER(42);
|
||||||
array2->data[1] = 42; //access the given memory
|
array2->data[1] = TOY_VALUE_FROM_INTEGER(42);
|
||||||
|
|
||||||
TOY_FREE_ARRAY(int, array1);
|
Toy_resizeArray(array1, 0);
|
||||||
TOY_FREE_ARRAY(int, array2);
|
Toy_resizeArray(array2, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -40,7 +40,7 @@ int main() {
|
|||||||
int total = 0, res = 0;
|
int total = 0, res = 0;
|
||||||
|
|
||||||
{
|
{
|
||||||
res = test_resizeArray();
|
res = test_array();
|
||||||
total += res;
|
total += res;
|
||||||
|
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user