revert between 56095 -> 55830 in arch
[AROS.git] / workbench / libs / mesa / src / egl / main / eglarray.c
blob3ccc8a649f0e545bacb53ddbe4f5b63eb9c98401
1 /**************************************************************************
3 * Copyright 2010 LunarG, Inc.
4 * All Rights Reserved.
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
16 * of the Software.
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 **************************************************************************/
29 #include <stdlib.h>
30 #include <string.h>
32 #include "egllog.h"
33 #include "eglarray.h"
36 /**
37 * Grow the size of the array.
39 static EGLBoolean
40 _eglGrowArray(_EGLArray *array)
42 EGLint new_size;
43 void **elems;
45 new_size = array->MaxSize;
46 while (new_size <= array->Size)
47 new_size *= 2;
49 elems = realloc(array->Elements, new_size * sizeof(array->Elements[0]));
50 if (!elems) {
51 _eglLog(_EGL_DEBUG, "failed to grow %s array to %d",
52 array->Name, new_size);
53 return EGL_FALSE;
56 array->Elements = elems;
57 array->MaxSize = new_size;
59 return EGL_TRUE;
63 /**
64 * Create an array.
66 _EGLArray *
67 _eglCreateArray(const char *name, EGLint init_size)
69 _EGLArray *array;
71 array = calloc(1, sizeof(*array));
72 if (array) {
73 array->Name = name;
74 array->MaxSize = (init_size > 0) ? init_size : 1;
75 if (!_eglGrowArray(array)) {
76 free(array);
77 array = NULL;
81 return array;
85 /**
86 * Destroy an array, optionally free the data.
88 void
89 _eglDestroyArray(_EGLArray *array, void (*free_cb)(void *))
91 if (free_cb) {
92 EGLint i;
93 for (i = 0; i < array->Size; i++)
94 free_cb(array->Elements[i]);
96 free(array->Elements);
97 free(array);
102 * Append a element to an array.
104 void
105 _eglAppendArray(_EGLArray *array, void *elem)
107 if (array->Size >= array->MaxSize && !_eglGrowArray(array))
108 return;
110 array->Elements[array->Size++] = elem;
115 * Erase an element from an array.
117 void
118 _eglEraseArray(_EGLArray *array, EGLint i, void (*free_cb)(void *))
120 if (free_cb)
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]));
126 array->Size--;
131 * Find in an array for the given element.
133 void *
134 _eglFindArray(_EGLArray *array, void *elem)
136 EGLint i;
138 if (!array)
139 return NULL;
141 for (i = 0; i < array->Size; i++)
142 if (array->Elements[i] == elem)
143 return elem;
144 return NULL;
149 * Filter an array and return the number of filtered elements.
151 EGLint
152 _eglFilterArray(_EGLArray *array, void **data, EGLint size,
153 _EGLArrayForEach filter, void *filter_data)
155 EGLint count = 0, i;
157 if (!array)
158 return 0;
160 if (filter) {
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];
165 count++;
167 if (data && count >= size)
168 break;
171 else {
172 if (data) {
173 count = (size < array->Size) ? size : array->Size;
174 memcpy(data, array->Elements, count * sizeof(array->Elements[0]));
176 else {
177 count = array->Size;
181 return count;
186 * Flatten an array by converting array elements into another form and store
187 * them in a buffer.
189 EGLint
190 _eglFlattenArray(_EGLArray *array, void *buffer, EGLint elem_size, EGLint size,
191 _EGLArrayForEach flatten)
193 EGLint i, count;
195 if (!array)
196 return 0;
198 count = array->Size;
199 if (buffer) {
200 /* do not exceed buffer size */
201 if (count > size)
202 count = size;
203 for (i = 0; i < count; i++)
204 flatten(array->Elements[i],
205 (void *) ((char *) buffer + elem_size * i));
208 return count;