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
));