1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
19 #include "gvaluetypes.h"
21 #include "gvaluecollector.h"
25 /* --- value functions --- */
27 value_long0_init (GValue *value)
29 value->data[0].v_long = 0;
33 value_long0_copy (const GValue *src_value,
36 dest_value->data[0].v_long = src_value->data[0].v_long;
40 value_char_lcopy_value (const GValue *value,
43 GTypeCValue *collect_value)
45 gint8 *int8_p = collect_value->v_pointer;
48 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
50 *int8_p = value->data[0].v_int;
57 value_boolean_lcopy_value (const GValue *value,
60 GTypeCValue *collect_value)
62 gboolean *bool_p = collect_value->v_pointer;
65 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
67 *bool_p = value->data[0].v_int;
74 value_int_collect_value (GValue *value,
77 GTypeCValue *collect_value)
79 value->data[0].v_int = collect_value->v_int;
86 value_int_lcopy_value (const GValue *value,
89 GTypeCValue *collect_value)
91 gint *int_p = collect_value->v_pointer;
94 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
96 *int_p = value->data[0].v_int;
103 value_long_collect_value (GValue *value,
106 GTypeCValue *collect_value)
108 value->data[0].v_long = collect_value->v_long;
115 value_long_lcopy_value (const GValue *value,
118 GTypeCValue *collect_value)
120 glong *long_p = collect_value->v_pointer;
123 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
125 *long_p = value->data[0].v_long;
132 value_float_init (GValue *value)
134 value->data[0].v_float = 0.0;
138 value_float_copy (const GValue *src_value,
141 dest_value->data[0].v_float = src_value->data[0].v_float;
145 value_float_collect_value (GValue *value,
148 GTypeCValue *collect_value)
150 value->data[0].v_float = collect_value->v_double;
157 value_float_lcopy_value (const GValue *value,
160 GTypeCValue *collect_value)
162 gfloat *float_p = collect_value->v_pointer;
165 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
167 *float_p = value->data[0].v_float;
174 value_double_init (GValue *value)
176 value->data[0].v_double = 0.0;
180 value_double_copy (const GValue *src_value,
183 dest_value->data[0].v_double = src_value->data[0].v_double;
187 value_double_collect_value (GValue *value,
190 GTypeCValue *collect_value)
192 value->data[0].v_double = collect_value->v_double;
199 value_double_lcopy_value (const GValue *value,
202 GTypeCValue *collect_value)
204 gdouble *double_p = collect_value->v_pointer;
207 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
209 *double_p = value->data[0].v_double;
216 value_string_init (GValue *value)
218 value->data[0].v_pointer = NULL;
222 value_string_free_value (GValue *value)
224 g_free (value->data[0].v_pointer);
228 value_string_copy_value (const GValue *src_value,
231 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
235 value_string_collect_value (GValue *value,
238 GTypeCValue *collect_value)
240 value->data[0].v_pointer = g_strdup (collect_value->v_pointer);
247 value_string_lcopy_value (const GValue *value,
250 GTypeCValue *collect_value)
252 gchar **string_p = collect_value->v_pointer;
255 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
257 *string_p = g_strdup (value->data[0].v_pointer);
264 /* --- type initialization --- */
266 g_value_types_init (void) /* sync with gtype.c */
270 NULL, /* base_init */
271 NULL, /* base_destroy */
272 NULL, /* class_init */
273 NULL, /* class_destroy */
274 NULL, /* class_data */
275 0, /* instance_size */
277 NULL, /* instance_init */
278 NULL, /* value_table */
280 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
283 /* G_TYPE_CHAR / G_TYPE_UCHAR
286 static const GTypeValueTable value_table = {
287 value_long0_init, /* value_init */
288 NULL, /* value_free */
289 value_long0_copy, /* value_copy */
290 G_VALUE_COLLECT_INT, /* collect_type */
291 value_int_collect_value, /* collect_value */
292 G_VALUE_COLLECT_POINTER, /* lcopy_type */
293 value_char_lcopy_value, /* lcopy_value */
295 info.value_table = &value_table;
296 type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo);
297 g_assert (type == G_TYPE_CHAR);
298 type = g_type_register_fundamental (G_TYPE_UCHAR, "guchar", &info, &finfo);
299 g_assert (type == G_TYPE_UCHAR);
305 static const GTypeValueTable value_table = {
306 value_long0_init, /* value_init */
307 NULL, /* value_free */
308 value_long0_copy, /* value_copy */
309 G_VALUE_COLLECT_INT, /* collect_type */
310 value_int_collect_value, /* collect_value */
311 G_VALUE_COLLECT_POINTER, /* lcopy_type */
312 value_boolean_lcopy_value, /* lcopy_value */
314 info.value_table = &value_table;
315 type = g_type_register_fundamental (G_TYPE_BOOLEAN, "gboolean", &info, &finfo);
316 g_assert (type == G_TYPE_BOOLEAN);
319 /* G_TYPE_INT / G_TYPE_UINT
322 static const GTypeValueTable value_table = {
323 value_long0_init, /* value_init */
324 NULL, /* value_free */
325 value_long0_copy, /* value_copy */
326 G_VALUE_COLLECT_INT, /* collect_type */
327 value_int_collect_value, /* collect_value */
328 G_VALUE_COLLECT_POINTER, /* lcopy_type */
329 value_int_lcopy_value, /* lcopy_value */
331 info.value_table = &value_table;
332 type = g_type_register_fundamental (G_TYPE_INT, "gint", &info, &finfo);
333 g_assert (type == G_TYPE_INT);
334 type = g_type_register_fundamental (G_TYPE_UINT, "guint", &info, &finfo);
335 g_assert (type == G_TYPE_UINT);
338 /* G_TYPE_LONG / G_TYPE_ULONG
341 static const GTypeValueTable value_table = {
342 value_long0_init, /* value_init */
343 NULL, /* value_free */
344 value_long0_copy, /* value_copy */
345 G_VALUE_COLLECT_LONG, /* collect_type */
346 value_long_collect_value, /* collect_value */
347 G_VALUE_COLLECT_POINTER, /* lcopy_type */
348 value_long_lcopy_value, /* lcopy_value */
350 info.value_table = &value_table;
351 type = g_type_register_fundamental (G_TYPE_LONG, "glong", &info, &finfo);
352 g_assert (type == G_TYPE_LONG);
353 type = g_type_register_fundamental (G_TYPE_ULONG, "gulong", &info, &finfo);
354 g_assert (type == G_TYPE_ULONG);
360 static const GTypeValueTable value_table = {
361 value_float_init, /* value_init */
362 NULL, /* value_free */
363 value_float_copy, /* value_copy */
364 G_VALUE_COLLECT_DOUBLE, /* collect_type */
365 value_float_collect_value, /* collect_value */
366 G_VALUE_COLLECT_POINTER, /* lcopy_type */
367 value_float_lcopy_value, /* lcopy_value */
369 info.value_table = &value_table;
370 type = g_type_register_fundamental (G_TYPE_FLOAT, "gfloat", &info, &finfo);
371 g_assert (type == G_TYPE_FLOAT);
377 static const GTypeValueTable value_table = {
378 value_double_init, /* value_init */
379 NULL, /* value_free */
380 value_double_copy, /* value_copy */
381 G_VALUE_COLLECT_DOUBLE, /* collect_type */
382 value_double_collect_value, /* collect_value */
383 G_VALUE_COLLECT_POINTER, /* lcopy_type */
384 value_double_lcopy_value, /* lcopy_value */
386 info.value_table = &value_table;
387 type = g_type_register_fundamental (G_TYPE_DOUBLE, "gdouble", &info, &finfo);
388 g_assert (type == G_TYPE_DOUBLE);
394 static const GTypeValueTable value_table = {
395 value_string_init, /* value_init */
396 value_string_free_value, /* value_free */
397 value_string_copy_value, /* value_copy */
398 G_VALUE_COLLECT_POINTER, /* collect_type */
399 value_string_collect_value, /* collect_value */
400 G_VALUE_COLLECT_POINTER, /* lcopy_type */
401 value_string_lcopy_value, /* lcopy_value */
403 info.value_table = &value_table;
404 type = g_type_register_fundamental (G_TYPE_STRING, "gstring", &info, &finfo);
405 g_assert (type == G_TYPE_STRING);
410 /* --- GValue functions --- */
412 g_value_set_char (GValue *value,
415 g_return_if_fail (G_IS_VALUE_CHAR (value));
417 value->data[0].v_int = v_char;
421 g_value_get_char (GValue *value)
423 g_return_val_if_fail (G_IS_VALUE_CHAR (value), 0);
425 return value->data[0].v_int;
429 g_value_set_uchar (GValue *value,
432 g_return_if_fail (G_IS_VALUE_UCHAR (value));
434 value->data[0].v_uint = v_uchar;
438 g_value_get_uchar (GValue *value)
440 g_return_val_if_fail (G_IS_VALUE_UCHAR (value), 0);
442 return value->data[0].v_uint;
446 g_value_set_boolean (GValue *value,
449 g_return_if_fail (G_IS_VALUE_BOOLEAN (value));
451 value->data[0].v_int = v_boolean;
455 g_value_get_boolean (GValue *value)
457 g_return_val_if_fail (G_IS_VALUE_BOOLEAN (value), 0);
459 return value->data[0].v_int;
463 g_value_set_int (GValue *value,
466 g_return_if_fail (G_IS_VALUE_INT (value));
468 value->data[0].v_int = v_int;
472 g_value_get_int (GValue *value)
474 g_return_val_if_fail (G_IS_VALUE_INT (value), 0);
476 return value->data[0].v_int;
480 g_value_set_uint (GValue *value,
483 g_return_if_fail (G_IS_VALUE_UINT (value));
485 value->data[0].v_uint = v_uint;
489 g_value_get_uint (GValue *value)
491 g_return_val_if_fail (G_IS_VALUE_UINT (value), 0);
493 return value->data[0].v_uint;
497 g_value_set_long (GValue *value,
500 g_return_if_fail (G_IS_VALUE_LONG (value));
502 value->data[0].v_long = v_long;
506 g_value_get_long (GValue *value)
508 g_return_val_if_fail (G_IS_VALUE_LONG (value), 0);
510 return value->data[0].v_long;
514 g_value_set_ulong (GValue *value,
517 g_return_if_fail (G_IS_VALUE_ULONG (value));
519 value->data[0].v_ulong = v_ulong;
523 g_value_get_ulong (GValue *value)
525 g_return_val_if_fail (G_IS_VALUE_ULONG (value), 0);
527 return value->data[0].v_ulong;
531 g_value_set_float (GValue *value,
534 g_return_if_fail (G_IS_VALUE_FLOAT (value));
536 value->data[0].v_float = v_float;
540 g_value_get_float (GValue *value)
542 g_return_val_if_fail (G_IS_VALUE_FLOAT (value), 0);
544 return value->data[0].v_float;
548 g_value_set_double (GValue *value,
551 g_return_if_fail (G_IS_VALUE_DOUBLE (value));
553 value->data[0].v_double = v_double;
557 g_value_get_double (GValue *value)
559 g_return_val_if_fail (G_IS_VALUE_DOUBLE (value), 0);
561 return value->data[0].v_double;
565 g_value_set_string (GValue *value,
566 const gchar *v_string)
568 g_return_if_fail (G_IS_VALUE_STRING (value));
570 g_free (value->data[0].v_pointer);
571 value->data[0].v_pointer = g_strdup (v_string);
575 g_value_get_string (GValue *value)
577 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
579 return value->data[0].v_pointer;
583 g_value_dup_string (GValue *value)
585 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
587 return g_strdup (value->data[0].v_pointer);