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.
24 #include "gvaluetypes.h"
26 #include "gvaluecollector.h"
30 /* --- value functions --- */
32 value_long0_init (GValue *value)
34 value->data[0].v_long = 0;
38 value_long0_copy (const GValue *src_value,
41 dest_value->data[0].v_long = src_value->data[0].v_long;
45 value_char_lcopy_value (const GValue *value,
48 GTypeCValue *collect_value)
50 gint8 *int8_p = collect_value->v_pointer;
53 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
55 *int8_p = value->data[0].v_int;
62 value_boolean_lcopy_value (const GValue *value,
65 GTypeCValue *collect_value)
67 gboolean *bool_p = collect_value->v_pointer;
70 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
72 *bool_p = value->data[0].v_int;
79 value_int_collect_value (GValue *value,
82 GTypeCValue *collect_value)
84 value->data[0].v_int = collect_value->v_int;
91 value_int_lcopy_value (const GValue *value,
94 GTypeCValue *collect_value)
96 gint *int_p = collect_value->v_pointer;
99 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
101 *int_p = value->data[0].v_int;
108 value_long_collect_value (GValue *value,
111 GTypeCValue *collect_value)
113 value->data[0].v_long = collect_value->v_long;
120 value_long_lcopy_value (const GValue *value,
123 GTypeCValue *collect_value)
125 glong *long_p = collect_value->v_pointer;
128 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
130 *long_p = value->data[0].v_long;
137 value_float_init (GValue *value)
139 value->data[0].v_float = 0.0;
143 value_float_copy (const GValue *src_value,
146 dest_value->data[0].v_float = src_value->data[0].v_float;
150 value_float_collect_value (GValue *value,
153 GTypeCValue *collect_value)
155 value->data[0].v_float = collect_value->v_double;
162 value_float_lcopy_value (const GValue *value,
165 GTypeCValue *collect_value)
167 gfloat *float_p = collect_value->v_pointer;
170 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
172 *float_p = value->data[0].v_float;
179 value_double_init (GValue *value)
181 value->data[0].v_double = 0.0;
185 value_double_copy (const GValue *src_value,
188 dest_value->data[0].v_double = src_value->data[0].v_double;
192 value_double_collect_value (GValue *value,
195 GTypeCValue *collect_value)
197 value->data[0].v_double = collect_value->v_double;
204 value_double_lcopy_value (const GValue *value,
207 GTypeCValue *collect_value)
209 gdouble *double_p = collect_value->v_pointer;
212 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
214 *double_p = value->data[0].v_double;
221 value_string_init (GValue *value)
223 value->data[0].v_pointer = NULL;
227 value_string_free_value (GValue *value)
229 if (!(value->data[1].v_uint & G_VALUE_STATIC_TAG))
230 g_free (value->data[0].v_pointer);
234 value_string_copy_value (const GValue *src_value,
237 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
241 value_string_collect_value (GValue *value,
244 GTypeCValue *collect_value)
246 value->data[0].v_pointer = g_strdup (collect_value->v_pointer);
253 value_string_lcopy_value (const GValue *value,
256 GTypeCValue *collect_value)
258 gchar **string_p = collect_value->v_pointer;
261 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
263 *string_p = g_strdup (value->data[0].v_pointer);
270 value_pointer_init (GValue *value)
272 value->data[0].v_pointer = NULL;
276 value_pointer_copy (const GValue *src_value,
279 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
283 value_pointer_peek_pointer (const GValue *value)
285 return value->data[0].v_pointer;
289 value_pointer_collect_value (GValue *value,
292 GTypeCValue *collect_value)
294 value->data[0].v_pointer = collect_value->v_pointer;
301 value_pointer_lcopy_value (const GValue *value,
304 GTypeCValue *collect_value)
306 gpointer *pointer_p = collect_value->v_pointer;
309 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
311 *pointer_p = value->data[0].v_pointer;
318 value_ccallback_init (GValue *value)
320 value->data[0].v_pointer = NULL;
321 value->data[1].v_pointer = NULL;
325 value_ccallback_copy (const GValue *src_value,
328 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
329 dest_value->data[1].v_pointer = src_value->data[1].v_pointer;
333 value_ccallback_collect_value (GValue *value,
336 GTypeCValue *collect_value)
343 value->data[0].v_pointer = collect_value->v_pointer;
344 *collect_type = G_VALUE_COLLECT_POINTER;
345 if (!value->data[0].v_pointer)
346 error = g_strconcat ("invalid (NULL) pointer callback function for value type `",
347 G_VALUE_TYPE_NAME (value),
352 value->data[1].v_pointer = collect_value->v_pointer;
361 value_ccallback_lcopy_value (const GValue *value,
364 GTypeCValue *collect_value)
366 gpointer *pointer_p = collect_value->v_pointer;
369 return g_strdup_printf ("%s location for `%s' passed as NULL",
370 nth_value ? "data" : "callback",
371 G_VALUE_TYPE_NAME (value));
375 *pointer_p = value->data[0].v_pointer;
376 *collect_type = G_VALUE_COLLECT_POINTER;
379 *pointer_p = value->data[1].v_pointer;
388 /* --- type initialization --- */
390 g_value_types_init (void) /* sync with gtype.c */
394 NULL, /* base_init */
395 NULL, /* base_destroy */
396 NULL, /* class_init */
397 NULL, /* class_destroy */
398 NULL, /* class_data */
399 0, /* instance_size */
401 NULL, /* instance_init */
402 NULL, /* value_table */
404 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
407 /* G_TYPE_CHAR / G_TYPE_UCHAR
410 static const GTypeValueTable value_table = {
411 value_long0_init, /* value_init */
412 NULL, /* value_free */
413 value_long0_copy, /* value_copy */
414 NULL, /* value_peek_pointer */
415 G_VALUE_COLLECT_INT, /* collect_type */
416 value_int_collect_value, /* collect_value */
417 G_VALUE_COLLECT_POINTER, /* lcopy_type */
418 value_char_lcopy_value, /* lcopy_value */
420 info.value_table = &value_table;
421 type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
422 g_assert (type == G_TYPE_CHAR);
423 type = g_type_register_fundamental (G_TYPE_UCHAR, "guchar", &info, &finfo, 0);
424 g_assert (type == G_TYPE_UCHAR);
430 static const GTypeValueTable value_table = {
431 value_long0_init, /* value_init */
432 NULL, /* value_free */
433 value_long0_copy, /* value_copy */
434 NULL, /* value_peek_pointer */
435 G_VALUE_COLLECT_INT, /* collect_type */
436 value_int_collect_value, /* collect_value */
437 G_VALUE_COLLECT_POINTER, /* lcopy_type */
438 value_boolean_lcopy_value, /* lcopy_value */
440 info.value_table = &value_table;
441 type = g_type_register_fundamental (G_TYPE_BOOLEAN, "gboolean", &info, &finfo, 0);
442 g_assert (type == G_TYPE_BOOLEAN);
445 /* G_TYPE_INT / G_TYPE_UINT
448 static const GTypeValueTable value_table = {
449 value_long0_init, /* value_init */
450 NULL, /* value_free */
451 value_long0_copy, /* value_copy */
452 NULL, /* value_peek_pointer */
453 G_VALUE_COLLECT_INT, /* collect_type */
454 value_int_collect_value, /* collect_value */
455 G_VALUE_COLLECT_POINTER, /* lcopy_type */
456 value_int_lcopy_value, /* lcopy_value */
458 info.value_table = &value_table;
459 type = g_type_register_fundamental (G_TYPE_INT, "gint", &info, &finfo, 0);
460 g_assert (type == G_TYPE_INT);
461 type = g_type_register_fundamental (G_TYPE_UINT, "guint", &info, &finfo, 0);
462 g_assert (type == G_TYPE_UINT);
465 /* G_TYPE_LONG / G_TYPE_ULONG
468 static const GTypeValueTable value_table = {
469 value_long0_init, /* value_init */
470 NULL, /* value_free */
471 value_long0_copy, /* value_copy */
472 NULL, /* value_peek_pointer */
473 G_VALUE_COLLECT_LONG, /* collect_type */
474 value_long_collect_value, /* collect_value */
475 G_VALUE_COLLECT_POINTER, /* lcopy_type */
476 value_long_lcopy_value, /* lcopy_value */
478 info.value_table = &value_table;
479 type = g_type_register_fundamental (G_TYPE_LONG, "glong", &info, &finfo, 0);
480 g_assert (type == G_TYPE_LONG);
481 type = g_type_register_fundamental (G_TYPE_ULONG, "gulong", &info, &finfo, 0);
482 g_assert (type == G_TYPE_ULONG);
488 static const GTypeValueTable value_table = {
489 value_float_init, /* value_init */
490 NULL, /* value_free */
491 value_float_copy, /* value_copy */
492 NULL, /* value_peek_pointer */
493 G_VALUE_COLLECT_DOUBLE, /* collect_type */
494 value_float_collect_value, /* collect_value */
495 G_VALUE_COLLECT_POINTER, /* lcopy_type */
496 value_float_lcopy_value, /* lcopy_value */
498 info.value_table = &value_table;
499 type = g_type_register_fundamental (G_TYPE_FLOAT, "gfloat", &info, &finfo, 0);
500 g_assert (type == G_TYPE_FLOAT);
506 static const GTypeValueTable value_table = {
507 value_double_init, /* value_init */
508 NULL, /* value_free */
509 value_double_copy, /* value_copy */
510 NULL, /* value_peek_pointer */
511 G_VALUE_COLLECT_DOUBLE, /* collect_type */
512 value_double_collect_value, /* collect_value */
513 G_VALUE_COLLECT_POINTER, /* lcopy_type */
514 value_double_lcopy_value, /* lcopy_value */
516 info.value_table = &value_table;
517 type = g_type_register_fundamental (G_TYPE_DOUBLE, "gdouble", &info, &finfo, 0);
518 g_assert (type == G_TYPE_DOUBLE);
524 static const GTypeValueTable value_table = {
525 value_string_init, /* value_init */
526 value_string_free_value, /* value_free */
527 value_string_copy_value, /* value_copy */
528 value_pointer_peek_pointer, /* value_peek_pointer */
529 G_VALUE_COLLECT_POINTER, /* collect_type */
530 value_string_collect_value, /* collect_value */
531 G_VALUE_COLLECT_POINTER, /* lcopy_type */
532 value_string_lcopy_value, /* lcopy_value */
534 info.value_table = &value_table;
535 type = g_type_register_fundamental (G_TYPE_STRING, "gstring", &info, &finfo, 0);
536 g_assert (type == G_TYPE_STRING);
542 static const GTypeValueTable value_table = {
543 value_pointer_init, /* value_init */
544 NULL, /* value_free */
545 value_pointer_copy, /* value_copy */
546 value_pointer_peek_pointer, /* value_peek_pointer */
547 G_VALUE_COLLECT_POINTER, /* collect_type */
548 value_pointer_collect_value, /* collect_value */
549 G_VALUE_COLLECT_POINTER, /* lcopy_type */
550 value_pointer_lcopy_value, /* lcopy_value */
552 info.value_table = &value_table;
553 type = g_type_register_fundamental (G_TYPE_POINTER, "gpointer", &info, &finfo, 0);
554 g_assert (type == G_TYPE_POINTER);
560 static const GTypeValueTable value_table = {
561 value_ccallback_init, /* value_init */
562 NULL, /* value_free */
563 value_ccallback_copy, /* value_copy */
564 NULL, /* value_peek_pointer */
565 G_VALUE_COLLECT_POINTER, /* collect_type */
566 value_ccallback_collect_value, /* collect_value */
567 G_VALUE_COLLECT_POINTER, /* lcopy_type */
568 value_ccallback_lcopy_value, /* lcopy_value */
570 info.value_table = &value_table;
571 type = g_type_register_fundamental (G_TYPE_CCALLBACK, "GCCallback", &info, &finfo, 0);
572 g_assert (type == G_TYPE_CCALLBACK);
577 /* --- GValue functions --- */
579 g_value_set_char (GValue *value,
582 g_return_if_fail (G_IS_VALUE_CHAR (value));
584 value->data[0].v_int = v_char;
588 g_value_get_char (const GValue *value)
590 g_return_val_if_fail (G_IS_VALUE_CHAR (value), 0);
592 return value->data[0].v_int;
596 g_value_set_uchar (GValue *value,
599 g_return_if_fail (G_IS_VALUE_UCHAR (value));
601 value->data[0].v_uint = v_uchar;
605 g_value_get_uchar (const GValue *value)
607 g_return_val_if_fail (G_IS_VALUE_UCHAR (value), 0);
609 return value->data[0].v_uint;
613 g_value_set_boolean (GValue *value,
616 g_return_if_fail (G_IS_VALUE_BOOLEAN (value));
618 value->data[0].v_int = v_boolean;
622 g_value_get_boolean (const GValue *value)
624 g_return_val_if_fail (G_IS_VALUE_BOOLEAN (value), 0);
626 return value->data[0].v_int;
630 g_value_set_int (GValue *value,
633 g_return_if_fail (G_IS_VALUE_INT (value));
635 value->data[0].v_int = v_int;
639 g_value_get_int (const GValue *value)
641 g_return_val_if_fail (G_IS_VALUE_INT (value), 0);
643 return value->data[0].v_int;
647 g_value_set_uint (GValue *value,
650 g_return_if_fail (G_IS_VALUE_UINT (value));
652 value->data[0].v_uint = v_uint;
656 g_value_get_uint (const GValue *value)
658 g_return_val_if_fail (G_IS_VALUE_UINT (value), 0);
660 return value->data[0].v_uint;
664 g_value_set_long (GValue *value,
667 g_return_if_fail (G_IS_VALUE_LONG (value));
669 value->data[0].v_long = v_long;
673 g_value_get_long (const GValue *value)
675 g_return_val_if_fail (G_IS_VALUE_LONG (value), 0);
677 return value->data[0].v_long;
681 g_value_set_ulong (GValue *value,
684 g_return_if_fail (G_IS_VALUE_ULONG (value));
686 value->data[0].v_ulong = v_ulong;
690 g_value_get_ulong (const GValue *value)
692 g_return_val_if_fail (G_IS_VALUE_ULONG (value), 0);
694 return value->data[0].v_ulong;
698 g_value_set_float (GValue *value,
701 g_return_if_fail (G_IS_VALUE_FLOAT (value));
703 value->data[0].v_float = v_float;
707 g_value_get_float (const GValue *value)
709 g_return_val_if_fail (G_IS_VALUE_FLOAT (value), 0);
711 return value->data[0].v_float;
715 g_value_set_double (GValue *value,
718 g_return_if_fail (G_IS_VALUE_DOUBLE (value));
720 value->data[0].v_double = v_double;
724 g_value_get_double (const GValue *value)
726 g_return_val_if_fail (G_IS_VALUE_DOUBLE (value), 0);
728 return value->data[0].v_double;
732 g_value_set_string (GValue *value,
733 const gchar *v_string)
735 g_return_if_fail (G_IS_VALUE_STRING (value));
737 if (value->data[1].v_uint & G_VALUE_STATIC_TAG)
738 value->data[1].v_uint = 0;
740 g_free (value->data[0].v_pointer);
741 value->data[0].v_pointer = g_strdup (v_string);
745 g_value_set_static_string (GValue *value,
746 const gchar *v_string)
748 g_return_if_fail (G_IS_VALUE_STRING (value));
750 if (!(value->data[1].v_uint & G_VALUE_STATIC_TAG))
751 g_free (value->data[0].v_pointer);
752 value->data[1].v_uint = G_VALUE_STATIC_TAG;
753 value->data[0].v_pointer = (gchar*) v_string;
757 g_value_get_string (const GValue *value)
759 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
761 return value->data[0].v_pointer;
765 g_value_dup_string (const GValue *value)
767 g_return_val_if_fail (G_IS_VALUE_STRING (value), NULL);
769 return g_strdup (value->data[0].v_pointer);
773 g_value_set_pointer (GValue *value,
776 g_return_if_fail (G_IS_VALUE_POINTER (value));
778 value->data[0].v_pointer = v_pointer;
782 g_value_get_pointer (const GValue *value)
784 g_return_val_if_fail (G_IS_VALUE_POINTER (value), NULL);
786 return value->data[0].v_pointer;
790 g_value_set_ccallback (GValue *value,
791 gpointer callback_func,
792 gpointer callback_data)
794 g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
796 value->data[0].v_pointer = callback_func;
797 value->data[1].v_pointer = callback_data;
801 g_value_get_ccallback (const GValue *value,
802 gpointer *callback_func,
803 gpointer *callback_data)
805 g_return_if_fail (G_IS_VALUE_CCALLBACK (value));
808 *callback_func = value->data[0].v_pointer;
810 *callback_data = value->data[1].v_pointer;