};
GType type;
- type = g_type_register_fundamental (G_TYPE_PARAM, "GParam", ¶m_spec_info, &finfo);
+ type = g_type_register_fundamental (G_TYPE_PARAM, "GParam", ¶m_spec_info, &finfo, G_TYPE_FLAG_ABSTRACT);
g_assert (type == G_TYPE_PARAM);
}
return pspec;
}
+
+
+/* --- auxillary functions --- */
+typedef struct
+{
+ /* class portion */
+ GType value_type;
+ void (*finalize) (GParamSpec *pspec);
+ void (*value_set_default) (GParamSpec *pspec,
+ GValue *value);
+ gboolean (*value_validate) (GParamSpec *pspec,
+ GValue *value);
+ gint (*values_cmp) (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2);
+} ParamSpecClassInfo;
+
+static void
+param_spec_generic_class_init (gpointer g_class,
+ gpointer class_data)
+{
+ GParamSpecClass *class = g_class;
+ ParamSpecClassInfo *info = class_data;
+
+ class->value_type = info->value_type;
+ if (info->finalize)
+ class->finalize = info->finalize; /* optional */
+ class->value_set_default = info->value_set_default;
+ if (info->value_validate)
+ class->value_validate = info->value_validate; /* optional */
+ class->values_cmp = info->values_cmp;
+ g_free (class_data);
+}
+
+static void
+default_value_set_default (GParamSpec *pspec,
+ GValue *value)
+{
+ /* value is already zero initialized */
+}
+
+static gint
+default_values_cmp (GParamSpec *pspec,
+ const GValue *value1,
+ const GValue *value2)
+{
+ return memcmp (&value1->data, &value2->data, sizeof (value1->data));
+}
+
+GType
+g_param_type_register_static (const gchar *name,
+ const GParamSpecTypeInfo *pspec_info)
+{
+ GTypeInfo info = {
+ sizeof (GParamSpecClass), /* class_size */
+ NULL, /* base_init */
+ NULL, /* base_destroy */
+ param_spec_generic_class_init, /* class_init */
+ NULL, /* class_destroy */
+ NULL, /* class_data */
+ 0, /* instance_size */
+ 16, /* n_preallocs */
+ NULL, /* instance_init */
+ };
+ ParamSpecClassInfo *cinfo;
+
+ g_return_val_if_fail (name != NULL, 0);
+ g_return_val_if_fail (pspec_info != NULL, 0);
+ g_return_val_if_fail (g_type_from_name (name) == 0, 0);
+ g_return_val_if_fail (pspec_info->instance_size >= sizeof (GParamSpec), 0);
+ g_return_val_if_fail (g_type_name (pspec_info->value_type) != NULL, 0);
+ /* default: g_return_val_if_fail (pspec_info->value_set_default != NULL, 0); */
+ /* optional: g_return_val_if_fail (pspec_info->value_validate != NULL, 0); */
+ /* default: g_return_val_if_fail (pspec_info->values_cmp != NULL, 0); */
+
+ info.instance_size = pspec_info->instance_size;
+ info.n_preallocs = pspec_info->n_preallocs;
+ info.instance_init = (GInstanceInitFunc) pspec_info->instance_init;
+ cinfo = g_new (ParamSpecClassInfo, 1);
+ cinfo->value_type = pspec_info->value_type;
+ cinfo->finalize = pspec_info->finalize;
+ cinfo->value_set_default = pspec_info->value_set_default ? pspec_info->value_set_default : default_value_set_default;
+ cinfo->value_validate = pspec_info->value_validate;
+ cinfo->values_cmp = pspec_info->values_cmp ? pspec_info->values_cmp : default_values_cmp;
+ info.class_data = cinfo;
+
+ return g_type_register_static (G_TYPE_PARAM, name, &info, 0);
+}