Mercurial > code
annotate C/array.h @ 186:d4b8416e9ab1
Move C
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 23 Nov 2013 16:14:05 +0100 |
parents | array.h@970e491d93cb |
children |
rev | line source |
---|---|
62 | 1 /* |
2 * array.h -- manipulate dynamic arrays | |
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 _ARRAY_H_ | |
20 #define _ARRAY_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 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
24 #ifndef ARRAY_DEFAULT_CHKSIZE |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
25 #define ARRAY_DEFAULT_CHKSIZE 128 |
91
b3ba5f5df3b9
New style for array.c and array.h, no pointer to these object thus
David Demelier <markand@malikania.fr>
parents:
69
diff
changeset
|
26 #endif |
62 | 27 |
164 | 28 enum array_flags { |
29 ARRAY_AUTO = 0, /* array grows automatically */ | |
165
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
30 ARRAY_FIXED = (1 << 0), /* fixed size length */ |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
31 ARRAY_FASTREMOVE = (1 << 1), /* use last object when removing */ |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
32 ARRAY_CLEARBITS = (1 << 2), /* clear data when inserting/removing */ |
164 | 33 ARRAY_INSERTSAFE = (1 << 3) /* insertion must have valid indexes */ |
34 }; | |
62 | 35 |
36 struct array { | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
37 int flags; /* (ro) array flags (default AUTO) */ |
148 | 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 size_t unit; /* (ro) unit size (sizeof the object) */ | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
42 int chksize; /* (rw) chunk size (used when growing array) */ |
91
b3ba5f5df3b9
New style for array.c and array.h, no pointer to these object thus
David Demelier <markand@malikania.fr>
parents:
69
diff
changeset
|
43 |
92 | 44 /* Own allocation functions */ |
91
b3ba5f5df3b9
New style for array.c and array.h, no pointer to these object thus
David Demelier <markand@malikania.fr>
parents:
69
diff
changeset
|
45 void * (*malloc)(size_t); |
b3ba5f5df3b9
New style for array.c and array.h, no pointer to these object thus
David Demelier <markand@malikania.fr>
parents:
69
diff
changeset
|
46 void * (*realloc)(void *, size_t); |
62 | 47 }; |
48 | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
49 typedef void (*array_map_t)(void *, void *); |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
50 typedef int (*array_cmp_t)(const void *, const void *); |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
51 |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
52 #ifdef __cplusplus |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
53 extern "C" { |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
54 #endif |
62 | 55 |
134 | 56 int |
57 array_init(struct array *, size_t); | |
58 | |
59 void | |
60 array_set(struct array *, const char *, ...); | |
61 | |
62 int | |
63 array_push(struct array *, const void *); | |
64 | |
65 int | |
66 array_insert(struct array *, const void *, int); | |
67 | |
68 int | |
69 array_append(struct array *, const void *); | |
70 | |
71 void | |
72 array_pop(struct array *); | |
73 | |
74 void | |
75 array_unqueue(struct array *); | |
76 | |
77 void | |
78 array_iremove(struct array *, int); | |
62 | 79 |
134 | 80 void |
81 array_premove(struct array *, const void *); | |
82 | |
83 int | |
84 array_iswap(struct array *, int, int); | |
85 | |
86 int | |
87 array_pswap(struct array *, const void *, const void *); | |
88 | |
89 void | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
90 array_map(const struct array *, array_map_t, void *); |
134 | 91 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
92 void |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
93 array_sort(struct array *, array_cmp_t); |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
94 |
134 | 95 int |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
96 array_find(const struct array *, array_cmp_t, void *, void *); |
134 | 97 |
136 | 98 void * |
99 array_first(const struct array *); | |
100 | |
101 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
102 array_get(const struct array *, int); |
136 | 103 |
104 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
105 array_last(const struct array *); |
136 | 106 |
134 | 107 void |
108 array_clear(struct array *); | |
109 | |
110 void | |
111 array_free(struct array *); | |
165
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
112 |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
113 void * |
970e491d93cb
Add _trim function to realloc to the needed size
David Demelier <markand@malikania.fr>
parents:
164
diff
changeset
|
114 array_trim(struct array *); |
136 | 115 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
116 #define ARRAY_FOREACH(a, var, i) \ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
117 for (i = 0, (var) = array_first((a)); \ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
118 i < (a)->length; \ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
119 (var) = array_get(a, ++i)) |
62 | 120 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
121 #ifdef __cplusplus |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
122 } |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
123 #endif |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
124 |
62 | 125 #endif /* _ARRAY_H_ */ |