1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/graphics/graphicscomposition/openwfcompositionengine/common/src/owfarray.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,235 @@
1.4 +/* Copyright (c) 2009 The Khronos Group Inc.
1.5 + *
1.6 + * Permission is hereby granted, free of charge, to any person obtaining a
1.7 + * copy of this software and/or associated documentation files (the
1.8 + * "Materials"), to deal in the Materials without restriction, including
1.9 + * without limitation the rights to use, copy, modify, merge, publish,
1.10 + * distribute, sublicense, and/or sell copies of the Materials, and to
1.11 + * permit persons to whom the Materials are furnished to do so, subject to
1.12 + * the following conditions:
1.13 + *
1.14 + * The above copyright notice and this permission notice shall be included
1.15 + * in all copies or substantial portions of the Materials.
1.16 + *
1.17 + * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
1.18 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1.19 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
1.20 + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
1.21 + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
1.22 + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
1.23 + * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
1.24 + */
1.25 +
1.26 +
1.27 +#ifdef __cplusplus
1.28 +extern "C"
1.29 +{
1.30 +#endif
1.31 +
1.32 +
1.33 +#include <string.h>
1.34 +#include <stdlib.h>
1.35 +
1.36 +#include "owfarray.h"
1.37 +#include "owftypes.h"
1.38 +#include "owfdebug.h"
1.39 +
1.40 +
1.41 +
1.42 +#define MINIMUM_CAPACITY 8
1.43 +
1.44 +/* switch debug messages off (1) or off (0) */
1.45 +#if 1
1.46 +#ifdef DPRINT
1.47 +#undef DPRINT
1.48 +#endif
1.49 +#define DPRINT(x)
1.50 +#endif
1.51 +
1.52 +#define SHIFT(a,f,t,n) memmove(&(a)->items[t], \
1.53 + &(a)->items[f], \
1.54 + (n) * sizeof(OWF_ARRAY_ITEM))
1.55 +
1.56 +
1.57 +void
1.58 +OWF_Array_Initialize(OWF_ARRAY* array)
1.59 +{
1.60 + OWF_ASSERT(array);
1.61 +
1.62 + memset(array, 0, sizeof(OWF_ARRAY));
1.63 +}
1.64 +
1.65 +void
1.66 +OWF_Array_Reset(OWF_ARRAY* array)
1.67 +{
1.68 + OWF_ASSERT(array);
1.69 +
1.70 + array->length = 0;
1.71 + memset(array->items, 0, sizeof(OWF_ARRAY_ITEM) * array->capacity);
1.72 +
1.73 +}
1.74 +
1.75 +void
1.76 +OWF_Array_Destroy(OWF_ARRAY* array)
1.77 +{
1.78 + OWF_ASSERT(array);
1.79 +
1.80 + free(array->items);
1.81 + OWF_Array_Initialize(array);
1.82 +}
1.83 +
1.84 +static OWFboolean
1.85 +OWF_Array_Enlarge(OWF_ARRAY* array)
1.86 +{
1.87 + OWF_ARRAY_ITEM* temp = NULL;
1.88 + OWFint newcapacity = 0;
1.89 +
1.90 + OWF_ASSERT(array);
1.91 +
1.92 + DPRINT(("OWF_Array_Enlarge\n"));
1.93 + DPRINT((" capacity = %d, length = %d\n", array->capacity, array->length));
1.94 +
1.95 + /*
1.96 + newcapacity = MAX(MINIMUM_CAPACITY,
1.97 + array->capacity + (array->capacity >> 1));
1.98 + */
1.99 + newcapacity = MAX(MINIMUM_CAPACITY, 2 * array->capacity);
1.100 +
1.101 + temp = (OWF_ARRAY_ITEM*) realloc(array->items,
1.102 + sizeof(OWF_ARRAY_ITEM) * newcapacity);
1.103 +
1.104 + if (!temp)
1.105 + {
1.106 + return OWF_FALSE;
1.107 + }
1.108 +
1.109 + DPRINT((" new capacity = %d\n", newcapacity));
1.110 +
1.111 + array->items = temp;
1.112 + array->capacity = newcapacity;
1.113 +
1.114 + return OWF_TRUE;
1.115 +}
1.116 +
1.117 +OWFboolean
1.118 +OWF_Array_AppendItem(OWF_ARRAY* array,
1.119 + OWF_ARRAY_ITEM item)
1.120 +{
1.121 + OWF_ASSERT(array);
1.122 +
1.123 + DPRINT(("OWF_Array_AppendItem\n"));
1.124 +
1.125 + if (array->length >= array->capacity)
1.126 + {
1.127 + if (!OWF_Array_Enlarge(array))
1.128 + {
1.129 + return OWF_FALSE;
1.130 + }
1.131 + }
1.132 +
1.133 + DPRINT((" item[%d] is now %p\n", array->length, item));
1.134 +
1.135 + array->items[array->length] = item;
1.136 + ++array->length;
1.137 +
1.138 + return OWF_TRUE;
1.139 +}
1.140 +
1.141 +OWFboolean
1.142 +OWF_Array_InsertItem(OWF_ARRAY* array,
1.143 + OWFint position,
1.144 + OWF_ARRAY_ITEM item)
1.145 +{
1.146 + OWF_ASSERT(array);
1.147 +
1.148 + DPRINT(("bounds check\n"));
1.149 +
1.150 + /* check bounds */
1.151 + if (position < 0 || position > array->length)
1.152 + {
1.153 + return OWF_FALSE;
1.154 + }
1.155 +
1.156 + DPRINT(("enlarge\n"));
1.157 +
1.158 + if (array->length >= array->capacity)
1.159 + {
1.160 + if (!OWF_Array_Enlarge(array))
1.161 + {
1.162 + return OWF_FALSE;
1.163 + }
1.164 + }
1.165 +
1.166 + DPRINT(("new capacity = %d\n", array->capacity));
1.167 +
1.168 + /* shift forward (obs! memmove because src & dst overlap) */
1.169 + SHIFT(array, position, position + 1, array->length - position);
1.170 +
1.171 + DPRINT((" item[%d] is now %p\n", array->length, item));
1.172 +
1.173 + /* put */
1.174 + array->items[position] = item;
1.175 + ++array->length;
1.176 +
1.177 + return OWF_TRUE;
1.178 +}
1.179 +
1.180 +OWF_ARRAY_ITEM
1.181 +OWF_Array_RemoveItem(OWF_ARRAY* array,
1.182 + OWF_ARRAY_ITEM item)
1.183 +{
1.184 + OWFint ii = 0;
1.185 + OWF_ARRAY_ITEM result = NULL;
1.186 +
1.187 + OWF_ASSERT(array);
1.188 +
1.189 + for (ii = 0; ii < array->length; ii++)
1.190 + {
1.191 + if (array->items[ii] == item)
1.192 + {
1.193 + result = OWF_Array_RemoveItemAt(array, ii);
1.194 + break;
1.195 + }
1.196 + }
1.197 + return result;
1.198 +}
1.199 +
1.200 +OWF_ARRAY_ITEM
1.201 +OWF_Array_RemoveItemAt(OWF_ARRAY* array,
1.202 + OWFint position)
1.203 +{
1.204 + OWF_ARRAY_ITEM result;
1.205 +
1.206 + OWF_ASSERT(array);
1.207 +
1.208 + /* check bounds */
1.209 + if (position < 0 || position >= array->length)
1.210 + {
1.211 + return NULL;
1.212 + }
1.213 +
1.214 + --array->length;
1.215 + result = array->items[position];
1.216 + SHIFT(array, position + 1, position, array->length - position);
1.217 +
1.218 + return result;
1.219 +}
1.220 +
1.221 +OWF_ARRAY_ITEM
1.222 +OWF_Array_GetItemAt(OWF_ARRAY* array,
1.223 + OWFint position)
1.224 +{
1.225 + OWF_ASSERT(array);
1.226 +
1.227 + if (position < 0 || position >= array->length)
1.228 + {
1.229 + return NULL;
1.230 + }
1.231 +
1.232 + return array->items[position];
1.233 +}
1.234 +
1.235 +#ifdef __cplusplus
1.236 +}
1.237 +#endif
1.238 +