2 * Copyright (c) 1999-2002, Darren Hiebert
4 * This source code is released for free distribution under the terms of the
5 * GNU General Public License version 2 or (at your option) any later version.
7 * This module contains functions managing resizable pointer arrays.
13 #include "general.h" /* must always come first */
30 ptrArrayDeleteFunc deleteFunc
;
34 * FUNCTION DEFINITIONS
37 extern ptrArray
*ptrArrayNew (ptrArrayDeleteFunc deleteFunc
)
39 ptrArray
* const result
= xMalloc (1, ptrArray
);
42 result
->array
= xMalloc (result
->max
, void*);
43 result
->deleteFunc
= deleteFunc
;
47 extern void ptrArrayAdd (ptrArray
*const current
, void *ptr
)
49 Assert (current
!= NULL
);
50 if (current
->count
== current
->max
)
53 current
->array
= xRealloc (current
->array
, current
->max
, void*);
55 current
->array
[current
->count
++] = ptr
;
58 extern void ptrArrayRemoveLast (ptrArray
*const current
)
60 Assert (current
!= NULL
);
61 Assert (current
->count
> 0);
65 /* Combine array `from' into `current', deleting `from' */
66 extern void ptrArrayCombine (ptrArray
*const current
, ptrArray
*const from
)
69 Assert (current
!= NULL
);
70 Assert (from
!= NULL
);
71 for (i
= 0 ; i
< from
->count
; ++i
)
72 ptrArrayAdd (current
, from
->array
[i
]);
74 ptrArrayDelete (from
);
77 extern unsigned int ptrArrayCount (const ptrArray
*const current
)
79 Assert (current
!= NULL
);
80 return current
->count
;
83 extern void* ptrArrayItem (const ptrArray
*const current
, const unsigned int indx
)
85 Assert (current
!= NULL
);
86 return current
->array
[indx
];
89 extern void* ptrArrayLast (const ptrArray
*const current
)
91 Assert (current
!= NULL
);
92 Assert (current
->count
> 0);
93 return current
->array
[current
->count
- 1];
96 extern void ptrArrayClear (ptrArray
*const current
)
98 Assert (current
!= NULL
);
99 if (current
->deleteFunc
)
102 for (i
= 0 ; i
< current
->count
; ++i
)
103 current
->deleteFunc (current
->array
[i
]);
108 extern void ptrArrayDelete (ptrArray
*const current
)
112 ptrArrayClear (current
);
113 eFree (current
->array
);
118 extern bool ptrArrayHasTest (const ptrArray
*const current
,
119 bool (*test
)(const void *ptr
, void *userData
),
124 Assert (current
!= NULL
);
125 for (i
= 0 ; ! result
&& i
< current
->count
; ++i
)
126 result
= (*test
)(current
->array
[i
], userData
);
130 static bool ptrEq (const void *ptr
, void *userData
)
132 return (ptr
== userData
);
135 extern bool ptrArrayHas (const ptrArray
*const current
, void *ptr
)
137 return ptrArrayHasTest (current
, ptrEq
, ptr
);
140 extern void ptrArrayReverse (const ptrArray
*const current
)
145 Assert (current
!= NULL
);
146 for (i
= 0, j
= current
->count
- 1 ; i
< (current
->count
/ 2); ++i
, --j
)
148 tmp
= current
->array
[i
];
149 current
->array
[i
] = current
->array
[j
];
150 current
->array
[j
] = tmp
;
154 extern void ptrArrayDeleteItem (ptrArray
* const current
, unsigned int indx
)
156 void *ptr
= current
->array
[indx
];
158 if (current
->deleteFunc
)
159 current
->deleteFunc (ptr
);
161 memmove (current
->array
+ indx
, current
->array
+ indx
+ 1,
162 (current
->count
- indx
) * sizeof (*current
->array
));
166 static int (*ptrArraySortCompareVar
)(const void *, const void *);
168 static int ptrArraySortCompare(const void *a0
, const void *b0
)
170 void *const *a
= (void *const *)a0
;
171 void *const *b
= (void *const *)b0
;
173 return ptrArraySortCompareVar (*a
, *b
);
176 extern void ptrArraySort (ptrArray
*const current
, int (*compare
)(const void *, const void *))
178 ptrArraySortCompareVar
= compare
;
179 qsort (current
->array
, current
->count
, sizeof (void *), ptrArraySortCompare
);