Mercurial > code
view parray.h @ 44:295e76f7bd28
For parray, added a better PARRAY_INDEX that evaluate to the following:
if (index < 0 || arr->length == 0)
data = a->datas[0];
else if (index >= arr->length)
data = a->datas[arr->length - 1];
else
data = a->datas[index];
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 02 Oct 2011 19:57:07 +0200 |
parents | f1e184940197 |
children | 2901c594eaef |
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_iswap(struct parray *, int, int); int parray_pswap(struct parray *, const void *, const void *); 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_HEAD(a) \ a->datas[0] #define PARRAY_TAIL(a) \ a->datas[a->length - 1] #define PARRAY_INDEX(a, i) \ a->datas[(i < 0 || a->length == 0) ? 0 : \ (i >= a->length) ? a->length - 1 : i] #define PARRAY_FOREACH_R(a, var) \ for ((a)->_i = (a)->length - 1, var = PARRAY_INDEX((a), (a)->_i); \ (a)->_i >= 0; --(a)->_i, var = PARRAY_INDEX((a), (a)->_i)) #define PARRAY_FOREACH(a, var) \ for ((a)->_i = 0, var = PARRAY_INDEX((a), (a)->_i); \ (a)->_i < (a)->length; ++(a)->_i, var = PARRAY_INDEX((a), (a)->_i)) #define PARRAY_FLUSH(a) \ do { \ void *i; \ \ PARRAY_FOREACH_R(a, i) { \ free(i); \ parray_unqueue((a)); \ } \ \ (a)->length = 0; \ } while (/* CONSTCOND */ 0); #endif /* _PARRAY_H_ */