API revamp to shorten GValueArray structure.
authorTim Janik <timj@gtk.org>
Thu, 13 Dec 2001 07:06:56 +0000 (07:06 +0000)
committerTim Janik <timj@src.gnome.org>
Thu, 13 Dec 2001 07:06:56 +0000 (07:06 +0000)
Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>

        * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
        structure.

14 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-12
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/glib/tmpl/patterns.sgml
docs/reference/glib/tmpl/unicode.sgml
docs/reference/gobject/tmpl/gobject-unused.sgml
docs/reference/gobject/tmpl/gtype.sgml
glib/gbsearcharray.c
glib/gbsearcharray.h

index 9fb967d..833b236 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index 9fb967d..833b236 100644 (file)
@@ -1,3 +1,8 @@
+Thu Dec 13 05:37:51 2001  Tim Janik  <timj@gtk.org>
+
+       * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray
+       structure.
+
 2001-12-12  Matthias Clasen  <matthiasc@poet.de>
 
        This fixes #60543:
index cba7870..c253747 100644 (file)
@@ -36,10 +36,6 @@ A <structname>GPatternSpec</structname> is the 'compiled' form of a pattern.
 This structure is opaque and its fields cannot be accessed directly.
 </para>
 
-@match_type: 
-@pattern_length: 
-@pattern: 
-@pattern_reversed: 
 
 <!-- ##### FUNCTION g_pattern_spec_new ##### -->
 <para>
index 0223c3f..d0c43ad 100644 (file)
@@ -46,9 +46,8 @@ A type which can hold any UTF-16 character code.
 
 </para>
 
-@Returns: 
-<!-- # Unused Parameters # -->
 @charset: 
+@Returns: 
 
 
 <!-- ##### FUNCTION g_unichar_validate ##### -->
index b04f4a8..70a7e1e 100644 (file)
@@ -46,62 +46,6 @@ Parameter Specifications
 
 @parent_instance: 
 
-<!-- ##### ENUM GTypeFundamentals ##### -->
-<para>
-The predefined identifiers of the reserved fundamental types.
-</para>
-
-@G_TYPE_INVALID:               Usually a return value indicating an error.
-@G_TYPE_NONE:                  A synonym for the "void" type in C.
-@G_TYPE_INTERFACE:             Root type of all interface types.
-@G_TYPE_CHAR:                  Identifier for the built-in type "gchar".
-@G_TYPE_UCHAR:                         Identifier for the built-in type "guchar".
-@G_TYPE_BOOLEAN:               Identifier for the built-in type "gboolean".
-@G_TYPE_INT:                   Identifier for the built-in type "gint".
-@G_TYPE_UINT:                  Identifier for the built-in type "guint".
-@G_TYPE_LONG:                  Identifier for the built-in type "glong".
-@G_TYPE_ULONG:                         Identifier for the built-in type "gulong".
-@G_TYPE_INT64: 
-@G_TYPE_UINT64: 
-@G_TYPE_ENUM:                  Identifier for the "#GEnum" type.
-@G_TYPE_FLAGS:                         Identifier for the "#GFlags" type.
-@G_TYPE_FLOAT:                         Identifier for the built-in type "gfloat".
-@G_TYPE_DOUBLE:                Identifier for the built-in type "gdouble".
-@G_TYPE_STRING:                Identifier for a pointer to a null-terminated string "gchar*".
-@G_TYPE_POINTER:               Identifier for anonymous pointers "void*".
-@G_TYPE_BOXED:                         Identifier for the "#GBoxed" type.
-@G_TYPE_PARAM:                         Identifier for the "#GParam" type.
-@G_TYPE_OBJECT:                Identifier for the "#GObject" type.
-@G_TYPE_RESERVED_BSE_FIRST:    First fundamental type ID reserved for BSE.
-@G_TYPE_RESERVED_BSE_LAST:     Last fundamental type ID reserved for BSE.
-@G_TYPE_RESERVED_LAST_FUNDAMENTAL: 
-@G_TYPE_CONSTANT_TYPES: 
-@G_TYPE_CLOSURE: 
-@G_TYPE_VALUE: 
-@G_TYPE_VALUE_ARRAY: 
-@G_TYPE_GSTRING: 
-@G_TYPE_PARAM_CHAR: 
-@G_TYPE_PARAM_UCHAR: 
-@G_TYPE_PARAM_BOOLEAN: 
-@G_TYPE_PARAM_INT: 
-@G_TYPE_PARAM_UINT: 
-@G_TYPE_PARAM_LONG: 
-@G_TYPE_PARAM_ULONG: 
-@G_TYPE_PARAM_INT64: 
-@G_TYPE_PARAM_UINT64: 
-@G_TYPE_PARAM_UNICHAR: 
-@G_TYPE_PARAM_ENUM: 
-@G_TYPE_PARAM_FLAGS: 
-@G_TYPE_PARAM_FLOAT: 
-@G_TYPE_PARAM_DOUBLE: 
-@G_TYPE_PARAM_STRING: 
-@G_TYPE_PARAM_PARAM: 
-@G_TYPE_PARAM_BOXED: 
-@G_TYPE_PARAM_POINTER: 
-@G_TYPE_PARAM_VALUE_ARRAY: 
-@G_TYPE_PARAM_CLOSURE: 
-@G_TYPE_PARAM_OBJECT: 
-
 <!-- ##### MACRO G_IS_PARAM_SPEC_CLOSURE ##### -->
 <para>
 
