/** * g_boxed_free: * @boxed_type: The type of @boxed. * @boxed: The boxed structure to be freed. * * Free the boxed structure @boxed which is of type @boxed_type. */ void g_boxed_free (GType boxed_type, gpointer boxed) { GTypeValueTable *value_table; g_return_if_fail (G_TYPE_IS_BOXED (boxed_type)); g_return_if_fail (G_TYPE_IS_ABSTRACT (boxed_type) == FALSE); g_return_if_fail (boxed != NULL); value_table = g_type_value_table_peek (boxed_type); if (!value_table) g_return_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type)); /* check if our proxying implementation is used, we can short-cut here */ if (value_table->value_free == boxed_proxy_value_free) { BoxedNode key, *node; key.type = boxed_type; node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key); node->free (boxed); } else { GValue value; /* see g_boxed_copy() on why we think we can do this */ value_meminit (&value, boxed_type); value.data[0].v_pointer = boxed; value_table->value_free (&value); } }
gpointer 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); g_return_val_if_fail (src_boxed != NULL, NULL); value_table = g_type_value_table_peek (boxed_type); if (!value_table) g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL); /* check if our proxying implementation is used, we can short-cut here */ if (value_table->value_copy == boxed_proxy_value_copy) { BoxedNode key, *node; key.type = boxed_type; node = g_bsearch_array_lookup (boxed_bsa, &boxed_bconfig, &key); dest_boxed = node->copy ((gpointer) src_boxed); } else { GValue src_value, dest_value; /* we heavil rely on third-party boxed type value vtable * implementations to follow normal boxed value storage * (data[0].v_pointer is the boxed struct, and * data[1].v_uint holds the G_VALUE_NOCOPY_CONTENTS flag, * rest zero). * but then, we can expect that since we layed out the * g_boxed_*() API. * data[1].v_uint&G_VALUE_NOCOPY_CONTENTS shouldn't be set * after a copy. */ /* equiv. to g_value_set_static_boxed() */ value_meminit (&src_value, boxed_type); src_value.data[0].v_pointer = (gpointer) src_boxed; src_value.data[1].v_uint = G_VALUE_NOCOPY_CONTENTS; /* call third-party code copy fucntion, fingers-crossed */ value_meminit (&dest_value, boxed_type); value_table->value_copy (&src_value, &dest_value); /* double check and grouse if things went wrong */ if (dest_value.data[1].v_ulong || dest_value.data[2].v_ulong) g_warning ("the copy_value() implementation of type `%s' seems to make use of reserved GValue fields", g_type_name (boxed_type)); dest_boxed = dest_value.data[0].v_pointer; } return dest_boxed; }
/* Help function to dump a GType */ void my_dump_type(GType type_id) { printf("Type id: %d\n", type_id); printf("Type name: %s\n", g_type_name(type_id)); printf("Is fundamental? %s\n", G_TYPE_IS_FUNDAMENTAL(type_id) ? "yes" : "no"); printf("Is derived? %s\n", G_TYPE_IS_DERIVED(type_id) ? "yes" : "no"); printf("Is interface? %s\n", G_TYPE_IS_INTERFACE(type_id) ? "yes" : "no"); printf("Is classed? %s\n", G_TYPE_IS_CLASSED(type_id) ? "yes" : "no"); printf("Is instantiatable? %s\n", G_TYPE_IS_INSTANTIATABLE(type_id) ? "yes" : "no"); printf("Is derivable? %s\n", G_TYPE_IS_DERIVABLE(type_id) ? "yes" : "no"); printf("Is deep derivable? %s\n", G_TYPE_IS_DEEP_DERIVABLE(type_id) ? "yes" : "no"); printf("Is abstract? %s\n", G_TYPE_IS_ABSTRACT(type_id) ? "yes" : "no"); printf("Is value abstract? %s\n", G_TYPE_IS_VALUE_ABSTRACT(type_id) ? "yes" : "no"); printf("Is value type: %s\n", G_TYPE_IS_VALUE_TYPE(type_id) ? "yes" : "no"); printf("Has value table: %s\n", G_TYPE_HAS_VALUE_TABLE(type_id) ? "yes" : "no"); }
GParamSpec* g_param_spec_boxed (const gchar *name, const gchar *nick, const gchar *blurb, GType boxed_type, GParamFlags flags) { GParamSpecBoxed *bspec; g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL); g_return_val_if_fail (G_TYPE_IS_VALUE_TYPE (boxed_type), NULL); bspec = g_param_spec_internal (G_TYPE_PARAM_BOXED, name, nick, blurb, flags); G_PARAM_SPEC (bspec)->value_type = boxed_type; return G_PARAM_SPEC (bspec); }
gboolean _gtk_tree_data_list_check_type (GType type) { gint i = 0; static const GType type_list[] = { G_TYPE_BOOLEAN, G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_INT64, G_TYPE_UINT64, G_TYPE_ENUM, G_TYPE_FLAGS, G_TYPE_FLOAT, G_TYPE_DOUBLE, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOXED, G_TYPE_OBJECT, G_TYPE_VARIANT, G_TYPE_INVALID }; if (! G_TYPE_IS_VALUE_TYPE (type)) return FALSE; while (type_list[i] != G_TYPE_INVALID) { if (g_type_is_a (type, type_list[i])) return TRUE; i++; } return FALSE; }
/** * pluma_message_type_is_supported: * @type: the #GType * * Returns if @type is #GType supported by the message system. * * Return value: %TRUE if @type is a supported #GType * */ gboolean pluma_message_type_is_supported (GType type) { gint i = 0; static const GType type_list[] = { G_TYPE_BOOLEAN, G_TYPE_CHAR, G_TYPE_UCHAR, G_TYPE_INT, G_TYPE_UINT, G_TYPE_LONG, G_TYPE_ULONG, G_TYPE_INT64, G_TYPE_UINT64, G_TYPE_ENUM, G_TYPE_FLAGS, G_TYPE_FLOAT, G_TYPE_DOUBLE, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_BOXED, G_TYPE_OBJECT, G_TYPE_INVALID }; if (!G_TYPE_IS_VALUE_TYPE (type)) return FALSE; while (type_list[i] != G_TYPE_INVALID) { if (g_type_is_a (type, type_list[i])) return TRUE; i++; } return FALSE; }
static PyObject* _wrap_g_type_is_value_type(PyGTypeWrapper *self) { return PyBool_FromLong(G_TYPE_IS_VALUE_TYPE(self->type)); }
static VALUE rg_value_type_p(VALUE self) { return CBOOL2RVAL(G_TYPE_IS_VALUE_TYPE(rbgobj_gtype_get(self))); }