Mercurial > code
view 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 source
/* * 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_ */