index 9e85621..fe6ce1c 100644 (file)
@@ -161,6 +161,62 @@ interfaces and C++ classes containing only pure virtual functions.
 @type: A #GType value.
 
 
+<!-- ##### ENUM GTypeFundamentals ##### -->
+<para>
+The predefined identifiers of the reserved fundamental types.
+</para>
+
+@G_TYPE_INVALID:               Usually a return value indicating an error.
+@G_TYPE_NONE:                  A synonym for the "void" type in C.
+@G_TYPE_INTERFACE:             Root type of all interface types.
+@G_TYPE_CHAR:                  Identifier for the built-in type "gchar".
+@G_TYPE_UCHAR:                         Identifier for the built-in type "guchar".
+@G_TYPE_BOOLEAN:               Identifier for the built-in type "gboolean".
+@G_TYPE_INT:                   Identifier for the built-in type "gint".
+@G_TYPE_UINT:                  Identifier for the built-in type "guint".
+@G_TYPE_LONG:                  Identifier for the built-in type "glong".
+@G_TYPE_ULONG:                         Identifier for the built-in type "gulong".
+@G_TYPE_INT64: 
+@G_TYPE_UINT64: 
+@G_TYPE_ENUM:                  Identifier for the "#GEnum" type.
+@G_TYPE_FLAGS:                         Identifier for the "#GFlags" type.
+@G_TYPE_FLOAT:                         Identifier for the built-in type "gfloat".
+@G_TYPE_DOUBLE:                Identifier for the built-in type "gdouble".
+@G_TYPE_STRING:                Identifier for a pointer to a null-terminated string "gchar*".
+@G_TYPE_POINTER:               Identifier for anonymous pointers "void*".
+@G_TYPE_BOXED:                         Identifier for the "#GBoxed" type.
+@G_TYPE_PARAM:                         Identifier for the "#GParam" type.
+@G_TYPE_OBJECT:                Identifier for the "#GObject" type.
+@G_TYPE_RESERVED_BSE_FIRST:    First fundamental type ID reserved for BSE.
+@G_TYPE_RESERVED_BSE_LAST:     Last fundamental type ID reserved for BSE.
+@G_TYPE_RESERVED_LAST_FUNDAMENTAL: 
+@G_TYPE_CONSTANT_TYPES: 
+@G_TYPE_CLOSURE: 
+@G_TYPE_VALUE: 
+@G_TYPE_VALUE_ARRAY: 
+@G_TYPE_GSTRING: 
+@G_TYPE_PARAM_CHAR: 
+@G_TYPE_PARAM_UCHAR: 
+@G_TYPE_PARAM_BOOLEAN: 
+@G_TYPE_PARAM_INT: 
+@G_TYPE_PARAM_UINT: 
+@G_TYPE_PARAM_LONG: 
+@G_TYPE_PARAM_ULONG: 
+@G_TYPE_PARAM_INT64: 
+@G_TYPE_PARAM_UINT64: 
+@G_TYPE_PARAM_UNICHAR: 
+@G_TYPE_PARAM_ENUM: 
+@G_TYPE_PARAM_FLAGS: 
+@G_TYPE_PARAM_FLOAT: 
+@G_TYPE_PARAM_DOUBLE: 
+@G_TYPE_PARAM_STRING: 
+@G_TYPE_PARAM_PARAM: 
+@G_TYPE_PARAM_BOXED: 
+@G_TYPE_PARAM_POINTER: 
+@G_TYPE_PARAM_VALUE_ARRAY: 
+@G_TYPE_PARAM_CLOSURE: 
+@G_TYPE_PARAM_OBJECT: 
+
 <!-- ##### STRUCT GTypeInterface ##### -->
 <para>
 An opaque structure used as the base of all interface types.
