Mercurial > code
annotate array.h @ 147:535f12e0a5af
Add a flag to prevent insertions at out of bounds
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 11 May 2012 20:06:41 +0200 |
parents | e3cf5ac9a5aa |
children | 1558251b2cf2 |
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 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
24 #ifdef __cplusplus |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
25 extern "C" { |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
26 #endif |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
27 |
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
|
28 #ifndef ARRAY_DEFAULT_BSIZE |
62 | 29 #define ARRAY_DEFAULT_BSIZE 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
|
30 #endif |
62 | 31 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
32 enum { |
136 | 33 ARRAY_AUTO = 0, /* array grows automatically */ |
34 ARRAY_FIXED = (1 << 0), /* fixed size length */ | |
35 ARRAY_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
|
36 ARRAY_CLEARBITS = (1 << 2), /* clear data when inserting/removing */ |
535f12e0a5af
Add a flag to prevent insertions at out of bounds
David Demelier <markand@malikania.fr>
parents:
142
diff
changeset
|
37 ARRAY_INSERTSAFE = (1 << 3) /* insertion must have valid indexes */ |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
38 }; |
62 | 39 |
40 struct array { | |
136 | 41 int flags; /* (ro) array flags (default AUTO) */ |
135
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
42 void *data; /* (rw) array of data */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
43 int length; /* (ro) number of element inside */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
44 size_t size; /* (ro) current buffer size (allocated memory) */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
45 size_t unit; /* (ro) unit size (sizeof the object) */ |
07800b7af208
Huge cosmetic, no breakage
David Demelier <markand@malikania.fr>
parents:
134
diff
changeset
|
46 int bsize; /* (rw) block 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
|
47 |
92 | 48 /* 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
|
49 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
|
50 void * (*realloc)(void *, size_t); |
62 | 51 }; |
52 | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
53 typedef void (*array_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
|
54 typedef int (*array_cmp_t)(void *, void *); |
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 |
92 int | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
93 array_find(const struct array *, array_cmp_t, void *, void *); |
134 | 94 |
136 | 95 void * |
96 array_first(const struct array *); | |
97 | |
98 void * | |
99 array_last(const struct array *); | |
100 | |
101 void * | |
102 array_index(const struct array *, int); | |
103 | |
134 | 104 void |
105 array_clear(struct array *); | |
106 | |
107 void | |
108 array_free(struct array *); | |
136 | 109 |
134 | 110 #define ARRAY_FOREACH(a, var, i) \ |
136 | 111 for (i = 0, (var) = array_first((a)); \ |
134 | 112 i < (a)->length; \ |
136 | 113 (var) = array_index(a, ++i)) |
62 | 114 |
124
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
115 #ifdef __cplusplus |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
116 } |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
117 #endif |
5917096facb9
Use enum and add #ifdef __cplusplus
David Demelier <markand@malikania.fr>
parents:
118
diff
changeset
|
118 |
62 | 119 #endif /* _ARRAY_H_ */ |