1 krisbash 1.1 #include "ptrarray.h"
2 #include <stdlib.h>
3
4 int PtrArray_Construct(
5 PtrArray* self,
6 size_t capacity,
7 void (MI_MAIN_CALL *destructor)(void*))
8 {
9 if (capacity == 0)
10 capacity = 1;
11
12 self->size = 0;
13 self->capacity = capacity;
14 self->destructor = destructor;
15
16 self->data = (void**)PAL_Malloc(self->capacity * sizeof(void*));
17
18 if (!self->data)
19 return -1;
20
21 return 0;
22 krisbash 1.1 }
23
24 void PtrArray_Destruct(
25 PtrArray* self)
26 {
27 if (self->destructor)
28 {
29 size_t i;
30
31 for (i = 0; i < self->size; i++)
32 (*self->destructor)(self->data[i]);
33
34 self->destructor = NULL;
35 }
36
37 if (self->data)
38 {
39 PAL_Free(self->data);
40 self->data = NULL;
41 }
42 }
43 krisbash 1.1
44 _Use_decl_annotations_
45 int PtrArray_Append(
46 PtrArray* self,
47 void* element)
48 {
49 if (self->size == self->capacity)
50 {
51 void** _newdata;
52 size_t _oldcapacity = self->capacity;
53 size_t _oldsize = _oldcapacity * sizeof(void*);
54 size_t _newcapacity = _oldcapacity << 1;
55 size_t _newsize = _oldsize << 1;
56
57 /* size_t overflowed */
58 if ((_newcapacity <= _oldcapacity) || (_newsize <= _oldsize))
59 return -1;
60
61 _newdata = (void**)PAL_Realloc(self->data, _newsize);
62 if (!_newdata)
63 {
64 krisbash 1.1 PtrArray_Destruct(self);
65 return -1;
66 }
67 else
68 {
69 self->capacity = _newcapacity;
70 self->data = _newdata;
71 }
72 }
73
74 self->data[self->size++] = element;
75 return 0;
76 }
|