From 67ab6118e9a1762aec61fdad9eeba77a4d3ab3d5 Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Thu, 13 Dec 2001 07:06:56 +0000 Subject: [PATCH] API revamp to shorten GValueArray structure. Thu Dec 13 05:37:51 2001 Tim Janik * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray structure. --- ChangeLog | 5 + ChangeLog.pre-2-0 | 5 + ChangeLog.pre-2-10 | 5 + ChangeLog.pre-2-12 | 5 + ChangeLog.pre-2-2 | 5 + ChangeLog.pre-2-4 | 5 + ChangeLog.pre-2-6 | 5 + ChangeLog.pre-2-8 | 5 + docs/reference/glib/tmpl/patterns.sgml | 4 - docs/reference/glib/tmpl/unicode.sgml | 3 +- .../gobject/tmpl/gobject-unused.sgml | 56 ------ docs/reference/gobject/tmpl/gtype.sgml | 56 ++++++ glib/gbsearcharray.c | 180 +++++++++--------- glib/gbsearcharray.h | 71 ++++--- 14 files changed, 226 insertions(+), 184 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9fb967d2a..833b2363f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 9fb967d2a..833b2363f 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,8 @@ +Thu Dec 13 05:37:51 2001 Tim Janik + + * glib/gbsearcharray.[hc]: API revamp to shorten GValueArray + structure. + 2001-12-12 Matthias Clasen This fixes #60543: diff --git a/docs/reference/glib/tmpl/patterns.sgml b/docs/reference/glib/tmpl/patterns.sgml index cba7870cf..c25374707 100644 --- a/docs/reference/glib/tmpl/patterns.sgml +++ b/docs/reference/glib/tmpl/patterns.sgml @@ -36,10 +36,6 @@ A GPatternSpec is the 'compiled' form of a pattern. This structure is opaque and its fields cannot be accessed directly. -@match_type: -@pattern_length: -@pattern: -@pattern_reversed: diff --git a/docs/reference/glib/tmpl/unicode.sgml b/docs/reference/glib/tmpl/unicode.sgml index 0223c3f92..d0c43ad5e 100644 --- a/docs/reference/glib/tmpl/unicode.sgml +++ b/docs/reference/glib/tmpl/unicode.sgml @@ -46,9 +46,8 @@ A type which can hold any UTF-16 character code. -@Returns: - @charset: +@Returns: diff --git a/docs/reference/gobject/tmpl/gobject-unused.sgml b/docs/reference/gobject/tmpl/gobject-unused.sgml index b04f4a89e..70a7e1e14 100644 --- a/docs/reference/gobject/tmpl/gobject-unused.sgml +++ b/docs/reference/gobject/tmpl/gobject-unused.sgml @@ -46,62 +46,6 @@ Parameter Specifications @parent_instance: - - -The predefined identifiers of the reserved fundamental types. - - -@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: - diff --git a/docs/reference/gobject/tmpl/gtype.sgml b/docs/reference/gobject/tmpl/gtype.sgml index 9e85621c0..fe6ce1ca3 100644 --- a/docs/reference/gobject/tmpl/gtype.sgml +++ b/docs/reference/gobject/tmpl/gtype.sgml @@ -161,6 +161,62 @@ interfaces and C++ classes containing only pure virtual functions. @type: A #GType value. + + +The predefined identifiers of the reserved fundamental types. + + +@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: + An opaque structure used as the base of all interface types. diff --git a/glib/gbsearcharray.c b/glib/gbsearcharray.c index 3343e8477..ee8b3a118 100644 --- a/glib/gbsearcharray.c +++ b/glib/gbsearcharray.c @@ -24,41 +24,6 @@ /* --- structures --- */ -GBSearchArray* -g_bsearch_array_new (guint16 sizeof_node, - GBSearchCompareFunc node_cmp_func, - GBSearchArrayFlags flags) -{ - GBSearchArray *barray; - - g_return_val_if_fail (sizeof_node > 0, NULL); - g_return_val_if_fail (node_cmp_func != NULL, NULL); - - barray = g_new0 (GBSearchArray, 1); - barray->sizeof_node = sizeof_node; - barray->cmp_nodes = node_cmp_func; - barray->flags = flags; - - return barray; -} - -void -g_bsearch_array_destroy (GBSearchArray *barray) -{ - 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) { @@ -69,30 +34,57 @@ upper_power2 (guint number) #endif /* !DISABLE_MEM_POOLS */ } -static inline gpointer -bsearch_array_insert (GBSearchArray *barray, - gconstpointer key_node, - gboolean replace) +GBSearchArray* +g_bsearch_array_new (GBSearchConfig *bconfig) +{ + GBSearchArray *barray; + guint size; + + g_return_val_if_fail (bconfig != NULL, NULL); + + 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, + GBSearchConfig *bconfig) +{ + g_return_if_fail (barray != NULL); + + g_free (barray); +} + +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); } diff --git a/glib/gbsearcharray.h b/glib/gbsearcharray.h index 61b90b42b..f7c443aab 100644 --- a/glib/gbsearcharray.h +++ b/glib/gbsearcharray.h @@ -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); }