safe array
add an extra pointer to the array to make pointer arithmetic possible
This commit is contained in:
@@ -31,9 +31,21 @@ array_t *array_init(size_t size, size_t rows)
|
|||||||
|
|
||||||
arr->rows = rows;
|
arr->rows = rows;
|
||||||
arr->size = size;
|
arr->size = size;
|
||||||
|
arr->ptr = arr->data;
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t array_get_rows(array_t *arr)
|
||||||
|
{
|
||||||
|
if (!arr)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s: Invalid argument\n", __func__);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr->rows;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This function gets an element from the safe array
|
* @brief This function gets an element from the safe array
|
||||||
*
|
*
|
||||||
@@ -55,18 +67,7 @@ void *array_get(array_t *arr, size_t index)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)arr->data + (index * arr->size);
|
return (char *)arr->ptr + (index * arr->size);
|
||||||
}
|
|
||||||
|
|
||||||
size_t array_get_rows(array_t *arr)
|
|
||||||
{
|
|
||||||
if (!arr)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s: Invalid argument\n", __func__);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return arr->rows;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,7 +92,7 @@ int array_set(array_t *arr, size_t index, void *element)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dest = (char *)arr->data + (index * arr->size);
|
void *dest = (char *)arr->ptr + (index * arr->size);
|
||||||
memcpy(dest, element, arr->size);
|
memcpy(dest, element, arr->size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -131,6 +132,7 @@ array_2d_t *array_2d_init(size_t size, size_t rows, size_t cols)
|
|||||||
arr->rows = rows;
|
arr->rows = rows;
|
||||||
arr->cols = cols;
|
arr->cols = cols;
|
||||||
arr->size = size;
|
arr->size = size;
|
||||||
|
arr->ptr = arr->data;
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,7 +191,7 @@ void *array_2d_get(array_2d_t *x, size_t row, size_t col)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)x->data + (row * x->size) + (col * x->cols * x->size);
|
return (char *)x->ptr + (row * x->size) + (col * x->cols * x->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -219,7 +221,7 @@ int array_2d_set(array_2d_t *x, size_t row, size_t col, void *val)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *dest = (char *)x->data + (row * x->size) + (col * x->cols * x->size);
|
void *dest = (char *)x->ptr + (row * x->size) + (col * x->cols * x->size);
|
||||||
memcpy(dest, val, x->size);
|
memcpy(dest, val, x->size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -257,6 +259,7 @@ array_c_s_t *array_c_s_init(size_t rows, size_t size)
|
|||||||
|
|
||||||
x->rows = rows;
|
x->rows = rows;
|
||||||
x->size = size;
|
x->size = size;
|
||||||
|
x->ptr = x->data;
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +295,7 @@ void* array_c_get_imag(array_c_s_t *x, size_t row)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)x->data + (2 * row * x->size);
|
return (char *)x->ptr + (2 * row * x->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -310,7 +313,7 @@ void* array_c_get_real(array_c_s_t *x, size_t row)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)x->data + ((2 * row + 1) * x->size);
|
return (char *)x->ptr + ((2 * row + 1) * x->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -329,8 +332,8 @@ int array_c_s_set(array_c_s_t *x, size_t row, void *real, void *imaginary)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((char *)x->data + ((2 * row + 1) * x->size), real, x->size);
|
memcpy((char *)x->ptr + ((2 * row + 1) * x->size), real, x->size);
|
||||||
memcpy((char *)x->data + ( 2 * row * x->size), imaginary, x->size);
|
memcpy((char *)x->ptr + ( 2 * row * x->size), imaginary, x->size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -367,6 +370,7 @@ array_c_p_t *array_c_p_init(size_t rows, size_t size)
|
|||||||
}
|
}
|
||||||
x->size = size;
|
x->size = size;
|
||||||
x->rows = rows;
|
x->rows = rows;
|
||||||
|
x->ptr = x->data;
|
||||||
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
@@ -396,7 +400,7 @@ void* array_c_get_mag(array_c_p_t *x, size_t row)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)x->data + (2 * row * x->size);
|
return (char *)x->ptr + (2 * row * x->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* array_c_get_phase(array_c_p_t *x, size_t row)
|
void* array_c_get_phase(array_c_p_t *x, size_t row)
|
||||||
@@ -407,7 +411,7 @@ void* array_c_get_phase(array_c_p_t *x, size_t row)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (char *)x->data + ((2 * row + 1) * x->size);
|
return (char *)x->ptr + ((2 * row + 1) * x->size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -426,8 +430,8 @@ int array_c_p_set(array_c_p_t *x, size_t row, void* magnitude, void* phase)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy((char *)x->data + (2 * row * x->size), magnitude, x->size);
|
memcpy((char *)x->ptr + (2 * row * x->size), magnitude, x->size);
|
||||||
memcpy((char *)x->data + ((2 * row + 1) * x->size), phase, x->size);
|
memcpy((char *)x->ptr + ((2 * row + 1) * x->size), phase, x->size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ typedef struct array_s
|
|||||||
{
|
{
|
||||||
size_t rows;
|
size_t rows;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
void* ptr;
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
} array_t;
|
} array_t;
|
||||||
|
|
||||||
@@ -36,6 +37,7 @@ typedef struct array_2d_s
|
|||||||
size_t rows;
|
size_t rows;
|
||||||
size_t cols;
|
size_t cols;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
void* ptr;
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
} array_2d_t;
|
} array_2d_t;
|
||||||
|
|
||||||
@@ -43,6 +45,7 @@ typedef struct array_c_s
|
|||||||
{
|
{
|
||||||
size_t rows;
|
size_t rows;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
void* ptr;
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
} array_c_s_t;
|
} array_c_s_t;
|
||||||
|
|
||||||
@@ -50,6 +53,7 @@ typedef struct array_c_p_s
|
|||||||
{
|
{
|
||||||
size_t rows;
|
size_t rows;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
void* ptr;
|
||||||
uint8_t data[1];
|
uint8_t data[1];
|
||||||
} array_c_p_t;
|
} array_c_p_t;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user