First public contribution.
1 /* Copyright (c) 2009 The Khronos Group Inc.
3 * Permission is hereby granted, free of charge, to any person obtaining a
4 * copy of this software and/or associated documentation files (the
5 * "Materials"), to deal in the Materials without restriction, including
6 * without limitation the rights to use, copy, modify, merge, publish,
7 * distribute, sublicense, and/or sell copies of the Materials, and to
8 * permit persons to whom the Materials are furnished to do so, subject to
9 * the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Materials.
14 * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20 * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
39 #define MINIMUM_CAPACITY 8
41 /* switch debug messages off (1) or off (0) */
49 #define SHIFT(a,f,t,n) memmove(&(a)->items[t], \
51 (n) * sizeof(OWF_ARRAY_ITEM))
55 OWF_Array_Initialize(OWF_ARRAY* array)
59 memset(array, 0, sizeof(OWF_ARRAY));
63 OWF_Array_Reset(OWF_ARRAY* array)
68 memset(array->items, 0, sizeof(OWF_ARRAY_ITEM) * array->capacity);
73 OWF_Array_Destroy(OWF_ARRAY* array)
78 OWF_Array_Initialize(array);
82 OWF_Array_Enlarge(OWF_ARRAY* array)
84 OWF_ARRAY_ITEM* temp = NULL;
85 OWFint newcapacity = 0;
89 DPRINT(("OWF_Array_Enlarge\n"));
90 DPRINT((" capacity = %d, length = %d\n", array->capacity, array->length));
93 newcapacity = MAX(MINIMUM_CAPACITY,
94 array->capacity + (array->capacity >> 1));
96 newcapacity = MAX(MINIMUM_CAPACITY, 2 * array->capacity);
98 temp = (OWF_ARRAY_ITEM*) realloc(array->items,
99 sizeof(OWF_ARRAY_ITEM) * newcapacity);
106 DPRINT((" new capacity = %d\n", newcapacity));
109 array->capacity = newcapacity;
115 OWF_Array_AppendItem(OWF_ARRAY* array,
120 DPRINT(("OWF_Array_AppendItem\n"));
122 if (array->length >= array->capacity)
124 if (!OWF_Array_Enlarge(array))
130 DPRINT((" item[%d] is now %p\n", array->length, item));
132 array->items[array->length] = item;
139 OWF_Array_InsertItem(OWF_ARRAY* array,
145 DPRINT(("bounds check\n"));
148 if (position < 0 || position > array->length)
153 DPRINT(("enlarge\n"));
155 if (array->length >= array->capacity)
157 if (!OWF_Array_Enlarge(array))
163 DPRINT(("new capacity = %d\n", array->capacity));
165 /* shift forward (obs! memmove because src & dst overlap) */
166 SHIFT(array, position, position + 1, array->length - position);
168 DPRINT((" item[%d] is now %p\n", array->length, item));
171 array->items[position] = item;
178 OWF_Array_RemoveItem(OWF_ARRAY* array,
182 OWF_ARRAY_ITEM result = NULL;
186 for (ii = 0; ii < array->length; ii++)
188 if (array->items[ii] == item)
190 result = OWF_Array_RemoveItemAt(array, ii);
198 OWF_Array_RemoveItemAt(OWF_ARRAY* array,
201 OWF_ARRAY_ITEM result;
206 if (position < 0 || position >= array->length)
212 result = array->items[position];
213 SHIFT(array, position + 1, position, array->length - position);
219 OWF_Array_GetItemAt(OWF_ARRAY* array,
224 if (position < 0 || position >= array->length)
229 return array->items[position];