Mercurial > code
annotate parray.h @ 165:970e491d93cb
Add _trim function to realloc to the needed size
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 24 Sep 2012 23:03:50 +0200 |
parents | 66d317ba4b80 |
children |
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 |
92 | 24 #ifndef PARRAY_DEFAULT_BSIZE |
62 | 25 #define PARRAY_DEFAULT_BSIZE 128 |
92 | 26 #endif |
62 | 27 |
148 | 28 enum parray_flags { |
136 | 29 PARRAY_AUTO = 0, /* array grows automatically */ |
30 PARRAY_FIXED = (1 << 0), /* fixed size length */ | |
31 PARRAY_FASTREMOVE = (1 << 1), /* use last object when removing */ | |
147
535f12e0a5af
Add a flag to prevent insertions at out of bounds
David Demelier <markand@malikania.fr>
parents:
142
diff
changeset
|
32 PARRAY_NULLEND = (1 << 2), /* always has a NULL pointer at end */ |
535f12e0a5af
Add a flag to prevent insertions at out of bounds
David Demelier <markand@malikania.fr>
parents:
142
diff
changeset
|
33 PARRAY_INSERTSAFE = (1 << 3) /* insertion must have valid indexes */ |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
117
diff
changeset
|
34 }; |
62 | 35 |
36 struct parray { | |
148 | 37 enum parray_flags flags; /* (ro) array flags (default AUTO) */ |
38 void **data; /* (rw) array of data */ | |
39 int length; /* (ro) number of element inside */ | |
40 size_t size; /* (ro) current buffer size (allocated memory) */ | |
41 int bsize; /* (rw) block size (used when growing array) */ | |
92 | 42 |
43 /* Own allocation functions */ | |
44 void * (*malloc)(size_t); | |
45 void * (*realloc)(void *, size_t); | |
62 | 46 }; |
47 | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
48 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
|
49 typedef int (*parray_cmp_t)(void *, void *); |
62 | 50 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
51 #ifdef __cplusplus |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
52 extern "C" { |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
53 #endif |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
54 |
134 | 55 int |
56 parray_init(struct parray *); | |
57 | |
58 void | |
59 parray_set(struct parray *, const char *, ...); | |
60 | |
61 int | |
62 parray_push(struct parray *, void *); | |
63 | |
64 int | |
65 parray_insert(struct parray *, void *, int); | |
66 | |
67 int | |
68 parray_append(struct parray *, void *); | |
69 | |
70 void | |
71 parray_pop(struct parray *); | |
72 | |
73 void | |
74 parray_unqueue(struct parray *); | |
75 | |
76 void | |
77 parray_iremove(struct parray *, int); | |
78 | |
79 void | |
80 parray_premove(struct parray *, const void *); | |
81 | |
82 int | |
83 parray_iswap(struct parray *, int, int); | |
84 | |
85 int | |
86 parray_pswap(struct parray *, const void *, const void *); | |
87 | |
88 void | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
89 parray_map(const struct parray *, parray_map_t, void *); |
134 | 90 |
91 int | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
92 parray_find(const struct parray *, parray_cmp_t, void *, void *); |
134 | 93 |
136 | 94 void * |
95 parray_first(const struct parray *); | |
96 | |
97 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
98 parray_get(const struct parray *, int); |
136 | 99 |
100 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
101 parray_last(const struct parray *); |
136 | 102 |
134 | 103 void |
104 parray_clear(struct parray *); | |
105 | |
106 void | |
107 parray_free(struct parray *); | |
62 | 108 |
165
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
163
diff
changeset
|
109 void * |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
163
diff
changeset
|
110 parray_trim(struct parray *); |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
163
diff
changeset
|
111 |
117
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
112 #define PARRAY_FOREACH(a, o, i) \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
113 for (i = 0, o = (a)->data[i]; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
114 i < (a)->length; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
115 ++i, o = (a)->data[i]) |
62 | 116 |
66 | 117 #ifdef __cplusplus |
118 } | |
119 #endif | |
120 | |
62 | 121 #endif /* _PARRAY_H_ */ |