view array.h @ 42:30499f543188

Remove FreeBSD specific macros in queue.h
author David Demelier <markand@malikania.fr>
date Sun, 02 Oct 2011 11:26:30 +0200
parents 70a7bbe96b1d
children f1e184940197
line wrap: on
line source

/*
 * array.h -- manipulate dynamic 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 _ARRAY_H_
#define _ARRAY_H_

#define ARRAY_DEFAULT_BSIZE	128

#define ARRAY_FIXED	0x00
#define ARRAY_AUTO	0x01

struct array {
	void	*data;	/* array of data */
	int	length;	/* number of element inside */
	int	type;	/* array's flags (default FIXED) */
	size_t	size;	/* current buffer size (allocated memory) */
	size_t	unit;	/* unit size (sizeof the object) */
	int	bsize;	/* block size (used when growing array) */

	/* Private, do not modify */
	void	*_tmp;	/* only used for array_swap() */
	int	_i;	/* only for ARRAY_FOREACH(_R) */
};

struct array	*array_new(const void *, size_t, int, int);
#define array_new_auto(size)		array_new(NULL, size, 0, ARRAY_AUTO)
#define array_new_fixed(size, max)	array_new(NULL, size, max, ARRAY_FIXED)

int	array_push(struct array *, const void *);
int	array_insert(struct array *, const void *, int);
int	array_append(struct array *, const void *);
void	array_pop(struct array *);
void	array_unqueue(struct array *);
void	array_remove(struct array *, int);
void	array_unref(struct array *, const void *);
int	array_swap(struct array *, int, int);
void	array_map(const struct array *, void (*fn)(void *, void *), void *);
void	*array_find(const struct array *, int (*fn)(void *, void *), int *, void *);
void	array_clear(struct array *);
void	array_free(struct array *);

#define ARRAY_HEAD(a)								\
	a->data
#define ARRAY_TAIL(a)								\
	(void *) ((char *) a->data + (a->unit * (a->length - 1)))
#define ARRAY_INDEX(a, i)							\
	(void *) ((char *) a->data + (a->unit *					\
	    ((i >= a->length) ? (a->length -1) : i)))

#define ARRAY_FOREACH(a, var)							\
	for (a->_i = 0, var = a->data; a->_i < a->length; ++a->_i, ++var)

#define ARRAY_FOREACH_R(a, var)							\
	for (a->_i = 0,								\
	    var = (void *) ((char *) a->data + a->unit * (a->length - 1));	\
	    a->_i < a->length; ++a->_i, --var)	

#endif /* _ARRAY_H_ */