|
@@ -1,10 +1,17 @@
|
|
|
#include <ds/array.h>
|
|
#include <ds/array.h>
|
|
|
#include <ds/err.h>
|
|
#include <ds/err.h>
|
|
|
|
|
+#include <string.h>
|
|
|
|
|
|
|
|
extern func_malloc ds_malloc;
|
|
extern func_malloc ds_malloc;
|
|
|
extern func_free ds_free;
|
|
extern func_free ds_free;
|
|
|
|
|
|
|
|
-ds_array_t* ds_array_init(func_destroyer destroyer, int size)
|
|
|
|
|
|
|
+struct _ds_array {
|
|
|
|
|
+ int size;
|
|
|
|
|
+ func_destroyer destroyer;
|
|
|
|
|
+ ds_data_t *ptr;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+ds_array_t* ds_array_new(int size, func_destroyer destroyer)
|
|
|
{
|
|
{
|
|
|
ds_array_t* arr = (ds_array_t*)ds_malloc(sizeof(ds_array_t));
|
|
ds_array_t* arr = (ds_array_t*)ds_malloc(sizeof(ds_array_t));
|
|
|
if (!arr) {
|
|
if (!arr) {
|
|
@@ -12,14 +19,17 @@ ds_array_t* ds_array_init(func_destroyer destroyer, int size)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(size <= 0) {
|
|
if(size <= 0) {
|
|
|
- size = DEF_ARRAY_SIZE;
|
|
|
|
|
|
|
+ size = DS_DEF_ARRAY_SIZE;
|
|
|
}
|
|
}
|
|
|
arr->ptr = (ds_data_t*)ds_malloc(sizeof(ds_data_t) * size);
|
|
arr->ptr = (ds_data_t*)ds_malloc(sizeof(ds_data_t) * size);
|
|
|
if(!arr->ptr) {
|
|
if(!arr->ptr) {
|
|
|
ds_free(arr);
|
|
ds_free(arr);
|
|
|
return NULL;
|
|
return NULL;
|
|
|
}
|
|
}
|
|
|
- arr->destroyer = destroyer;
|
|
|
|
|
|
|
+ memset(arr->ptr, 0, sizeof(ds_data_t) * size);
|
|
|
|
|
+
|
|
|
|
|
+ arr->size = size;
|
|
|
|
|
+ arr->destroyer = destroyer?destroyer:ds_cb_default_destroyer;
|
|
|
return arr;
|
|
return arr;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -29,11 +39,13 @@ void ds_array_destroy(ds_array_t* arr)
|
|
|
if(!arr) {
|
|
if(!arr) {
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- for(i=0; i<arr->size; i++) {
|
|
|
|
|
- if(arr->destroyer) {
|
|
|
|
|
- arr->destroyer(arr->ptr+i);
|
|
|
|
|
|
|
+ for(i=arr->size - 1; i>0; i--) {
|
|
|
|
|
+ if(arr->ptr[i]) {
|
|
|
|
|
+ arr->destroyer(arr->ptr[i]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ ds_free(arr->ptr);
|
|
|
|
|
+ ds_free(arr);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
int ds_array_get(ds_array_t* arr, int pos, ds_data_t* data)
|
|
int ds_array_get(ds_array_t* arr, int pos, ds_data_t* data)
|
|
@@ -41,7 +53,7 @@ int ds_array_get(ds_array_t* arr, int pos, ds_data_t* data)
|
|
|
if(!arr) {
|
|
if(!arr) {
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
|
}
|
|
}
|
|
|
- if(pos >= arr->size){
|
|
|
|
|
|
|
+ if(pos >= arr->size || pos < 0){
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
|
}
|
|
}
|
|
|
if(data){
|
|
if(data){
|
|
@@ -55,9 +67,14 @@ int ds_array_set(ds_array_t* arr, int pos, ds_data_t data)
|
|
|
if(!arr) {
|
|
if(!arr) {
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
|
}
|
|
}
|
|
|
- if(pos >= arr->size){
|
|
|
|
|
|
|
+ if(pos >= arr->size || pos < 0){
|
|
|
return DS_ERR_PARAMS;
|
|
return DS_ERR_PARAMS;
|
|
|
}
|
|
}
|
|
|
|
|
+ // if occupied
|
|
|
|
|
+ if( arr->ptr[pos]) {
|
|
|
|
|
+ arr->destroyer(arr->ptr[pos]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
arr->ptr[pos] = data;
|
|
arr->ptr[pos] = data;
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
|
}
|
|
}
|
|
@@ -69,8 +86,16 @@ int ds_array_fill(ds_array_t* arr, ds_data_t data)
|
|
|
}
|
|
}
|
|
|
int i;
|
|
int i;
|
|
|
for (i=0; i<arr->size; i++){
|
|
for (i=0; i<arr->size; i++){
|
|
|
|
|
+ if (arr->ptr[i]) {
|
|
|
|
|
+ arr->destroyer(arr->ptr[i]);
|
|
|
|
|
+ }
|
|
|
arr->ptr[i] = data;
|
|
arr->ptr[i] = data;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return DS_ERR_OK;
|
|
return DS_ERR_OK;
|
|
|
-}
|
|
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+inline int ds_array_size(ds_array_t* arr)
|
|
|
|
|
+{
|
|
|
|
|
+ return arr->size;
|
|
|
|
|
+}
|