index 3343e84..ee8b3a1 100644 (file)
 
 
 /* --- structures --- */
+static inline guint
+upper_power2 (guint number)
+{
+#ifdef DISABLE_MEM_POOLS
+  return number;
+#else  /* !DISABLE_MEM_POOLS */
+  return number ? 1 << g_bit_storage (number - 1) : 0;
+#endif /* !DISABLE_MEM_POOLS */
+}
+
 GBSearchArray*
-g_bsearch_array_new (guint16             sizeof_node,
-                    GBSearchCompareFunc node_cmp_func,
-                    GBSearchArrayFlags  flags)
+g_bsearch_array_new (GBSearchConfig *bconfig)
 {
   GBSearchArray *barray;
+  guint size;
 
-  g_return_val_if_fail (sizeof_node > 0, NULL);
-  g_return_val_if_fail (node_cmp_func != NULL, NULL);
+  g_return_val_if_fail (bconfig != NULL, NULL);
 
-  barray = g_new0 (GBSearchArray, 1);
-  barray->sizeof_node = sizeof_node;
-  barray->cmp_nodes = node_cmp_func;
-  barray->flags = flags;
+  size = sizeof (GBSearchArray) + bconfig->sizeof_node;
+  if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
+    size = upper_power2 (size);
+  barray = g_malloc0 (size);
+  barray->n_nodes = 0;
 
   return barray;
 }
 
 void
-g_bsearch_array_destroy (GBSearchArray *barray)
+g_bsearch_array_destroy (GBSearchArray  *barray,
+                        GBSearchConfig *bconfig)
 {
   g_return_if_fail (barray != NULL);
 
-#if 0
-  if (barray->destroy_node)
-    while (barray->n_nodes)
-      {
-       barray->destroy_node (((guint8*) barray->nodes) + (barray->n_nodes - 1) * barray->sizeof_node);
-       barray->n_nodes--;
-      }
-#endif
-  g_free (barray->nodes);
   g_free (barray);
 }
 
