annotate array.h @ 41:5252fa9b5cb1

Little update for buffer
author David Demelier <markand@malikania.fr>
date Sun, 02 Oct 2011 11:17:36 +0200
parents 70a7bbe96b1d
children f1e184940197
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
14
2d112b8a3756 Fix typo
David Demelier <markand@malikania.fr>
parents: 13
diff changeset
2 * array.h -- manipulate dynamic arrays
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2011, David Demelier <markand@malikania.fr>
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #ifndef _ARRAY_H_
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #define _ARRAY_H_
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #define ARRAY_DEFAULT_BSIZE 128
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
24 #define ARRAY_FIXED 0x00
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
25 #define ARRAY_AUTO 0x01
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
26
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 struct array {
25
e09000fc013a Switch to void * thus the user do not need to cast
David Demelier <markand@malikania.fr>
parents: 22
diff changeset
28 void *data; /* array of data */
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
29 int length; /* number of element inside */
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
30 int type; /* array's flags (default FIXED) */
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
31 size_t size; /* current buffer size (allocated memory) */
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
32 size_t unit; /* unit size (sizeof the object) */
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
33 int bsize; /* block size (used when growing array) */
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
35 /* Private, do not modify */
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
36 void *_tmp; /* only used for array_swap() */
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
37 int _i; /* only for ARRAY_FOREACH(_R) */
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 };
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
40 struct array *array_new(const void *, size_t, int, int);
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
41 #define array_new_auto(size) array_new(NULL, size, 0, ARRAY_AUTO)
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
42 #define array_new_fixed(size, max) array_new(NULL, size, max, ARRAY_FIXED)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 int array_push(struct array *, const void *);
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 int array_insert(struct array *, const void *, int);
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 int array_append(struct array *, const void *);
29
19c0d2e11406 Security fixes for array
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
47 void array_pop(struct array *);
19c0d2e11406 Security fixes for array
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
48 void array_unqueue(struct array *);
19c0d2e11406 Security fixes for array
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
49 void array_remove(struct array *, int);
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
50 void array_unref(struct array *, const void *);
22
ecdf21f1d0c6 Added a new function array_swap() that swap elements by index
David Demelier <markand@malikania.fr>
parents: 19
diff changeset
51 int array_swap(struct array *, int, int);
29
19c0d2e11406 Security fixes for array
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
52 void array_map(const struct array *, void (*fn)(void *, void *), void *);
19c0d2e11406 Security fixes for array
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
53 void *array_find(const struct array *, int (*fn)(void *, void *), int *, void *);
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
54 void array_clear(struct array *);
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
55 void array_free(struct array *);
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
39
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
57 #define ARRAY_HEAD(a) \
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
58 a->data
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
59 #define ARRAY_TAIL(a) \
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
60 (void *) ((char *) a->data + (a->unit * (a->length - 1)))
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
61 #define ARRAY_INDEX(a, i) \
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
62 (void *) ((char *) a->data + (a->unit * \
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
63 ((i >= a->length) ? (a->length -1) : i)))
70a7bbe96b1d Organise like parray
David Demelier <markand@malikania.fr>
parents: 34
diff changeset
64
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
65 #define ARRAY_FOREACH(a, var) \
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
66 for (a->_i = 0, var = a->data; a->_i < a->length; ++a->_i, ++var)
27
02b0ee204042 Added ARRAY_FOREACH_R. Same functionality as ARRAY_FOREACH but reversal.
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
67
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
68 #define ARRAY_FOREACH_R(a, var) \
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
69 for (a->_i = 0, \
27
02b0ee204042 Added ARRAY_FOREACH_R. Same functionality as ARRAY_FOREACH but reversal.
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
70 var = (void *) ((char *) a->data + a->unit * (a->length - 1)); \
34
653bb22d3c0c For array.c:
David Demelier <markand@malikania.fr>
parents: 30
diff changeset
71 a->_i < a->length; ++a->_i, --var)
6
25cc379de564 Added array.c and array.h:
David Demelier <markand@malikania.fr>
parents:
diff changeset
72
8
127254037b30 Switch to a void * array instead of void **
David Demelier <markand@malikania.fr>
parents: 6
diff changeset
73 #endif /* _ARRAY_H_ */