summaryrefslogtreecommitdiff
path: root/gobject
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>2000-10-25 22:33:26 +0000
committerTim Janik <timj@src.gnome.org>2000-10-25 22:33:26 +0000
commit900d0ed069fe09201d0c58813d1560b6845cef1d (patch)
tree39ee33876ecf167fe9e74c9dc746862c392cd6e1 /gobject
parentee23c09e83d06a0d131ebd234c132f1c3602c019 (diff)
added g_value_set_static_string().
Thu Oct 26 00:30:27 2000 Tim Janik <timj@gtk.org> * gvaluetypes.[hc]: added g_value_set_static_string(). * gboxed.[hc]: const corrections. added g_value_set_static_boxed().
Diffstat (limited to 'gobject')
-rw-r--r--gobject/ChangeLog6
-rw-r--r--gobject/gboxed.c37
-rw-r--r--gobject/gboxed.h18
-rw-r--r--gobject/gvalue.h1
-rw-r--r--gobject/gvaluetypes.c20
-rw-r--r--gobject/gvaluetypes.h71
6 files changed, 98 insertions, 55 deletions
diff --git a/gobject/ChangeLog b/gobject/ChangeLog
index 5b0bb74b6..1ee30fc56 100644
--- a/gobject/ChangeLog
+++ b/gobject/ChangeLog
@@ -1,3 +1,9 @@
+Thu Oct 26 00:30:27 2000 Tim Janik <timj@gtk.org>
+
+ * gvaluetypes.[hc]: added g_value_set_static_string().
+
+ * gboxed.[hc]: const corrections. added g_value_set_static_boxed().
+
Wed Oct 25 20:27:02 2000 Tim Janik <timj@gtk.org>
* gtype.c (g_type_free_instance): for the moment, freeing object
diff --git a/gobject/gboxed.c b/gobject/gboxed.c
index c78612cdd..024440d2c 100644
--- a/gobject/gboxed.c
+++ b/gobject/gboxed.c
@@ -85,7 +85,7 @@ boxed_proxy_value_init (GValue *value)
static void
boxed_proxy_value_free (GValue *value)
{
- if (value->data[0].v_pointer)
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_STATIC_TAG))
{
BoxedNode key, *node;
@@ -204,10 +204,11 @@ g_boxed_type_register_static (const gchar *name,
}
GBoxed*
-g_boxed_copy (GType boxed_type,
- gpointer src_boxed)
+g_boxed_copy (GType boxed_type,
+ gconstpointer src_boxed)
{
GTypeValueTable *value_table;
+ gpointer dest_boxed;
g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL);
g_return_val_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE, NULL);
@@ -224,7 +225,7 @@ g_boxed_copy (GType boxed_type,
key.type = boxed_type;
node = g_bsearch_array_lookup (&boxed_bsa, &key);
- src_boxed = node->copy (src_boxed);
+ dest_boxed = node->copy ((gpointer) src_boxed);
}
else
{
@@ -236,7 +237,7 @@ g_boxed_copy (GType boxed_type,
memset (&dest_value.data, 0, sizeof (dest_value.data));
dest_value.g_type = boxed_type;
src_value.g_type = boxed_type;
- src_value.data[0].v_pointer = src_boxed;
+ src_value.data[0].v_pointer = (gpointer) src_boxed;
value_table->value_copy (&src_value, &dest_value);
if (dest_value.data[1].v_ulong ||
dest_value.data[2].v_ulong ||
@@ -244,10 +245,10 @@ g_boxed_copy (GType boxed_type,
g_warning ("the copy_value() implementation of type `%s' seems to make use of reserved GValue fields",
g_type_name (boxed_type));
- src_boxed = dest_value.data[0].v_pointer;
+ dest_boxed = dest_value.data[0].v_pointer;
}
- return src_boxed;
+ return dest_boxed;
}
void
@@ -286,19 +287,33 @@ g_boxed_free (GType boxed_type,
}
void
-g_value_set_boxed (GValue *value,
- gpointer boxed)
+g_value_set_boxed (GValue *value,
+ gconstpointer boxed)
{
g_return_if_fail (G_IS_VALUE_BOXED (value));
g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
- if (value->data[0].v_pointer)
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_STATIC_TAG))
g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
value->data[0].v_pointer = boxed ? g_boxed_copy (G_VALUE_TYPE (value), boxed) : NULL;
+ value->data[1].v_uint = 0;
+}
+
+void
+g_value_set_static_boxed (GValue *value,
+ gconstpointer boxed)
+{
+ g_return_if_fail (G_IS_VALUE_BOXED (value));
+ g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)));
+
+ if (value->data[0].v_pointer && !(value->data[1].v_uint & G_VALUE_STATIC_TAG))
+ g_boxed_free (G_VALUE_TYPE (value), value->data[0].v_pointer);
+ value->data[0].v_pointer = (gpointer) boxed;
+ value->data[1].v_uint = boxed ? G_VALUE_STATIC_TAG : 0;
}
gpointer
-g_value_get_boxed (GValue *value)
+g_value_get_boxed (const GValue *value)
{
g_return_val_if_fail (G_IS_VALUE_BOXED (value), NULL);
g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL);
diff --git a/gobject/gboxed.h b/gobject/gboxed.h
index edd51b06e..7b7e9a51a 100644
--- a/gobject/gboxed.h
+++ b/gobject/gboxed.h
@@ -39,14 +39,16 @@ typedef void (*GBoxedFreeFunc) (gpointer boxed);
/* --- prototypes --- */
-GBoxed* g_boxed_copy (GType boxed_type,
- gpointer src_boxed);
-void g_boxed_free (GType boxed_type,
- gpointer boxed);
-void g_value_set_boxed (GValue *value,
- gpointer boxed);
-gpointer g_value_get_boxed (GValue *value);
-gpointer g_value_dup_boxed (GValue *value);
+GBoxed* g_boxed_copy (GType boxed_type,
+ gconstpointer src_boxed);
+void g_boxed_free (GType boxed_type,
+ gpointer boxed);
+void g_value_set_boxed (GValue *value,
+ gconstpointer boxed);
+void g_value_set_static_boxed (GValue *value,
+ gconstpointer boxed);
+gpointer g_value_get_boxed (const GValue *value);
+gpointer g_value_dup_boxed (GValue *value);
/* --- convenience --- */
diff --git a/gobject/gvalue.h b/gobject/gvalue.h
index d095657ea..be68eba90 100644
--- a/gobject/gvalue.h
+++ b/gobject/gvalue.h
@@ -79,6 +79,7 @@ gboolean g_value_types_exchangable (GType value_type1,
void g_value_register_exchange_func (GType value_type1,
GType value_type2,
GValueExchange func);
+#define G_VALUE_STATIC_TAG (1 << 27)
#ifdef __cplusplus
}
diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c
index 8f5d6175a..ac857bfd9 100644
--- a/gobject/gvaluetypes.c
+++ b/gobject/gvaluetypes.c
@@ -221,7 +221,8 @@ value_string_init (GValue *value)
static void
value_string_free_value (GValue *value)
{
- g_free (value->data[0].v_pointer);
+ if (!(value->data[1].v_uint & G_VALUE_STATIC_TAG))
+ g_free (value->data[0].v_pointer);
}
static void
@@ -640,10 +641,25 @@ g_value_set_string (GValue *value,
{
g_return_if_fail (G_IS_VALUE_STRING (value));
- g_free (value->data[0].v_pointer);
+ if (value->data[1].v_uint & G_VALUE_STATIC_TAG)
+ value->data[1].v_uint = 0;
+ else
+ g_free (value->data[0].v_pointer);
value->data[0].v_pointer = g_strdup (v_string);
}
+void
+g_value_set_static_string (GValue *value,
+ const gchar *v_string)
+{
+ g_return_if_fail (G_IS_VALUE_STRING (value));
+
+ if (!(value->data[1].v_uint & G_VALUE_STATIC_TAG))
+ g_free (value->data[0].v_pointer);
+ value->data[1].v_uint = G_VALUE_STATIC_TAG;
+ value->data[0].v_pointer = (gchar*) v_string;
+}
+
gchar*
g_value_get_string (const GValue *value)
{
diff --git a/gobject/gvaluetypes.h b/gobject/gvaluetypes.h
index f91329140..32ba50d50 100644
--- a/gobject/gvaluetypes.h
+++ b/gobject/gvaluetypes.h
@@ -45,40 +45,43 @@ extern "C" {
/* --- prototypes --- */
-void g_value_set_char (GValue *value,
- gint8 v_char);
-gint8 g_value_get_char (const GValue *value);
-void g_value_set_uchar (GValue *value,
- guint8 v_uchar);
-guint8 g_value_get_uchar (const GValue *value);
-void g_value_set_boolean (GValue *value,
- gboolean v_boolean);
-gboolean g_value_get_boolean (const GValue *value);
-void g_value_set_int (GValue *value,
- gint v_int);
-gint g_value_get_int (const GValue *value);
-void g_value_set_uint (GValue *value,
- guint v_uint);
-guint g_value_get_uint (const GValue *value);
-void g_value_set_long (GValue *value,
- glong v_long);
-glong g_value_get_long (const GValue *value);
-void g_value_set_ulong (GValue *value,
- gulong v_ulong);
-gulong g_value_get_ulong (const GValue *value);
-void g_value_set_float (GValue *value,
- gfloat v_float);
-gfloat g_value_get_float (const GValue *value);
-void g_value_set_double (GValue *value,
- gdouble v_double);
-gdouble g_value_get_double (const GValue *value);
-void g_value_set_string (GValue *value,
- const gchar *v_string);
-gchar* g_value_get_string (const GValue *value);
-gchar* g_value_dup_string (const GValue *value);
-void g_value_set_pointer (GValue *value,
- gpointer v_pointer);
-gpointer g_value_get_pointer (GValue *value);
+void g_value_set_char (GValue *value,
+ gint8 v_char);
+gint8 g_value_get_char (const GValue *value);
+void g_value_set_uchar (GValue *value,
+ guint8 v_uchar);
+guint8 g_value_get_uchar (const GValue *value);
+void g_value_set_boolean (GValue *value,
+ gboolean v_boolean);
+gboolean g_value_get_boolean (const GValue *value);
+void g_value_set_int (GValue *value,
+ gint v_int);
+gint g_value_get_int (const GValue *value);
+void g_value_set_uint (GValue *value,
+ guint v_uint);
+guint g_value_get_uint (const GValue *value);
+void g_value_set_long (GValue *value,
+ glong v_long);
+glong g_value_get_long (const GValue *value);
+void g_value_set_ulong (GValue *value,
+ gulong v_ulong);
+gulong g_value_get_ulong (const GValue *value);
+void g_value_set_float (GValue *value,
+ gfloat v_float);
+gfloat g_value_get_float (const GValue *value);
+void g_value_set_double (GValue *value,
+ gdouble v_double);
+gdouble g_value_get_double (const GValue *value);
+void g_value_set_string (GValue *value,
+ const gchar *v_string);
+void g_value_set_static_string (GValue *value,
+ const gchar *v_string);
+gchar* g_value_get_string (const GValue *value);
+gchar* g_value_dup_string (const GValue *value);
+void g_value_set_pointer (GValue *value,
+ gpointer v_pointer);
+gpointer g_value_get_pointer (GValue *value);
+