1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997-1999, 2000-2001 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"
28 #include <stdlib.h> /* qsort() */
31 /* --- value functions --- */
33 value_init_long0 (GValue *value)
35 value->data[0].v_long = 0;
39 value_copy_long0 (const GValue *src_value,
42 dest_value->data[0].v_long = src_value->data[0].v_long;
46 value_lcopy_char (const GValue *value,
47 guint n_collect_values,
48 GTypeCValue *collect_values,
51 gint8 *int8_p = collect_values[0].v_pointer;
54 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
56 *int8_p = value->data[0].v_int;
62 value_lcopy_boolean (const GValue *value,
63 guint n_collect_values,
64 GTypeCValue *collect_values,
67 gboolean *bool_p = collect_values[0].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;
78 value_collect_int (GValue *value,
79 guint n_collect_values,
80 GTypeCValue *collect_values,
83 value->data[0].v_int = collect_values[0].v_int;
89 value_lcopy_int (const GValue *value,
90 guint n_collect_values,
91 GTypeCValue *collect_values,
94 gint *int_p = collect_values[0].v_pointer;
97 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
99 *int_p = value->data[0].v_int;
105 value_collect_long (GValue *value,
106 guint n_collect_values,
107 GTypeCValue *collect_values,
110 value->data[0].v_long = collect_values[0].v_long;
116 value_lcopy_long (const GValue *value,
117 guint n_collect_values,
118 GTypeCValue *collect_values,
121 glong *long_p = collect_values[0].v_pointer;
124 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
126 *long_p = value->data[0].v_long;
132 value_init_float (GValue *value)
134 value->data[0].v_float = 0.0;
138 value_copy_float (const GValue *src_value,
141 dest_value->data[0].v_float = src_value->data[0].v_float;
145 value_collect_float (GValue *value,
146 guint n_collect_values,
147 GTypeCValue *collect_values,
150 value->data[0].v_float = collect_values[0].v_double;
156 value_lcopy_float (const GValue *value,
157 guint n_collect_values,
158 GTypeCValue *collect_values,
161 gfloat *float_p = collect_values[0].v_pointer;
164 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
166 *float_p = value->data[0].v_float;
172 value_init_double (GValue *value)
174 value->data[0].v_double = 0.0;
178 value_copy_double (const GValue *src_value,
181 dest_value->data[0].v_double = src_value->data[0].v_double;
185 value_collect_double (GValue *value,
186 guint n_collect_values,
187 GTypeCValue *collect_values,
190 value->data[0].v_double = collect_values[0].v_double;
196 value_lcopy_double (const GValue *value,
197 guint n_collect_values,
198 GTypeCValue *collect_values,
201 gdouble *double_p = collect_values[0].v_pointer;
204 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
206 *double_p = value->data[0].v_double;
212 value_init_string (GValue *value)
214 value->data[0].v_pointer = NULL;
218 value_free_string (GValue *value)
220 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
221 g_free (value->data[0].v_pointer);
225 value_copy_string (const GValue *src_value,
228 dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer);
232 value_collect_string (GValue *value,
233 guint n_collect_values,
234 GTypeCValue *collect_values,
237 if (!collect_values[0].v_pointer)
238 value->data[0].v_pointer = NULL;
239 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
241 value->data[0].v_pointer = collect_values[0].v_pointer;
242 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
245 value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
251 value_lcopy_string (const GValue *value,
252 guint n_collect_values,
253 GTypeCValue *collect_values,
256 gchar **string_p = collect_values[0].v_pointer;
259 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
261 if (!value->data[0].v_pointer)
263 else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
264 *string_p = value->data[0].v_pointer;
266 *string_p = g_strdup (value->data[0].v_pointer);
272 value_init_pointer (GValue *value)
274 value->data[0].v_pointer = NULL;
278 value_copy_pointer (const GValue *src_value,
281 dest_value->data[0].v_pointer = src_value->data[0].v_pointer;
285 value_peek_pointer0 (const GValue *value)
287 return value->data[0].v_pointer;
291 value_collect_pointer (GValue *value,
292 guint n_collect_values,
293 GTypeCValue *collect_values,
296 value->data[0].v_pointer = collect_values[0].v_pointer;
302 value_lcopy_pointer (const GValue *value,
303 guint n_collect_values,
304 GTypeCValue *collect_values,
307 gpointer *pointer_p = collect_values[0].v_pointer;
310 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
312 *pointer_p = value->data[0].v_pointer;
318 /* --- type initialization --- */
320 g_value_types_init (void) /* sync with gtype.c */
324 NULL, /* base_init */
325 NULL, /* base_destroy */
326 NULL, /* class_init */
327 NULL, /* class_destroy */
328 NULL, /* class_data */
329 0, /* instance_size */
331 NULL, /* instance_init */
332 NULL, /* value_table */
334 const GTypeFundamentalInfo finfo = { G_TYPE_FLAG_DERIVABLE, };
337 /* G_TYPE_CHAR / G_TYPE_UCHAR
340 static const GTypeValueTable value_table = {
341 value_init_long0, /* value_init */
342 NULL, /* value_free */
343 value_copy_long0, /* value_copy */
344 NULL, /* value_peek_pointer */
345 "i", /* collect_format */
346 value_collect_int, /* collect_value */
347 "p", /* lcopy_format */
348 value_lcopy_char, /* lcopy_value */
350 info.value_table = &value_table;
351 type = g_type_register_fundamental (G_TYPE_CHAR, "gchar", &info, &finfo, 0);
352 g_assert (type == G_TYPE_CHAR);
353 type = g_type_register_fundamental (G_TYPE_UCHAR, "guchar", &info, &finfo, 0);
354 g_assert (type == G_TYPE_UCHAR);
360 static const GTypeValueTable value_table = {
361 value_init_long0, /* value_init */
362 NULL, /* value_free */
363 value_copy_long0, /* value_copy */
364 NULL, /* value_peek_pointer */
365 "i", /* collect_format */
366 value_collect_int, /* collect_value */
367 "p", /* lcopy_format */
368 value_lcopy_boolean, /* lcopy_value */
370 info.value_table = &value_table;
371 type = g_type_register_fundamental (G_TYPE_BOOLEAN, "gboolean", &info, &finfo, 0);
372 g_assert (type == G_TYPE_BOOLEAN);
375 /* G_TYPE_INT / G_TYPE_UINT
378 static const GTypeValueTable value_table = {
379 value_init_long0, /* value_init */
380 NULL, /* value_free */
381 value_copy_long0, /* value_copy */
382 NULL, /* value_peek_pointer */
383 "i", /* collect_format */
384 value_collect_int, /* collect_value */
385 "p", /* lcopy_format */
386 value_lcopy_int, /* lcopy_value */
388 info.value_table = &value_table;
389 type = g_type_register_fundamental (G_TYPE_INT, "gint", &info, &finfo, 0);
390 g_assert (type == G_TYPE_INT);
391 type = g_type_register_fundamental (G_TYPE_UINT, "guint", &info, &finfo, 0);
392 g_assert (type == G_TYPE_UINT);
395 /* G_TYPE_LONG / G_TYPE_ULONG
398 static const GTypeValueTable value_table = {
399 value_init_long0, /* value_init */
400 NULL, /* value_free */
401 value_copy_long0, /* value_copy */
402 NULL, /* value_peek_pointer */
403 "l", /* collect_format */
404 value_collect_long, /* collect_value */
405 "p", /* lcopy_format */
406 value_lcopy_long, /* lcopy_value */
408 info.value_table = &value_table;
409 type = g_type_register_fundamental (G_TYPE_LONG, "glong", &info, &finfo, 0);
410 g_assert (type == G_TYPE_LONG);
411 type = g_type_register_fundamental (G_TYPE_ULONG, "gulong", &info, &finfo, 0);
412 g_assert (type == G_TYPE_ULONG);
418 static const GTypeValueTable value_table = {
419 value_init_float, /* value_init */
420 NULL, /* value_free */
421 value_copy_float, /* value_copy */
422 NULL, /* value_peek_pointer */
423 "d", /* collect_format */
424 value_collect_float, /* collect_value */
425 "p", /* lcopy_format */
426 value_lcopy_float, /* lcopy_value */
428 info.value_table = &value_table;
429 type = g_type_register_fundamental (G_TYPE_FLOAT, "gfloat", &info, &finfo, 0);
430 g_assert (type == G_TYPE_FLOAT);
436 static const GTypeValueTable value_table = {
437 value_init_double, /* value_init */
438 NULL, /* value_free */
439 value_copy_double, /* value_copy */
440 NULL, /* value_peek_pointer */
441 "d", /* collect_format */
442 value_collect_double, /* collect_value */
443 "p", /* lcopy_format */
444 value_lcopy_double, /* lcopy_value */
446 info.value_table = &value_table;
447 type = g_type_register_fundamental (G_TYPE_DOUBLE, "gdouble", &info, &finfo, 0);
448 g_assert (type == G_TYPE_DOUBLE);
454 static const GTypeValueTable value_table = {
455 value_init_string, /* value_init */
456 value_free_string, /* value_free */
457 value_copy_string, /* value_copy */
458 value_peek_pointer0, /* value_peek_pointer */
459 "p", /* collect_format */
460 value_collect_string, /* collect_value */
461 "p", /* lcopy_format */
462 value_lcopy_string, /* lcopy_value */
464 info.value_table = &value_table;
465 type = g_type_register_fundamental (G_TYPE_STRING, "gstring", &info, &finfo, 0);
466 g_assert (type == G_TYPE_STRING);
472 static const GTypeValueTable value_table = {
473 value_init_pointer, /* value_init */
474 NULL, /* value_free */
475 value_copy_pointer, /* value_copy */
476 value_peek_pointer0, /* value_peek_pointer */
477 "p", /* collect_format */
478 value_collect_pointer, /* collect_value */
479 "p", /* lcopy_format */
480 value_lcopy_pointer, /* lcopy_value */
482 info.value_table = &value_table;
483 type = g_type_register_fundamental (G_TYPE_POINTER, "gpointer", &info, &finfo, 0);
484 g_assert (type == G_TYPE_POINTER);
489 /* --- GValue functions --- */
491 g_value_set_char (GValue *value,
494 g_return_if_fail (G_VALUE_HOLDS_CHAR (value));
496 value->data[0].v_int = v_char;
500 g_value_get_char (const GValue *value)
502 g_return_val_if_fail (G_VALUE_HOLDS_CHAR (value), 0);
504 return value->data[0].v_int;
508 g_value_set_uchar (GValue *value,
511 g_return_if_fail (G_VALUE_HOLDS_UCHAR (value));
513 value->data[0].v_uint = v_uchar;
517 g_value_get_uchar (const GValue *value)
519 g_return_val_if_fail (G_VALUE_HOLDS_UCHAR (value), 0);
521 return value->data[0].v_uint;
525 g_value_set_boolean (GValue *value,
528 g_return_if_fail (G_VALUE_HOLDS_BOOLEAN (value));
530 value->data[0].v_int = v_boolean != FALSE;
534 g_value_get_boolean (const GValue *value)
536 g_return_val_if_fail (G_VALUE_HOLDS_BOOLEAN (value), 0);
538 return value->data[0].v_int;
542 g_value_set_int (GValue *value,
545 g_return_if_fail (G_VALUE_HOLDS_INT (value));
547 value->data[0].v_int = v_int;
551 g_value_get_int (const GValue *value)
553 g_return_val_if_fail (G_VALUE_HOLDS_INT (value), 0);
555 return value->data[0].v_int;
559 g_value_set_uint (GValue *value,
562 g_return_if_fail (G_VALUE_HOLDS_UINT (value));
564 value->data[0].v_uint = v_uint;
568 g_value_get_uint (const GValue *value)
570 g_return_val_if_fail (G_VALUE_HOLDS_UINT (value), 0);
572 return value->data[0].v_uint;
576 g_value_set_long (GValue *value,
579 g_return_if_fail (G_VALUE_HOLDS_LONG (value));
581 value->data[0].v_long = v_long;
585 g_value_get_long (const GValue *value)
587 g_return_val_if_fail (G_VALUE_HOLDS_LONG (value), 0);
589 return value->data[0].v_long;
593 g_value_set_ulong (GValue *value,
596 g_return_if_fail (G_VALUE_HOLDS_ULONG (value));
598 value->data[0].v_ulong = v_ulong;
602 g_value_get_ulong (const GValue *value)
604 g_return_val_if_fail (G_VALUE_HOLDS_ULONG (value), 0);
606 return value->data[0].v_ulong;
610 g_value_set_float (GValue *value,
613 g_return_if_fail (G_VALUE_HOLDS_FLOAT (value));
615 value->data[0].v_float = v_float;
619 g_value_get_float (const GValue *value)
621 g_return_val_if_fail (G_VALUE_HOLDS_FLOAT (value), 0);
623 return value->data[0].v_float;
627 g_value_set_double (GValue *value,
630 g_return_if_fail (G_VALUE_HOLDS_DOUBLE (value));
632 value->data[0].v_double = v_double;
636 g_value_get_double (const GValue *value)
638 g_return_val_if_fail (G_VALUE_HOLDS_DOUBLE (value), 0);
640 return value->data[0].v_double;
644 g_value_set_string (GValue *value,
645 const gchar *v_string)
647 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
649 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
650 value->data[1].v_uint = 0;
652 g_free (value->data[0].v_pointer);
653 value->data[0].v_pointer = g_strdup (v_string);
657 g_value_set_static_string (GValue *value,
658 const gchar *v_string)
660 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
662 if (!(value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS))
663 g_free (value->data[0].v_pointer);
664 value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
665 value->data[0].v_pointer = (gchar*) v_string;
669 g_value_set_string_take_ownership (GValue *value,
672 g_return_if_fail (G_VALUE_HOLDS_STRING (value));
674 if (value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS)
675 value->data[1].v_uint = 0;
677 g_free (value->data[0].v_pointer);
678 value->data[0].v_pointer = v_string;
681 G_CONST_RETURN gchar*
682 g_value_get_string (const GValue *value)
684 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
686 return value->data[0].v_pointer;
690 g_value_dup_string (const GValue *value)
692 g_return_val_if_fail (G_VALUE_HOLDS_STRING (value), NULL);
694 return g_strdup (value->data[0].v_pointer);
698 g_value_set_pointer (GValue *value,
701 g_return_if_fail (G_VALUE_HOLDS_POINTER (value));
703 value->data[0].v_pointer = v_pointer;
707 g_value_get_pointer (const GValue *value)
709 g_return_val_if_fail (G_VALUE_HOLDS_POINTER (value), NULL);
711 return value->data[0].v_pointer;