diff options
author | Tim Janik <timj@gtk.org> | 2000-10-25 20:36:35 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 2000-10-25 20:36:35 +0000 |
commit | ee23c09e83d06a0d131ebd234c132f1c3602c019 (patch) | |
tree | b24f3cdd0758fed1a483abc645936ebae963b898 /glib | |
parent | b13320f78ba3b484a26b6430152b35aaac24ff10 (diff) | |
download | glib-ee23c09e83d06a0d131ebd234c132f1c3602c019.tar.gz |
added newly added gobject/ headers.
Tue Oct 24 22:09:14 2000 Tim Janik <timj@gtk.org>
* glib-object.h: added newly added gobject/ headers.
* gmesage.c: print g_message() output to stderr instead of stdout.
Wed Oct 25 20:27:02 2000 Tim Janik <timj@gtk.org>
* gtype.c (g_type_free_instance): for the moment, freeing object
structures will fill their memory portion with 0xAA. there's a
FIXME there, remove this line at a later point.
Tue Oct 24 23:10:26 2000 Tim Janik <timj@gtk.org>
* glib-genmarshal.1:
* glib-genmarshal.c: added publically installed marshaller generator.
* gtype.h: added G_TYPE_INSTANCE_GET_INTERFACE() to retrive a certain
interface VTable from instances.
Mon Oct 23 08:28:15 2000 Tim Janik <timj@gtk.org>
* gobject.[hc]: new functions for closure maintenance:
(g_object_watch_closure): maintain validity of the object and
the closure for objects that are used as data part of a closure.
(g_cclosure_new_object): convenience function to create C closures
that have an object as data argument.
(g_closure_new_object): convenience function to create closures
that have an object as data argument.
* gclosure.[hc]: implementation of GClosure mechanism.
a closure is basically an encapsulation of a callback function
and its environment. ideally, most places supporting callback
functions will simply take a GClosure* pointer and thus unify
callback environments wrg destroy notification etc.
GClosure provides destroy notifiers for arbitrary data pointers,
reference counting, invalidation notification (it can be invalidated
which is merely a deactivate state) and a marshallinbg abstraction.
GCClosure is also provided in these files, they present a specialized
GClosure implementation for C language callbacks.
* genum.c: macro cleanups.
* gboxed.[hc]: new files, for boxed type abstraction.
(g_boxed_copy): copy a boxed structure
(g_boxed_free): free a boxed structure
(g_value_set_boxed):
(g_value_get_boxed): standard GValue functions for boxed types
(g_boxed_type_register_static): convenience function for easy
introduction of new G_TYPE_BOXED derivatives.
* gparam.[hc]: introduced g_param_type_register_static(), a short hand
for creation of new GParamSpec derived types.
* gtype.[hc]: many fixes, introduced ability to flag individual
type nodes as ABSTRACT upon registration, added value_peek_pointer()
to the value table to peek at GValue contents as a pointer for types
that support this. fixed up GValue checks.
* gvalue.[hc]: added g_value_fits_pointer() and g_value_get_as_pointer()
to peek at the value contents as pointer.
* *.[hc]: adaptions to type macro fixes and changes in the type
registration API.
* many const corrections over the place.
Sat Oct 21 02:49:56 2000 Tim Janik <timj@gtk.org>
* gtype.c (g_type_conforms_to): this function basically behaves like
and is_a check, except that it _additionally_ features interfaces
for instantiatable types. enforce this in the second branch as well
(`type' conforms_to `type') even if `type' is not an interface type.
Fri Oct 20 15:31:04 2000 Tim Janik <timj@gtk.org>
* gvaluetypes.[hc]: added G_TYPE_POINTER implementation from jrb.
* gtype.[hc]:
* gobject.c:
* gvaluetypes.c: added GTypeValueTable.value_peek_pointer and
suitable implementations of this for G_TYPE_STRING, G_TYPE_OBJECT
and G_TYPE_POINTER.
Mon Aug 21 04:13:37 2000 Tim Janik <timj@gtk.org>
* gbsearcharray.[hc]: long standing needed generic implementation
of a binary searchable, sorted and dynamically sized array.
Diffstat (limited to 'glib')
-rw-r--r-- | glib/gbsearcharray.c | 164 | ||||
-rw-r--r-- | glib/gbsearcharray.h | 134 | ||||
-rw-r--r-- | glib/glib-object.h | 11 | ||||
-rw-r--r-- | glib/gmessages.c | 2 |
4 files changed, 306 insertions, 5 deletions
diff --git a/glib/gbsearcharray.c b/glib/gbsearcharray.c new file mode 100644 index 000000000..9aa1f450f --- /dev/null +++ b/glib/gbsearcharray.c @@ -0,0 +1,164 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Tim Janik + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + */ +#define G_IMPLEMENT_INLINES 1 +#define __G_BSEARCHARRAY_C__ +#include "gbsearcharray.h" + +#include <string.h> + + +/* --- structures --- */ +static inline guint +upper_power2 (guint number) +{ + return number ? 1 << g_bit_storage (number - 1) : 0; +} + +static inline gpointer +bsearch_array_insert (GBSearchArray *barray, + gconstpointer key_node, + gboolean replace) +{ + gint sizeof_node; + guint8 *check; + + sizeof_node = barray->sizeof_node; + if (barray->n_nodes == 0) + { + guint new_size = barray->sizeof_node; + + if (barray->flags & G_BSEARCH_ALIGN_POWER2) + new_size = upper_power2 (new_size); + barray->nodes = g_realloc (barray->nodes, new_size); + barray->n_nodes = 1; + check = barray->nodes; + replace = TRUE; + } + else + { + GBSearchCompareFunc cmp_func = barray->cmp_func; + guint n_nodes = barray->n_nodes; + guint8 *nodes = barray->nodes; + gint cmp; + guint i; + + nodes -= sizeof_node; + do + { + i = (n_nodes + 1) >> 1; + check = nodes + i * sizeof_node; + cmp = cmp_func (key_node, check); + if (cmp > 0) + { + n_nodes -= i; + nodes = check; + } + else if (cmp < 0) + n_nodes = i - 1; + else /* if (cmp == 0) */ + goto SKIP_GROW; + } + while (n_nodes); + /* grow */ + if (cmp > 0) + check += sizeof_node; + i = (check - ((guint8*) barray->nodes)) / sizeof_node; + n_nodes = barray->n_nodes++; + if (barray->flags & G_BSEARCH_ALIGN_POWER2) + { + guint new_size = upper_power2 (barray->n_nodes * sizeof_node); + guint old_size = upper_power2 (n_nodes * sizeof_node); + + if (new_size != old_size) + barray->nodes = g_realloc (barray->nodes, new_size); + } + else + barray->nodes = g_realloc (barray->nodes, barray->n_nodes * sizeof_node); + check = barray->nodes + i * sizeof_node; + g_memmove (check + sizeof_node, check, (n_nodes - i) * sizeof_node); + replace = TRUE; + SKIP_GROW: + } + if (replace) + memcpy (check, key_node, sizeof_node); + + return check; +} + +gpointer +g_bsearch_array_insert (GBSearchArray *barray, + gconstpointer key_node, + gboolean replace_existing) +{ + g_return_val_if_fail (barray != NULL, NULL); + g_return_val_if_fail (key_node != NULL, NULL); + + return bsearch_array_insert (barray, key_node, replace_existing); +} + +void +g_bsearch_array_remove_node (GBSearchArray *barray, + gpointer _node_in_array) +{ + guint8 *nodes, *bound, *node_in_array = _node_in_array; + guint old_size; + + g_return_if_fail (barray != NULL); + + nodes = barray->nodes; + old_size = barray->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); + + bound -= barray->sizeof_node; + barray->n_nodes -= 1; + g_memmove (node_in_array, node_in_array + barray->sizeof_node, (bound - node_in_array) / barray->sizeof_node); + + if ((barray->flags & G_BSEARCH_DEFER_SHRINK) == 0) + { + guint new_size = bound - nodes; /* old_size - barray->sizeof_node */ + + if (barray->flags & G_BSEARCH_ALIGN_POWER2) + { + new_size = upper_power2 (new_size); + old_size = upper_power2 (old_size); + if (old_size != new_size) + barray->nodes = g_realloc (barray->nodes, new_size); + } + else + barray->nodes = g_realloc (barray->nodes, new_size); + } +} + +void +g_bsearch_array_remove (GBSearchArray *barray, + gconstpointer key_node) +{ + gpointer node_in_array; + + g_return_if_fail (barray != NULL); + + node_in_array = g_bsearch_array_lookup (barray, key_node); + if (!node_in_array) + g_warning (G_STRLOC ": unable to remove unexistant node"); + else + g_bsearch_array_remove_node (barray, node_in_array); +} diff --git a/glib/gbsearcharray.h b/glib/gbsearcharray.h new file mode 100644 index 000000000..aadaac828 --- /dev/null +++ b/glib/gbsearcharray.h @@ -0,0 +1,134 @@ +/* GObject - GLib Type, Object, Parameter and Signal Library + * Copyright (C) 2000 Tim Janik + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307, USA. + * + * gbsearcharray.h: binary searchable sorted array maintenance + */ +#ifndef __G_BSEARCH_ARRAY_H__ +#define __G_BSEARCH_ARRAY_H__ + +#include <gobject/gtype.h> + + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +/* helper macro to avoid signed overflow for value comparisions */ +#define G_BSEARCH_ARRAY_CMP(v1,v2) ((v1) < (v2) ? -1 : (v1) > (v2) ? 1 : 0) + + +/* --- typedefs --- */ +typedef struct _GBSearchArray GBSearchArray; +typedef gint (*GBSearchCompareFunc) (gconstpointer bsearch_node1, + gconstpointer bsearch_node2); +typedef enum +{ + G_BSEARCH_ALIGN_POWER2 = 1 << 0, + G_BSEARCH_DEFER_SHRINK = 1 << 1 +} GBSearchFlags; + + +/* --- structures --- */ +struct _GBSearchArray +{ + GBSearchCompareFunc cmp_func; + guint16 sizeof_node; + guint16 flags; + guint n_nodes; + gpointer nodes; +}; + + +/* --- prototypes --- */ +gpointer g_bsearch_array_insert (GBSearchArray *barray, + gconstpointer key_node, + gboolean replace_existing); +void g_bsearch_array_remove (GBSearchArray *barray, + gconstpointer key_node); +void g_bsearch_array_remove_node (GBSearchArray *barray, + gpointer node_in_array); +G_INLINE_FUNC +gpointer g_bsearch_array_lookup (GBSearchArray *barray, + gconstpointer key_node); +G_INLINE_FUNC +gpointer g_bsearch_array_get_nth (GBSearchArray *barray, + guint n); + + +/* --- implementation details --- */ +#if defined (G_CAN_INLINE) || defined (__G_BSEARCHARRAY_C__) +G_INLINE_FUNC gpointer +g_bsearch_array_lookup (GBSearchArray *barray, + gconstpointer key_node) +{ + if (barray->n_nodes > 0) + { + GBSearchCompareFunc cmp_func = barray->cmp_func; + gint sizeof_node = barray->sizeof_node; + guint n_nodes = barray->n_nodes; + guint8 *nodes = barray->nodes; + + nodes -= sizeof_node; + do + { + guint8 *check; + guint i; + register gint cmp; + + i = (n_nodes + 1) >> 1; + check = nodes + i * sizeof_node; + cmp = cmp_func (key_node, check); + if (cmp == 0) + return check; + else if (cmp > 0) + { + n_nodes -= i; + nodes = check; + } + else /* if (cmp < 0) */ + n_nodes = i - 1; + } + while (n_nodes); + } + + return NULL; +} +G_INLINE_FUNC gpointer +g_bsearch_array_get_nth (GBSearchArray *barray, + guint n) +{ + if (n < barray->n_nodes) + { + guint8 *nodes = barray->nodes; + + return nodes + n * barray->sizeof_node; + } + else + return NULL; +} +#endif /* G_CAN_INLINE && __G_BSEARCHARRAY_C__ */ + + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __G_BSEARCH_ARRAY_H__ */ diff --git a/glib/glib-object.h b/glib/glib-object.h index 9336241d0..92d9bf92f 100644 --- a/glib/glib-object.h +++ b/glib/glib-object.h @@ -20,13 +20,16 @@ #define __GLIB_GOBJECT_H__ /* topmost include file for GObject header files */ -#include <gobject/gtype.h> +#include <gobject/gboxed.h> +#include <gobject/gbsearcharray.h> #include <gobject/genums.h> -#include <gobject/gvalue.h> -#include <gobject/gvaluetypes.h> +#include <gobject/gobject.h> #include <gobject/gparam.h> #include <gobject/gparamspecs.h> -#include <gobject/gobject.h> +#include <gobject/gsignal.h> +#include <gobject/gtype.h> +#include <gobject/gvalue.h> +#include <gobject/gvaluetypes.h> #endif /* __GLIB_GOBJECT_H__ */ diff --git a/glib/gmessages.c b/glib/gmessages.c index 32b63e198..1685f86f8 100644 --- a/glib/gmessages.c +++ b/glib/gmessages.c @@ -471,7 +471,7 @@ g_log_default_handler (const gchar *log_domain, */ fd = stdout; #else - fd = (log_level >= G_LOG_LEVEL_MESSAGE) ? 1 : 2; + fd = (log_level > G_LOG_LEVEL_MESSAGE) ? 1 : 2; #endif g_mutex_lock (g_messages_lock); |