1 /**************************************************************************
3 * Copyright 2010 LunarG, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
37 * Grow the size of the array.
40 _eglGrowArray(_EGLArray *array)
45 new_size = array->MaxSize;
46 while (new_size <= array->Size)
49 elems = realloc(array->Elements, new_size * sizeof(array->Elements[0]));
51 _eglLog(_EGL_DEBUG, "failed to grow %s array to %d",
52 array->Name, new_size);
56 array->Elements = elems;
57 array->MaxSize = new_size;
67 _eglCreateArray(const char *name, EGLint init_size)
71 array = calloc(1, sizeof(*array));
74 array->MaxSize = (init_size > 0) ? init_size : 1;
75 if (!_eglGrowArray(array)) {
86 * Destroy an array, optionally free the data.
89 _eglDestroyArray(_EGLArray *array, void (*free_cb)(void *))
93 for (i = 0; i < array->Size; i++)
94 free_cb(array->Elements[i]);
96 free(array->Elements);
102 * Append a element to an array.
105 _eglAppendArray(_EGLArray *array, void *elem)
107 if (array->Size >= array->MaxSize && !_eglGrowArray(array))
110 array->Elements[array->Size++] = elem;
115 * Erase an element from an array.
118 _eglEraseArray(_EGLArray *array, EGLint i, void (*free_cb)(void *))
121 free_cb(array->Elements[i]);
122 if (i < array->Size - 1) {
123 memmove(&array->Elements[i], &array->Elements[i + 1],
124 (array->Size - i - 1) * sizeof(array->Elements[0]));
131 * Find in an array for the given element.
134 _eglFindArray(_EGLArray *array, void *elem)
141 for (i = 0; i < array->Size; i++)
142 if (array->Elements[i] == elem)
149 * Filter an array and return the number of filtered elements.
152 _eglFilterArray(_EGLArray *array, void **data, EGLint size,
153 _EGLArrayForEach filter, void *filter_data)
161 for (i = 0; i < array->Size; i++) {
162 if (filter(array->Elements[i], filter_data)) {
163 if (data && count < size)
164 data[count] = array->Elements[i];
167 if (data && count >= size)
173 count = (size < array->Size) ? size : array->Size;
174 memcpy(data, array->Elements, count * sizeof(array->Elements[0]));
186 * Flatten an array by converting array elements into another form and store
190 _eglFlattenArray(_EGLArray *array, void *buffer, EGLint elem_size, EGLint size,
191 _EGLArrayForEach flatten)
200 /* do not exceed buffer size */
203 for (i = 0; i < count; i++)
204 flatten(array->Elements[i],
205 (void *) ((char *) buffer + elem_size * i));