-static inline guint
-upper_power2 (guint number)
-{
-#ifdef DISABLE_MEM_POOLS
-  return number;
-#else  /* !DISABLE_MEM_POOLS */
-  return number ? 1 << g_bit_storage (number - 1) : 0;
-#endif /* !DISABLE_MEM_POOLS */
-}
-
-static inline gpointer
-bsearch_array_insert (GBSearchArray *barray,
-                     gconstpointer  key_node,
-                     gboolean       replace)
+static inline GBSearchArray*
+bsearch_array_insert (GBSearchArray  *barray,
+                     GBSearchConfig *bconfig,
+                     gconstpointer   key_node,
+                     gboolean        replace)
 {
   gint sizeof_node;
   guint8 *check;
   
-  sizeof_node = barray->sizeof_node;
+  sizeof_node = bconfig->sizeof_node;
   if (barray->n_nodes == 0)
     {
-      guint new_size = barray->sizeof_node;
+      guint new_size = sizeof (GBSearchArray) + sizeof_node;
       
-      if (barray->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
+      if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
        new_size = upper_power2 (new_size);
-      barray->nodes = g_realloc (barray->nodes, new_size);
+      barray = g_realloc (barray, new_size);
       barray->n_nodes = 1;
-      check = barray->nodes;
+      check = G_BSEARCH_ARRAY_NODES (barray);
     }
   else
     {
-      GBSearchCompareFunc cmp_nodes = barray->cmp_nodes;
+      GBSearchCompareFunc cmp_nodes = bconfig->cmp_nodes;
       guint n_nodes = barray->n_nodes;
-      guint8 *nodes = barray->nodes;
+      guint8 *nodes = G_BSEARCH_ARRAY_NODES (barray);
       gint cmp;
       guint i;
       
@@ -112,102 +104,102 @@ bsearch_array_insert (GBSearchArray *barray,
          else /* if (cmp == 0) */
            {
              if (replace)
-               {
-#if 0
-                 if (barray->destroy_node)
-                   barray->destroy_node (check);
-#endif
-                 memcpy (check, key_node, sizeof_node);
-               }
-             return check;
+               memcpy (check, key_node, sizeof_node);
+             return barray;
            }
        }
       while (n_nodes);
       /* grow */
       if (cmp > 0)
        check += sizeof_node;
-      i = (check - ((guint8*) barray->nodes)) / sizeof_node;
+      i = (check - ((guint8*) G_BSEARCH_ARRAY_NODES (barray))) / sizeof_node;
       n_nodes = barray->n_nodes++;
-      if (barray->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
+      if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
        {
-         guint new_size = upper_power2 (barray->n_nodes * sizeof_node);
-         guint old_size = upper_power2 (n_nodes * sizeof_node);
+         guint new_size = upper_power2 (sizeof (GBSearchArray) + barray->n_nodes * sizeof_node);
+         guint old_size = upper_power2 (sizeof (GBSearchArray) + n_nodes * sizeof_node);
          
          if (new_size != old_size)
-           barray->nodes = g_realloc (barray->nodes, new_size);
+           barray = g_realloc (barray, new_size);
        }
       else
-       barray->nodes = g_realloc (barray->nodes, barray->n_nodes * sizeof_node);
-      check = ((guint8*) barray->nodes) + i * sizeof_node;
+       barray = g_realloc (barray, sizeof (GBSearchArray) + barray->n_nodes * sizeof_node);
+      check = ((guint8*) G_BSEARCH_ARRAY_NODES (barray)) + i * sizeof_node;
       g_memmove (check + sizeof_node, check, (n_nodes - i) * sizeof_node);
     }
   memcpy (check, key_node, sizeof_node);
   
-  return check;
+  return barray;
 }
 
-gpointer
-g_bsearch_array_insert (GBSearchArray *barray,
-                       gconstpointer  key_node,
-                       gboolean       replace_existing)
+GBSearchArray*
+g_bsearch_array_insert (GBSearchArray  *barray,
+                       GBSearchConfig *bconfig,
+                       gconstpointer   key_node,
+                       gboolean        replace_existing)
 {
   g_return_val_if_fail (barray != NULL, NULL);
-  g_return_val_if_fail (key_node != NULL, NULL);
+  g_return_val_if_fail (bconfig != NULL, barray);
+  g_return_val_if_fail (key_node != NULL, barray);
   
-  return bsearch_array_insert (barray, key_node, replace_existing);
+  return bsearch_array_insert (barray, bconfig, key_node, replace_existing);
 }
 
-void
-g_bsearch_array_remove_node (GBSearchArray *barray,
+GBSearchArray*
+g_bsearch_array_remove_node (GBSearchArray  *barray,
+                            GBSearchConfig *bconfig,
                             gpointer       _node_in_array)
 {
   guint8 *nodes, *bound, *node_in_array = _node_in_array;
   guint old_size;
   
-  g_return_if_fail (barray != NULL);
+  g_return_val_if_fail (barray != NULL, NULL);
+  g_return_val_if_fail (bconfig != NULL, barray);
   
-  nodes = barray->nodes;
-  old_size = barray->sizeof_node;
+  nodes = G_BSEARCH_ARRAY_NODES (barray);
+  old_size = bconfig->sizeof_node;
   old_size *= barray->n_nodes;  /* beware of int widths */
   bound = nodes + old_size;
   
-  g_return_if_fail (node_in_array >= nodes && node_in_array < bound);
+  g_return_val_if_fail (node_in_array >= nodes && node_in_array < bound, barray);
 
-#if 0
-  if (barray->destroy_node)
-    barray->destroy_node (node_in_array);
-#endif
-  bound -= barray->sizeof_node;
+  bound -= bconfig->sizeof_node;
   barray->n_nodes -= 1;
-  g_memmove (node_in_array, node_in_array + barray->sizeof_node, (bound - node_in_array) / barray->sizeof_node);
+  g_memmove (node_in_array, node_in_array + bconfig->sizeof_node, (bound - node_in_array) / bconfig->sizeof_node);
   
-  if ((barray->flags & G_BSEARCH_ARRAY_DEFER_SHRINK) == 0)
+  if ((bconfig->flags & G_BSEARCH_ARRAY_DEFER_SHRINK) == 0)
     {
-      guint new_size = bound - nodes;   /* old_size - barray->sizeof_node */
+      guint new_size = bound - nodes;   /* old_size - bconfig->sizeof_node */
       
-      if (barray->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
+      if (bconfig->flags & G_BSEARCH_ARRAY_ALIGN_POWER2)
        {
-         new_size = upper_power2 (new_size);
-         old_size = upper_power2 (old_size);
+         new_size = upper_power2 (sizeof (GBSearchArray) + new_size);
+         old_size = upper_power2 (sizeof (GBSearchArray) + old_size);
          if (old_size != new_size)
-           barray->nodes = g_realloc (barray->nodes, new_size);
+           barray = g_realloc (barray, new_size);
        }
       else
-       barray->nodes = g_realloc (barray->nodes, new_size);
+       barray = g_realloc (barray, sizeof (GBSearchArray) + new_size);
     }
+  return barray;
 }
 
-void
-g_bsearch_array_remove (GBSearchArray *barray,
-                       gconstpointer  key_node)
+GBSearchArray*
+g_bsearch_array_remove (GBSearchArray  *barray,
+                       GBSearchConfig *bconfig,
+                       gconstpointer   key_node)
 {
   gpointer node_in_array;
   
-  g_return_if_fail (barray != NULL);
+  g_return_val_if_fail (barray != NULL, NULL);
+  g_return_val_if_fail (bconfig != NULL, barray);
   
-  node_in_array = g_bsearch_array_lookup (barray, key_node);
+  node_in_array = g_bsearch_array_lookup (barray, bconfig, key_node);
   if (!node_in_array)
-    g_warning (G_STRLOC ": unable to remove unexistant node");
+    {
+      g_warning (G_STRLOC ": unable to remove unexistant node");
+      return barray;
+    }
   else
-    g_bsearch_array_remove_node (barray, node_in_array);
+    return g_bsearch_array_remove_node (barray, bconfig, node_in_array);
 }
index 61b90b4..f7c443a 100644 (file)
@@ -33,7 +33,8 @@ G_BEGIN_DECLS
 
 
 /* --- typedefs --- */
-typedef struct _GBSearchArray         GBSearchArray;
+typedef union  _GBSearchArray         GBSearchArray;
+typedef struct _GBSearchConfig        GBSearchConfig;
 typedef gint  (*GBSearchCompareFunc) (gconstpointer bsearch_node1,
                                      gconstpointer bsearch_node2);
 typedef enum
@@ -44,57 +45,69 @@ typedef enum
 
 
 /* --- structures --- */
-struct _GBSearchArray
+struct _GBSearchConfig
 {
+  guint16             sizeof_node;
   GBSearchCompareFunc cmp_nodes;
   guint16            flags;
-  guint16             sizeof_node;
-  guint               n_nodes;
-  gpointer            nodes;
+};
+union _GBSearchArray
+{
+  guint    n_nodes;
+  gpointer alignment_dummy1;
+  glong    alignment_dummy2;
+  gdouble  alignment_dummy3;
 };
 
 
 /* --- prototypes --- */
-GBSearchArray* g_bsearch_array_new             (guint16             sizeof_node,
-                                                GBSearchCompareFunc node_cmp_func,
-                                                GBSearchArrayFlags  flags);
-void           g_bsearch_array_destroy         (GBSearchArray  *barray);
-gpointer       g_bsearch_array_insert          (GBSearchArray  *barray,
+GBSearchArray* g_bsearch_array_new             (GBSearchConfig *bconfig);
+void           g_bsearch_array_destroy         (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig);
+GBSearchArray* g_bsearch_array_insert          (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig,
                                                 gconstpointer   key_node,
                                                 gboolean        replace_existing);
-void           g_bsearch_array_remove          (GBSearchArray  *barray,
+GBSearchArray* g_bsearch_array_remove          (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig,
                                                 gconstpointer   key_node);
-void           g_bsearch_array_remove_node     (GBSearchArray  *barray,
+GBSearchArray* g_bsearch_array_remove_node     (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig,
                                                 gpointer        node_in_array);
 G_INLINE_FUNC
 gpointer       g_bsearch_array_lookup          (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig,
                                                 gconstpointer   key_node);
 G_INLINE_FUNC
 gpointer       g_bsearch_array_get_nth         (GBSearchArray  *barray,
+                                                 GBSearchConfig *bconfig,
                                                 guint           n);
 G_INLINE_FUNC
 guint          g_bsearch_array_get_index       (GBSearchArray  *barray,
+                                                GBSearchConfig *bconfig,
                                                 gpointer        node_in_array);
 
 
 /* initialization of static arrays */
-#define        G_STATIC_BSEARCH_ARRAY_INIT(sizeof_node, cmp_nodes, flags) \
-  { (cmp_nodes), (flags), (sizeof_node), 0, NULL }
+#define        G_STATIC_BCONFIG(sizeof_node, cmp_nodes, flags) \
+  { (sizeof_node), (cmp_nodes), (flags), }
 
 
 /* --- implementation details --- */
+#define G_BSEARCH_ARRAY_NODES(barray)    ((gpointer) (((guint8*) (barray)) + sizeof (GBSearchArray)))
 #if defined (G_CAN_INLINE) || defined (__G_BSEARCHARRAY_C__)
 G_INLINE_FUNC gpointer
-g_bsearch_array_lookup (GBSearchArray *barray,
-                       gconstpointer  key_node)
+g_bsearch_array_lookup (GBSearchArray  *barray,
+                       GBSearchConfig *bconfig,
+                       gconstpointer   key_node)
 {
   if (barray->n_nodes > 0)
     {
-      GBSearchCompareFunc cmp_nodes = barray->cmp_nodes;
-      gint sizeof_node = barray->sizeof_node;
+      GBSearchCompareFunc cmp_nodes = bconfig->cmp_nodes;
+      gint sizeof_node = bconfig->sizeof_node;
       guint n_nodes = barray->n_nodes;
-      guint8 *nodes = (guint8 *) barray->nodes;
-      
+      guint8 *nodes = G_BSEARCH_ARRAY_NODES (barray);
+
       nodes -= sizeof_node;
       do
        {
@@ -121,26 +134,28 @@ g_bsearch_array_lookup (GBSearchArray *barray,
   return NULL;
 }
 G_INLINE_FUNC gpointer
-g_bsearch_array_get_nth (GBSearchArray *barray,
-                        guint          n)
+g_bsearch_array_get_nth (GBSearchArray  *barray,
+                        GBSearchConfig *bconfig,
+                        guint           n)
 {
   if (n < barray->n_nodes)
     {
-      guint8 *nodes = (guint8*) barray->nodes;
+      guint8 *nodes = (guint8*) G_BSEARCH_ARRAY_NODES (barray);
 
-      return nodes + n * barray->sizeof_node;
+      return nodes + n * bconfig->sizeof_node;
     }
   else
     return NULL;
 }
 G_INLINE_FUNC
 guint
-g_bsearch_array_get_index (GBSearchArray *barray,
-                          gpointer       node_in_array)
+g_bsearch_array_get_index (GBSearchArray  *barray,
+                          GBSearchConfig *bconfig,
+                          gpointer        node_in_array)
 {
-  guint distance = ((guint8*) node_in_array) - ((guint8*) barray->nodes);
+  guint distance = ((guint8*) node_in_array) - ((guint8*) G_BSEARCH_ARRAY_NODES (barray));
 
-  distance /= barray->sizeof_node;
+  distance /= bconfig->sizeof_node;
 
   return MIN (distance, barray->n_nodes);
 }