Mercurial > code
annotate parray.h @ 156:8c7812fefe0f
Fix buf_cut
author | David Demelier <markand@malikania.fr> |
---|---|
date | Fri, 20 Jul 2012 13:31:58 +0200 |
parents | 1558251b2cf2 |
children | 66d317ba4b80 |
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 |
148 | 32 enum parray_flags { |
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 */ | |
147
535f12e0a5af
Add a flag to prevent insertions at out of bounds
David Demelier <markand@malikania.fr>
parents:
142
diff
changeset
|
36 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
|
37 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
|
38 }; |
62 | 39 |
40 struct parray { | |
148 | 41 enum parray_flags flags; /* (ro) array flags (default AUTO) */ |
42 void **data; /* (rw) array of data */ | |
43 int length; /* (ro) number of element inside */ | |
44 size_t size; /* (ro) current buffer size (allocated memory) */ | |
45 int bsize; /* (rw) block size (used when growing array) */ | |
92 | 46 |
47 /* Own allocation functions */ | |
48 void * (*malloc)(size_t); | |
49 void * (*realloc)(void *, size_t); | |
62 | 50 }; |
51 | |
142
e3cf5ac9a5aa
[p]array_insert now returns -1 or index of added element
David Demelier <markand@malikania.fr>
parents:
136
diff
changeset
|
52 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
|
53 typedef int (*parray_cmp_t)(void *, void *); |
62 | 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 * | |
98 parray_last(const struct parray *); | |
99 | |
100 void * | |
101 parray_index(const struct parray *, int); | |
102 | |
134 | 103 void |
104 parray_clear(struct parray *); | |
105 | |
106 void | |
107 parray_free(struct parray *); | |
62 | 108 |
117
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
109 #define PARRAY_FOREACH(a, o, i) \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
110 for (i = 0, o = (a)->data[i]; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
111 i < (a)->length; \ |
bbe86bdb55da
Update parray for a lot of things
David Demelier <markand@malikania.fr>
parents:
108
diff
changeset
|
112 ++i, o = (a)->data[i]) |
62 | 113 |
66 | 114 #ifdef __cplusplus |
115 } | |
116 #endif | |
117 | |
62 | 118 #endif /* _PARRAY_H_ */ |