--- libelwix/inc/elwix/aarray.h 2014/01/29 14:16:53 1.5 +++ libelwix/inc/elwix/aarray.h 2019/01/23 18:22:41 1.10 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: aarray.h,v 1.5 2014/01/29 14:16:53 misho Exp $ +* $Id: aarray.h,v 1.10 2019/01/23 18:22:41 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2014 +Copyright 2004 - 2019 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -55,23 +55,22 @@ typedef struct _tagArray { #define array_Size(_arr) ((_arr) ? (_arr)->arr_num : 0) #define array_Last(_arr) (array_Size((_arr)) ? (_arr)->arr_last : -1) -#define array_Zero(_arr) (assert((_arr)), memset((_arr)->arr_data, 0, \ - array_Size((_arr)) * sizeof(intptr_t))) +#define array_Zero(_arr) (assert((_arr)), (_arr)->arr_last = -1, \ + memset((_arr)->arr_data, 0, array_Size((_arr)) * sizeof(intptr_t))) #define array_Ptr(_arr, _d) ((_arr) ? (_arr)->arr_data[_d] : NULL) #define array_Get2(_arr, _d) (assert((_arr) && (_arr)->arr_num > _d), ((_arr)->arr_data + _d)) -#define array_Get(_arr, _d) (assert((_arr) && (_arr)->arr_num > _d), (_arr)->arr_data[_d]) -#define array(_arr, _d, _type) (assert((_arr) && (_arr)->arr_num > _d), \ - ((_type) (_arr)->arr_data[_d])) -#define array_Set(_arr, _d, _ptr) do { assert((_arr) && (_arr)->arr_num > _d); \ - if ((_arr)->arr_last < _d) \ - (_arr)->arr_last = _d; \ - (_arr)->arr_data[_d] = (void*) (_ptr); \ +#define array_Get(_arr, _d) (assert((_arr)), (_arr)->arr_data[_d]) +#define array(_arr, _d, _type) (assert((_arr)), ((_type) (_arr)->arr_data[_d])) +#define array_Set(_arr, _d, _ptr) do { int __d = _d; assert((_arr) && (_arr)->arr_num > __d); \ + if ((_arr)->arr_last < __d) \ + (_arr)->arr_last = __d; \ + (_arr)->arr_data[__d] = (void*) (_ptr); \ } while (0) -#define array_Del(_arr, _d, _fri) do { assert((_arr) && (_arr)->arr_num > _d); \ - if (_fri && (_arr)->arr_data[_d]) \ - e_free((_arr)->arr_data[_d]); \ - (_arr)->arr_data[_d] = NULL; \ +#define array_Del(_arr, _d, _fri) do { int __d = _d; assert((_arr) && (_arr)->arr_num > __d); \ + if (_fri && (_arr)->arr_data[__d]) \ + e_free((_arr)->arr_data[__d]); \ + (_arr)->arr_data[__d] = NULL; \ } while (0) /* @@ -82,6 +81,14 @@ typedef struct _tagArray { */ array_t *array_Init(int numItems); /* + * array_Init2() - Initialize dynamic array + * + * @arr = Allocated array variable + * @numItems = Number of Items + * return: NULL error, != NULL allocated memory for array + */ +array_t *array_Init2(array_t * __restrict arr, int numItems); +/* * array_Destroy() - Free and destroy dynamic array * * @parr = Array @@ -89,6 +96,13 @@ array_t *array_Init(int numItems); */ void array_Destroy(array_t ** __restrict parr); /* + * array_Destroy2() - Free data in dynamic array + * + * @parr = Array + * return: none + */ +void array_Destroy2(array_t * __restrict arr); +/* * array_Free() - Free all data in dynamic array items * (WARNING! If assign static array dont use this!!!) * @@ -96,6 +110,14 @@ void array_Destroy(array_t ** __restrict parr); * return: none */ void array_Free(array_t * __restrict arr); +/* + * array_Reset() - Reset array to initial state + * + * @parr = Array + * @purge = Purge all data, if <>0 then will be free entire data memory + * return: none + */ +void array_Reset(array_t * __restrict arr, int purge); /* * array_From() - Create and fill array from array with pointers