graphicscomposition/openwfcompositionengine/common/src/owfarray.c
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicscomposition/openwfcompositionengine/common/src/owfarray.c	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,235 @@
+/* Copyright (c) 2009 The Khronos Group Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and/or associated documentation files (the
+ * "Materials"), to deal in the Materials without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Materials, and to
+ * permit persons to whom the Materials are furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ *
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ */
+
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "owfarray.h"
+#include "owftypes.h"
+#include "owfdebug.h"
+
+
+
+#define MINIMUM_CAPACITY    8
+
+/* switch debug messages off (1) or off (0) */
+#if 1
+#ifdef DPRINT
+#undef DPRINT
+#endif
+#define DPRINT(x)
+#endif
+
+#define SHIFT(a,f,t,n)        memmove(&(a)->items[t], \
+                                    &(a)->items[f], \
+                                    (n) * sizeof(OWF_ARRAY_ITEM))
+
+
+void
+OWF_Array_Initialize(OWF_ARRAY* array)
+{
+    OWF_ASSERT(array);
+
+    memset(array, 0, sizeof(OWF_ARRAY));
+}
+
+void
+OWF_Array_Reset(OWF_ARRAY* array)
+{
+    OWF_ASSERT(array);
+
+    array->length = 0;
+    memset(array->items, 0, sizeof(OWF_ARRAY_ITEM) * array->capacity);
+
+}
+
+void
+OWF_Array_Destroy(OWF_ARRAY* array)
+{
+    OWF_ASSERT(array);
+
+    free(array->items);
+    OWF_Array_Initialize(array);
+}
+
+static OWFboolean
+OWF_Array_Enlarge(OWF_ARRAY* array)
+{
+    OWF_ARRAY_ITEM*         temp        = NULL;
+    OWFint                  newcapacity = 0;
+
+    OWF_ASSERT(array);
+
+    DPRINT(("OWF_Array_Enlarge\n"));
+    DPRINT(("  capacity = %d, length = %d\n", array->capacity, array->length));
+
+    /*
+    newcapacity = MAX(MINIMUM_CAPACITY,
+                      array->capacity + (array->capacity >> 1));
+    */
+    newcapacity = MAX(MINIMUM_CAPACITY, 2 * array->capacity);
+
+    temp = (OWF_ARRAY_ITEM*) realloc(array->items,
+                                     sizeof(OWF_ARRAY_ITEM) * newcapacity);
+
+    if (!temp)
+    {
+        return OWF_FALSE;
+    }
+
+    DPRINT(("  new capacity = %d\n", newcapacity));
+
+    array->items = temp;
+    array->capacity = newcapacity;
+
+    return OWF_TRUE;
+}
+
+OWFboolean
+OWF_Array_AppendItem(OWF_ARRAY* array,
+                      OWF_ARRAY_ITEM item)
+{
+    OWF_ASSERT(array);
+
+    DPRINT(("OWF_Array_AppendItem\n"));
+
+    if (array->length >= array->capacity)
+    {
+        if (!OWF_Array_Enlarge(array))
+        {
+            return OWF_FALSE;
+        }
+    }
+
+    DPRINT(("  item[%d] is now %p\n", array->length, item));
+
+    array->items[array->length] = item;
+    ++array->length;
+
+    return OWF_TRUE;
+}
+
+OWFboolean
+OWF_Array_InsertItem(OWF_ARRAY*    array,
+                     OWFint position,
+                     OWF_ARRAY_ITEM item)
+{
+    OWF_ASSERT(array);
+
+    DPRINT(("bounds check\n"));
+
+    /* check bounds */
+    if (position < 0 || position > array->length)
+    {
+        return OWF_FALSE;
+    }
+
+    DPRINT(("enlarge\n"));
+
+    if (array->length >= array->capacity)
+    {
+        if (!OWF_Array_Enlarge(array))
+        {
+            return OWF_FALSE;
+        }
+    }
+
+    DPRINT(("new capacity = %d\n", array->capacity));
+
+    /* shift forward (obs! memmove because src & dst overlap) */
+    SHIFT(array, position, position + 1, array->length - position);
+
+    DPRINT(("  item[%d] is now %p\n", array->length, item));
+
+    /* put */
+    array->items[position] = item;
+    ++array->length;
+
+    return OWF_TRUE;
+}
+
+OWF_ARRAY_ITEM
+OWF_Array_RemoveItem(OWF_ARRAY* array,
+                     OWF_ARRAY_ITEM item)
+{
+    OWFint                    ii = 0;
+    OWF_ARRAY_ITEM            result = NULL;
+
+    OWF_ASSERT(array);
+
+    for (ii = 0; ii < array->length; ii++)
+    {
+        if (array->items[ii] == item)
+        {
+            result = OWF_Array_RemoveItemAt(array, ii);
+            break;
+        }
+    }
+    return result;
+}
+
+OWF_ARRAY_ITEM
+OWF_Array_RemoveItemAt(OWF_ARRAY* array,
+                          OWFint position)
+{
+    OWF_ARRAY_ITEM            result;
+
+    OWF_ASSERT(array);
+
+    /* check bounds */
+    if (position < 0 || position >= array->length)
+    {
+        return NULL;
+    }
+
+    --array->length;
+    result = array->items[position];
+    SHIFT(array, position + 1, position, array->length - position);
+
+    return result;
+}
+
+OWF_ARRAY_ITEM
+OWF_Array_GetItemAt(OWF_ARRAY* array,
+                    OWFint position)
+{
+    OWF_ASSERT(array);
+
+    if (position < 0 || position >= array->length)
+    {
+        return NULL;
+    }
+
+    return array->items[position];
+}
+
+#ifdef __cplusplus
+}
+#endif
+