9 * Grow the size of the array.
12 _eglGrowArray(_EGLArray
*array
)
17 new_size
= array
->MaxSize
;
18 while (new_size
<= array
->Size
)
21 elems
= realloc(array
->Elements
, new_size
* sizeof(array
->Elements
[0]));
23 _eglLog(_EGL_DEBUG
, "failed to grow %s array to %d",
24 array
->Name
, new_size
);
28 array
->Elements
= elems
;
29 array
->MaxSize
= new_size
;
39 _eglCreateArray(const char *name
, EGLint init_size
)
43 array
= calloc(1, sizeof(*array
));
46 array
->MaxSize
= (init_size
> 0) ? init_size
: 1;
47 if (!_eglGrowArray(array
)) {
58 * Destroy an array, optionally free the data.
61 _eglDestroyArray(_EGLArray
*array
, void (*free_cb
)(void *))
65 for (i
= 0; i
< array
->Size
; i
++)
66 free_cb(array
->Elements
[i
]);
68 free(array
->Elements
);
74 * Append a element to an array.
77 _eglAppendArray(_EGLArray
*array
, void *elem
)
79 if (array
->Size
>= array
->MaxSize
&& !_eglGrowArray(array
))
82 array
->Elements
[array
->Size
++] = elem
;
87 * Erase an element from an array.
90 _eglEraseArray(_EGLArray
*array
, EGLint i
, void (*free_cb
)(void *))
93 free_cb(array
->Elements
[i
]);
94 if (i
< array
->Size
- 1) {
95 memmove(&array
->Elements
[i
], &array
->Elements
[i
+ 1],
96 (array
->Size
- i
- 1) * sizeof(array
->Elements
[0]));
103 * Find in an array for the given element.
106 _eglFindArray(_EGLArray
*array
, void *elem
)
113 for (i
= 0; i
< array
->Size
; i
++)
114 if (array
->Elements
[i
] == elem
)
121 * Filter an array and return the filtered data. The returned data pointer
125 _eglFilterArray(_EGLArray
*array
, EGLint
*size
,
126 _EGLArrayForEach filter
, void *filter_data
)
136 data
= malloc(array
->Size
* sizeof(array
->Elements
[0]));
141 for (i
= 0; i
< array
->Size
; i
++) {
142 if (filter(array
->Elements
[i
], filter_data
))
143 data
[count
++] = array
->Elements
[i
];
147 memcpy(data
, array
->Elements
, array
->Size
* sizeof(array
->Elements
[0]));
157 * Flatten an array by converting array elements into another form and store
161 _eglFlattenArray(_EGLArray
*array
, void *buffer
, EGLint elem_size
, EGLint size
,
162 _EGLArrayForEach flatten
)
171 /* do not exceed buffer size */
174 for (i
= 0; i
< count
; i
++)
175 flatten(array
->Elements
[i
],
176 (void *) ((char *) buffer
+ elem_size
* i
));