Mercurial > code
annotate array.h @ 163:66d317ba4b80
Added a new _qsort function for array and parray
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 03 Sep 2012 21:40:54 +0200 |
parents | 1558251b2cf2 |
children | 654f32079cdc |
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 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
28 #define ARRAY_AUTO 0, /* array grows automatically */ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
29 #define ARRAY_FIXED (1 << 0) /* fixed size length */ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
30 #define ARRAY_FASTREMOVE (1 << 1) /* use last object when removing */ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
31 #define ARRAY_CLEARBITS (1 << 2) /* clear data when inserting/removing */ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
32 #define ARRAY_INSERTSAFE (1 << 3) /* insertion must have valid indexes */ |
62 | 33 |
34 struct array { | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
35 int flags; /* (ro) array flags (default AUTO) */ |
148 | 36 void *data; /* (rw) array of data */ |
37 int length; /* (ro) number of element inside */ | |
38 size_t size; /* (ro) current buffer size (allocated memory) */ | |
39 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
|
40 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
|
41 |
92 | 42 /* 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
|
43 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
|
44 void * (*realloc)(void *, size_t); |
62 | 45 }; |
46 | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
47 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
|
48 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
|
49 |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
50 #ifdef __cplusplus |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
51 extern "C" { |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
52 #endif |
62 | 53 |
134 | 54 int |
55 array_init(struct array *, size_t); | |
56 | |
57 void | |
58 array_set(struct array *, const char *, ...); | |
59 | |
60 int | |
61 array_push(struct array *, const void *); | |
62 | |
63 int | |
64 array_insert(struct array *, const void *, int); | |
65 | |
66 int | |
67 array_append(struct array *, const void *); | |
68 | |
69 void | |
70 array_pop(struct array *); | |
71 | |
72 void | |
73 array_unqueue(struct array *); | |
74 | |
75 void | |
76 array_iremove(struct array *, int); | |
62 | 77 |
134 | 78 void |
79 array_premove(struct array *, const void *); | |
80 | |
81 int | |
82 array_iswap(struct array *, int, int); | |
83 | |
84 int | |
85 array_pswap(struct array *, 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 array_map(const struct array *, array_map_t, void *); |
134 | 89 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
90 void |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
91 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
|
92 |
134 | 93 int |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
94 array_find(const struct array *, array_cmp_t, void *, void *); |
134 | 95 |
136 | 96 void * |
97 array_first(const struct array *); | |
98 | |
99 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
100 array_get(const struct array *, int); |
136 | 101 |
102 void * | |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
103 array_last(const struct array *); |
136 | 104 |
134 | 105 void |
106 array_clear(struct array *); | |
107 | |
108 void | |
109 array_free(struct array *); | |
136 | 110 |
163
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
111 #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
|
112 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
|
113 i < (a)->length; \ |
66d317ba4b80
Added a new _qsort function for array and parray
David Demelier <markand@malikania.fr>
parents:
148
diff
changeset
|
114 (var) = array_get(a, ++i)) |
62 | 115 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
116 #ifdef __cplusplus |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
117 } |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
118 #endif |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
119 |
62 | 120 #endif /* _ARRAY_H_ */ |