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 number of filtered elements.
124 _eglFilterArray(_EGLArray
*array
, void **data
, EGLint size
,
125 _EGLArrayForEach filter
, void *filter_data
)
133 for (i
= 0; i
< array
->Size
; i
++) {
134 if (filter(array
->Elements
[i
], filter_data
)) {
135 if (data
&& count
< size
)
136 data
[count
] = array
->Elements
[i
];
139 if (data
&& count
>= size
)
145 count
= (size
< array
->Size
) ? size
: array
->Size
;
146 memcpy(data
, array
->Elements
, count
* sizeof(array
->Elements
[0]));
158 * Flatten an array by converting array elements into another form and store
162 _eglFlattenArray(_EGLArray
*array
, void *buffer
, EGLint elem_size
, EGLint size
,
163 _EGLArrayForEach flatten
)
172 /* do not exceed buffer size */
175 for (i
= 0; i
< count
; i
++)
176 flatten(array
->Elements
[i
],
177 (void *) ((char *) buffer
+ elem_size
* i
));