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
;
38 _eglCreateArray(const char *name
, EGLint init_size
)
42 array
= calloc(1, sizeof(*array
));
45 array
->MaxSize
= (init_size
> 0) ? init_size
: 1;
46 if (!_eglGrowArray(array
)) {
57 * Destroy an array, optionally free the data.
60 _eglDestroyArray(_EGLArray
*array
, void (*free_cb
)(void *))
64 for (i
= 0; i
< array
->Size
; i
++)
65 free_cb(array
->Elements
[i
]);
67 free(array
->Elements
);
73 * Append a element to an array.
76 _eglAppendArray(_EGLArray
*array
, void *elem
)
78 if (array
->Size
>= array
->MaxSize
&& !_eglGrowArray(array
))
81 array
->Elements
[array
->Size
++] = elem
;
86 * Find in an array for the given element.
89 _eglFindArray(_EGLArray
*array
, void *elem
)
96 for (i
= 0; i
< array
->Size
; i
++)
97 if (array
->Elements
[i
] == elem
)
104 * Filter an array and return the filtered data. The returned data pointer
108 _eglFilterArray(_EGLArray
*array
, EGLint
*size
,
109 _EGLArrayForEach filter
, void *filter_data
)
119 data
= malloc(array
->Size
* sizeof(array
->Elements
[0]));
124 for (i
= 0; i
< array
->Size
; i
++) {
125 if (filter(array
->Elements
[i
], filter_data
))
126 data
[count
++] = array
->Elements
[i
];
130 memcpy(data
, array
->Elements
, array
->Size
* sizeof(array
->Elements
[0]));
140 * Flatten an array by converting array elements into another form and store
144 _eglFlattenArray(_EGLArray
*array
, void *buffer
, EGLint elem_size
, EGLint size
,
145 _EGLArrayForEach flatten
)
152 count
= (size
< array
->Size
) ? size
: array
->Size
;
154 for (i
= 0; i
< count
; i
++)
155 flatten(array
->Elements
[i
],
156 (void *) ((char *) buffer
+ elem_size
* i
));