Mercurial > code
diff parray.h @ 36:fdc3736ff806
Added parray.c and parray.h:
Functions similar to array.c but use pointers instead of memory
blocks.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 02 Oct 2011 09:55:16 +0200 |
parents | |
children | f69408c0441a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parray.h Sun Oct 02 09:55:16 2011 +0200 @@ -0,0 +1,73 @@ +/* + * array.h -- manipulate dynamic pointer arrays + * + * Copyright (c) 2011, David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _PARRAY_H_ +#define _PARRAY_H_ + +#define PARRAY_DEFAULT_BSIZE 128 + +#define PARRAY_FIXED 0x00 +#define PARRAY_AUTO 0x01 + +struct parray { + void **datas; /* array of data */ + int length; /* number of element inside */ + int type; /* array's flags (default FIXED) */ + size_t size; /* current buffer size (allocated memory) */ + int bsize; /* block size (used when growing array) */ + + /* Private, do not modify */ + int _i; /* only for PARRAY_FOREACH(_R) */ +}; + +struct parray *parray_new(void *, int, int); +#define parray_new_auto() parray_new(NULL, 0, PARRAY_AUTO) +#define parray_new_fixed(max) parray_new(NULL, max, PARRAY_FIXED) + +int parray_push(struct parray *, void *); +int parray_insert(struct parray *, void *, int); +int parray_append(struct parray *, void *); +void parray_pop(struct parray *); +void parray_unqueue(struct parray *); +void parray_remove(struct parray *, int); +void parray_unref(struct parray *, const void *); +int parray_swap(struct parray *, int, int); +void parray_map(const struct parray *, void (*fn)(void *, void *), void *); +void *parray_find(const struct parray *, int (*fn)(void *, void *), int *, void *); +void parray_clear(struct parray *); +void parray_free(struct parray *); + +#define PARRAY_FOREACH(a, var) \ + for ((a)->_i = 0, var = (a)->datas[0]; \ + (a)->_i < (a)->length; ++(a)->_i, \ + var = (a)->datas[((a)->_i >= (a)->length) ? \ + (a)->length - 1 : (a)->_i]) + +#define PARRAY_FOREACH_R(a, var) \ + for ((a)->_i = (a)->length - 1, var = (a)->datas[(a)->_i]; \ + (a)->_i >= 0; \ + --(a)->_i, var = (a)->datas[((a)->_i < 0) ? 0 : (a)->_i]) + +#define PARRAY_HEAD(a) \ + a->datas[0] +#define PARRAY_TAIL(a) \ + a->datas[a->length - 1] +#define PARRAY_INDEX(a, i) \ + a->datas[(i >= a->length) ? (a->length - 1) : i] + +#endif /* _PARRAY_H_ */