Mercurial > code
annotate parray.h @ 142:e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 08 May 2012 15:02:17 +0200 |
parents | c6d9eb5702e8 |
children | 535f12e0a5af |
rev | line source |
---|---|
62 | 1 /* |
136 | 2 * parray.h -- manipulate dynamic pointer arrays |
62 | 3 * |
98 | 4 * Copyright (c) 2011, 2012, David Demelier <markand@malikania.fr> |
62 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #ifndef _PARRAY_H_ | |
20 #define _PARRAY_H_ | |
21 | |
135
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
22 #include <stdarg.h> |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
23 |
66 | 24 #ifdef __cplusplus |
25 extern "C" { | |
26 #endif | |
27 | |
92 | 28 #ifndef PARRAY_DEFAULT_BSIZE |
62 | 29 #define PARRAY_DEFAULT_BSIZE 128 |
92 | 30 #endif |
62 | 31 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
117
diff
changeset
|
32 enum { |
136 | 33 PARRAY_AUTO = 0, /* array grows automatically */ |
34 PARRAY_FIXED = (1 << 0), /* fixed size length */ | |
35 PARRAY_FASTREMOVE = (1 << 1), /* use last object when removing */ | |
36 PARRAY_NULLEND = (1 << 2) /* always has a NULL pointer at end */ | |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
117
diff
changeset
|
37 }; |
62 | 38 |
39 struct parray { | |
136 | 40 int flags; /* (ro) array flags (default AUTO) */ |
135
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
41 void **data; /* (rw) array of data */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
42 int length; /* (ro) number of element inside */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
43 size_t size; /* (ro) current buffer size (allocated memory) */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
44 int bsize; /* (rw) block size (used when growing array) */ |
92 | 45 |
46 /* Own allocation functions */ | |
47 void * (*malloc)(size_t); | |
48 void * (*realloc)(void *, size_t); | |
62 | 49 }; |
50 | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
51 typedef void (*parray_map_t)(void *, void *); |
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
52 typedef int (*parray_cmp_t)(void *, void *); |
62 | 53 |
134 | 54 int |
55 parray_init(struct parray *); | |
56 | |
57 void | |
58 parray_set(struct parray *, const char *, ...); | |
59 | |
60 int | |
61 parray_push(struct parray *, void *); | |
62 | |
63 int | |
64 parray_insert(struct parray *, void *, int); | |
65 | |
66 int | |
67 parray_append(struct parray *, void *); | |
68 | |
69 void | |
70 parray_pop(struct parray *); | |
71 | |
72 void | |
73 parray_unqueue(struct parray *); | |
74 | |
75 void | |
76 parray_iremove(struct parray *, int); | |
77 | |
78 void | |
79 parray_premove(struct parray *, const void *); | |
80 | |
81 int | |
82 parray_iswap(struct parray *, int, int); | |
83 | |
84 int | |
85 parray_pswap(struct parray *, const void *, const void *); | |
86 | |
87 void | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
88 parray_map(const struct parray *, parray_map_t, void *); |
134 | 89 |
90 int | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
91 parray_find(const struct parray *, parray_cmp_t, void *, void *); |
134 | 92 |
136 | 93 void * |
94 parray_first(const struct parray *); | |
95 | |
96 void * | |
97 parray_last(const struct parray *); | |
98 | |
99 void * | |
100 parray_index(const struct parray *, int); | |
101 | |
134 | 102 void |
103 parray_clear(struct parray *); | |
104 | |
105 void | |
106 parray_free(struct parray *); | |
62 | 107 |
117
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
108 #define PARRAY_FOREACH(a, o, i) \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
109 for (i = 0, o = (a)->data[i]; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
110 i < (a)->length; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
111 ++i, o = (a)->data[i]) |
62 | 112 |
66 | 113 #ifdef __cplusplus |
114 } | |
115 #endif | |
116 | |
62 | 117 #endif /* _PARRAY_H_ */ |