/*
Copyright (C) 2008 Tomash Brechko. All rights reserved.
When used to build Perl module:
This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.8.8
or, at your option, any later version of Perl 5 you may have
available.
When used as a standalone library:
This library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
*/
#ifndef ARRAY_H
#define ARRAY_H 1
struct array
{
void *buf;
int capacity;
int elems;
};
extern
void
array_init(struct array *a);
extern
void
array_destroy(struct array *a);
enum e_array_extend { ARRAY_EXTEND_EXACT, ARRAY_EXTEND_TWICE };
extern
int
array_resize(struct array *a, int elem_size, int elems,
enum e_array_extend extend);
#define array_extend(array, type, add, extend) \
array_resize(&(array), sizeof(type), (array).elems + add, extend)
#define array_push(array) ++(array).elems
#define array_pop(array) --(array).elems
#define array_append(array, add) (array).elems += add
#define array_size(array) ((array).elems)
#define array_empty(array) ((array).elems == 0)
#define array_clear(array) (array).elems = 0
#define array_elem(array, type, index) ((type *) (array).buf + index)
#define array_beg(array, type) ((type *) (array).buf)
#define array_end(array, type) ((type *) (array).buf + (array).elems)
#define array_each(array, type, p) \
(p) = array_beg(array, type); (p) != array_end(array, type); ++(p)
#endif /* ! ARRAY_H */