gparamspecs.c revision 71a6ca2542299e9bf6d081e033f05e0153a6d210
1/* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1997, 1998, 1999, 2000 Tim Janik and Red Hat, Inc.
3 *
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.
8 *
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.
13 *
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.
18 */
19#include	"gparamspecs.h"
20
21#include	"gvaluecollector.h"
22#include	<string.h>
23#include	"../config.h"	/* for SIZEOF_LONG */
24
25#define	G_FLOAT_EPSILON		(1e-30)
26#define	G_DOUBLE_EPSILON	(1e-90)
27
28
29/* --- param spec functions --- */
30static void
31param_spec_char_init (GParamSpec *pspec)
32{
33  GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
34
35  cspec->minimum = 0x7f;
36  cspec->maximum = 0x80;
37  cspec->default_value = 0;
38}
39
40static void
41param_char_set_default (GParamSpec *pspec,
42			GValue	   *value)
43{
44  value->data[0].v_int = G_PARAM_SPEC_CHAR (pspec)->default_value;
45}
46
47static gboolean
48param_char_validate (GParamSpec *pspec,
49		     GValue     *value)
50{
51  GParamSpecChar *cspec = G_PARAM_SPEC_CHAR (pspec);
52  gint oval = value->data[0].v_int;
53
54  value->data[0].v_int = CLAMP (value->data[0].v_int, cspec->minimum, cspec->maximum);
55
56  return value->data[0].v_int != oval;
57}
58
59static void
60param_spec_uchar_init (GParamSpec *pspec)
61{
62  GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
63
64  uspec->minimum = 0;
65  uspec->maximum = 0xff;
66  uspec->default_value = 0;
67}
68
69static void
70param_uchar_set_default (GParamSpec *pspec,
71			 GValue	    *value)
72{
73  value->data[0].v_uint = G_PARAM_SPEC_UCHAR (pspec)->default_value;
74}
75
76static gboolean
77param_uchar_validate (GParamSpec *pspec,
78		      GValue     *value)
79{
80  GParamSpecUChar *uspec = G_PARAM_SPEC_UCHAR (pspec);
81  guint oval = value->data[0].v_uint;
82
83  value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
84
85  return value->data[0].v_uint != oval;
86}
87
88static void
89param_boolean_set_default (GParamSpec *pspec,
90			   GValue     *value)
91{
92  value->data[0].v_int = G_PARAM_SPEC_BOOLEAN (pspec)->default_value;
93}
94
95static gboolean
96param_boolean_validate (GParamSpec *pspec,
97			GValue     *value)
98{
99  gint oval = value->data[0].v_int;
100
101  value->data[0].v_int = value->data[0].v_int != FALSE;
102
103  return value->data[0].v_int != oval;
104}
105
106static void
107param_spec_int_init (GParamSpec *pspec)
108{
109  GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
110
111  ispec->minimum = 0x7fffffff;
112  ispec->maximum = 0x80000000;
113  ispec->default_value = 0;
114}
115
116static void
117param_int_set_default (GParamSpec *pspec,
118		       GValue     *value)
119{
120  value->data[0].v_int = G_PARAM_SPEC_INT (pspec)->default_value;
121}
122
123static gboolean
124param_int_validate (GParamSpec *pspec,
125		    GValue     *value)
126{
127  GParamSpecInt *ispec = G_PARAM_SPEC_INT (pspec);
128  gint oval = value->data[0].v_int;
129
130  value->data[0].v_int = CLAMP (value->data[0].v_int, ispec->minimum, ispec->maximum);
131
132  return value->data[0].v_int != oval;
133}
134
135static gint
136param_int_values_cmp (GParamSpec   *pspec,
137		      const GValue *value1,
138		      const GValue *value2)
139{
140  if (value1->data[0].v_int < value2->data[0].v_int)
141    return -1;
142  else
143    return value1->data[0].v_int > value2->data[0].v_int;
144}
145
146static void
147param_spec_uint_init (GParamSpec *pspec)
148{
149  GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
150
151  uspec->minimum = 0;
152  uspec->maximum = 0xffffffff;
153  uspec->default_value = 0;
154}
155
156static void
157param_uint_set_default (GParamSpec *pspec,
158			GValue     *value)
159{
160  value->data[0].v_uint = G_PARAM_SPEC_UINT (pspec)->default_value;
161}
162
163static gboolean
164param_uint_validate (GParamSpec *pspec,
165		     GValue     *value)
166{
167  GParamSpecUInt *uspec = G_PARAM_SPEC_UINT (pspec);
168  guint oval = value->data[0].v_uint;
169
170  value->data[0].v_uint = CLAMP (value->data[0].v_uint, uspec->minimum, uspec->maximum);
171
172  return value->data[0].v_uint != oval;
173}
174
175static gint
176param_uint_values_cmp (GParamSpec   *pspec,
177		       const GValue *value1,
178		       const GValue *value2)
179{
180  if (value1->data[0].v_uint < value2->data[0].v_uint)
181    return -1;
182  else
183    return value1->data[0].v_uint > value2->data[0].v_uint;
184}
185
186static void
187param_spec_long_init (GParamSpec *pspec)
188{
189  GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
190
191#if SIZEOF_LONG == 4
192  lspec->minimum = 0x7fffffff;
193  lspec->maximum = 0x80000000;
194#else /* SIZEOF_LONG != 4 (8) */
195  lspec->minimum = 0x7fffffffffffffff;
196  lspec->maximum = 0x8000000000000000;
197#endif
198  lspec->default_value = 0;
199}
200
201static void
202param_long_set_default (GParamSpec *pspec,
203			GValue     *value)
204{
205  value->data[0].v_long = G_PARAM_SPEC_LONG (pspec)->default_value;
206}
207
208static gboolean
209param_long_validate (GParamSpec *pspec,
210		     GValue     *value)
211{
212  GParamSpecLong *lspec = G_PARAM_SPEC_LONG (pspec);
213  glong oval = value->data[0].v_long;
214
215  value->data[0].v_long = CLAMP (value->data[0].v_long, lspec->minimum, lspec->maximum);
216
217  return value->data[0].v_long != oval;
218}
219
220static gint
221param_long_values_cmp (GParamSpec   *pspec,
222		       const GValue *value1,
223		       const GValue *value2)
224{
225  if (value1->data[0].v_long < value2->data[0].v_long)
226    return -1;
227  else
228    return value1->data[0].v_long > value2->data[0].v_long;
229}
230
231static void
232param_spec_ulong_init (GParamSpec *pspec)
233{
234  GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
235
236  uspec->minimum = 0;
237#if SIZEOF_LONG == 4
238  uspec->maximum = 0xffffffff;
239#else /* SIZEOF_LONG != 4 (8) */
240  uspec->maximum = 0xffffffffffffffff;
241#endif
242  uspec->default_value = 0;
243}
244
245static void
246param_ulong_set_default (GParamSpec *pspec,
247			 GValue     *value)
248{
249  value->data[0].v_ulong = G_PARAM_SPEC_ULONG (pspec)->default_value;
250}
251
252static gboolean
253param_ulong_validate (GParamSpec *pspec,
254		      GValue     *value)
255{
256  GParamSpecULong *uspec = G_PARAM_SPEC_ULONG (pspec);
257  gulong oval = value->data[0].v_ulong;
258
259  value->data[0].v_ulong = CLAMP (value->data[0].v_ulong, uspec->minimum, uspec->maximum);
260
261  return value->data[0].v_ulong != oval;
262}
263
264static gint
265param_ulong_values_cmp (GParamSpec   *pspec,
266			const GValue *value1,
267			const GValue *value2)
268{
269  if (value1->data[0].v_ulong < value2->data[0].v_ulong)
270    return -1;
271  else
272    return value1->data[0].v_ulong > value2->data[0].v_ulong;
273}
274
275static void
276param_spec_enum_init (GParamSpec *pspec)
277{
278  GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
279
280  espec->enum_class = NULL;
281  espec->default_value = 0;
282}
283
284static void
285param_spec_enum_finalize (GParamSpec *pspec)
286{
287  GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
288  GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_ENUM));
289
290  if (espec->enum_class)
291    {
292      g_type_class_unref (espec->enum_class);
293      espec->enum_class = NULL;
294    }
295
296  parent_class->finalize (pspec);
297}
298
299static void
300param_enum_set_default (GParamSpec *pspec,
301			GValue     *value)
302{
303  value->data[0].v_long = G_PARAM_SPEC_ENUM (pspec)->default_value;
304}
305
306static gboolean
307param_enum_validate (GParamSpec *pspec,
308		     GValue     *value)
309{
310  GParamSpecEnum *espec = G_PARAM_SPEC_ENUM (pspec);
311  glong oval = value->data[0].v_long;
312
313  if (!espec->enum_class ||
314      !g_enum_get_value (espec->enum_class, value->data[0].v_long))
315    value->data[0].v_long = espec->default_value;
316
317  return value->data[0].v_long != oval;
318}
319
320static void
321param_spec_flags_init (GParamSpec *pspec)
322{
323  GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
324
325  fspec->flags_class = NULL;
326  fspec->default_value = 0;
327}
328
329static void
330param_spec_flags_finalize (GParamSpec *pspec)
331{
332  GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
333  GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_FLAGS));
334
335  if (fspec->flags_class)
336    {
337      g_type_class_unref (fspec->flags_class);
338      fspec->flags_class = NULL;
339    }
340
341  parent_class->finalize (pspec);
342}
343
344static void
345param_flags_set_default (GParamSpec *pspec,
346			 GValue     *value)
347{
348  value->data[0].v_ulong = G_PARAM_SPEC_FLAGS (pspec)->default_value;
349}
350
351static gboolean
352param_flags_validate (GParamSpec *pspec,
353		      GValue     *value)
354{
355  GParamSpecFlags *fspec = G_PARAM_SPEC_FLAGS (pspec);
356  gulong oval = value->data[0].v_ulong;
357
358  if (fspec->flags_class)
359    value->data[0].v_ulong &= fspec->flags_class->mask;
360  else
361    value->data[0].v_ulong = fspec->default_value;
362
363  return value->data[0].v_ulong != oval;
364}
365
366static void
367param_spec_float_init (GParamSpec *pspec)
368{
369  GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
370
371  fspec->minimum = G_MINFLOAT;
372  fspec->maximum = G_MAXFLOAT;
373  fspec->default_value = 0;
374  fspec->epsilon = G_FLOAT_EPSILON;
375}
376
377static void
378param_float_set_default (GParamSpec *pspec,
379			 GValue     *value)
380{
381  value->data[0].v_float = G_PARAM_SPEC_FLOAT (pspec)->default_value;
382}
383
384static gboolean
385param_float_validate (GParamSpec *pspec,
386		      GValue     *value)
387{
388  GParamSpecFloat *fspec = G_PARAM_SPEC_FLOAT (pspec);
389  gfloat oval = value->data[0].v_float;
390
391  value->data[0].v_float = CLAMP (value->data[0].v_float, fspec->minimum, fspec->maximum);
392
393  return value->data[0].v_float != oval;
394}
395
396static gint
397param_float_values_cmp (GParamSpec   *pspec,
398			const GValue *value1,
399			const GValue *value2)
400{
401  gfloat epsilon = G_PARAM_SPEC_FLOAT (pspec)->epsilon;
402
403  if (value1->data[0].v_float < value2->data[0].v_float)
404    return - (value2->data[0].v_float - value1->data[0].v_float > epsilon);
405  else
406    return value1->data[0].v_float - value2->data[0].v_float > epsilon;
407}
408
409static void
410param_spec_double_init (GParamSpec *pspec)
411{
412  GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
413
414  dspec->minimum = G_MINDOUBLE;
415  dspec->maximum = G_MAXDOUBLE;
416  dspec->default_value = 0;
417  dspec->epsilon = G_DOUBLE_EPSILON;
418}
419
420static void
421param_double_set_default (GParamSpec *pspec,
422			  GValue     *value)
423{
424  value->data[0].v_double = G_PARAM_SPEC_DOUBLE (pspec)->default_value;
425}
426
427static gboolean
428param_double_validate (GParamSpec *pspec,
429		       GValue     *value)
430{
431  GParamSpecDouble *dspec = G_PARAM_SPEC_DOUBLE (pspec);
432  gdouble oval = value->data[0].v_double;
433
434  value->data[0].v_double = CLAMP (value->data[0].v_double, dspec->minimum, dspec->maximum);
435
436  return value->data[0].v_double != oval;
437}
438
439static gint
440param_double_values_cmp (GParamSpec   *pspec,
441			 const GValue *value1,
442			 const GValue *value2)
443{
444  gdouble epsilon = G_PARAM_SPEC_DOUBLE (pspec)->epsilon;
445
446  if (value1->data[0].v_double < value2->data[0].v_double)
447    return - (value2->data[0].v_double - value1->data[0].v_double > epsilon);
448  else
449    return value1->data[0].v_double - value2->data[0].v_double > epsilon;
450}
451
452static void
453param_spec_string_init (GParamSpec *pspec)
454{
455  GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
456
457  sspec->default_value = NULL;
458  sspec->cset_first = NULL;
459  sspec->cset_nth = NULL;
460  sspec->substitutor = '_';
461  sspec->null_fold_if_empty = FALSE;
462  sspec->ensure_non_null = FALSE;
463}
464
465static void
466param_spec_string_finalize (GParamSpec *pspec)
467{
468  GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
469  GParamSpecClass *parent_class = g_type_class_peek (g_type_parent (G_TYPE_PARAM_STRING));
470
471  g_free (sspec->default_value);
472  g_free (sspec->cset_first);
473  g_free (sspec->cset_nth);
474  sspec->default_value = NULL;
475  sspec->cset_first = NULL;
476  sspec->cset_nth = NULL;
477
478  parent_class->finalize (pspec);
479}
480
481static void
482param_string_set_default (GParamSpec *pspec,
483			  GValue     *value)
484{
485  value->data[0].v_pointer = g_strdup (G_PARAM_SPEC_STRING (pspec)->default_value);
486}
487
488static gboolean
489param_string_validate (GParamSpec *pspec,
490		       GValue     *value)
491{
492  GParamSpecString *sspec = G_PARAM_SPEC_STRING (pspec);
493  gchar *string = value->data[0].v_pointer;
494  guint changed = 0;
495
496  if (string && string[0])
497    {
498      gchar *s;
499
500      if (sspec->cset_first && !strchr (sspec->cset_first, string[0]))
501	{
502	  string[0] = sspec->substitutor;
503	  changed++;
504	}
505      if (sspec->cset_nth)
506	for (s = string + 1; *s; s++)
507	  if (!strchr (sspec->cset_nth, *s))
508	    {
509	      *s = sspec->substitutor;
510	      changed++;
511	    }
512    }
513  if (sspec->null_fold_if_empty && string && string[0] == 0)
514    {
515      g_free (value->data[0].v_pointer);
516      value->data[0].v_pointer = NULL;
517      changed++;
518      string = value->data[0].v_pointer;
519    }
520  if (sspec->ensure_non_null && !string)
521    {
522      value->data[0].v_pointer = g_strdup ("");
523      changed++;
524      string = value->data[0].v_pointer;
525    }
526
527  return changed;
528}
529
530static gint
531param_string_values_cmp (GParamSpec   *pspec,
532			 const GValue *value1,
533			 const GValue *value2)
534{
535  if (!value1->data[0].v_pointer)
536    return value2->data[0].v_pointer != NULL ? -1 : 0;
537  else if (!value2->data[0].v_pointer)
538    return value1->data[0].v_pointer != NULL;
539  else
540    return strcmp (value1->data[0].v_pointer, value2->data[0].v_pointer);
541}
542
543static void
544param_spec_param_init (GParamSpec *pspec)
545{
546  /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */
547}
548
549static void
550param_param_set_default (GParamSpec *pspec,
551			 GValue     *value)
552{
553  value->data[0].v_pointer = NULL;
554}
555
556static gboolean
557param_param_validate (GParamSpec *pspec,
558		      GValue     *value)
559{
560  /* GParamSpecParam *spec = G_PARAM_SPEC_PARAM (pspec); */
561  GParamSpec *param = value->data[0].v_pointer;
562  guint changed = 0;
563
564  if (param && !g_type_is_a (G_PARAM_SPEC_TYPE (param), G_PARAM_SPEC_VALUE_TYPE (pspec)))
565    {
566      g_param_spec_unref (param);
567      value->data[0].v_pointer = NULL;
568      changed++;
569    }
570
571  return changed;
572}
573
574static void
575param_spec_pointer_init (GParamSpec *pspec)
576{
577  /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
578}
579
580static void
581param_pointer_set_default (GParamSpec *pspec,
582			   GValue     *value)
583{
584  value->data[0].v_pointer = NULL;
585}
586
587static gboolean
588param_pointer_validate (GParamSpec *pspec,
589			GValue     *value)
590{
591  /* GParamSpecPointer *spec = G_PARAM_SPEC_POINTER (pspec); */
592  guint changed = 0;
593
594  return changed;
595}
596
597static gint
598param_pointer_values_cmp (GParamSpec   *pspec,
599			  const GValue *value1,
600			  const GValue *value2)
601{
602  return value1->data[0].v_pointer != value2->data[0].v_pointer;
603}
604
605static void
606param_spec_ccallback_init (GParamSpec *pspec)
607{
608  /* GParamSpecCCallback *spec = G_PARAM_SPEC_CCALLBACK (pspec); */
609}
610
611static void
612param_ccallback_set_default (GParamSpec *pspec,
613			     GValue     *value)
614{
615  value->data[0].v_pointer = NULL;
616  value->data[1].v_pointer = NULL;
617}
618
619static gboolean
620param_ccallback_validate (GParamSpec *pspec,
621			  GValue     *value)
622{
623  /* GParamSpecCCallback *spec = G_PARAM_SPEC_CCALLBACK (pspec); */
624  guint changed = 0;
625
626  return changed;
627}
628
629static gint
630param_ccallback_values_cmp (GParamSpec   *pspec,
631			    const GValue *value1,
632			    const GValue *value2)
633{
634  return (value1->data[0].v_pointer != value2->data[0].v_pointer ||
635	  value1->data[1].v_pointer != value2->data[1].v_pointer);
636}
637
638static void
639param_spec_boxed_init (GParamSpec *pspec)
640{
641  /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */
642}
643
644static void
645param_boxed_set_default (GParamSpec *pspec,
646			 GValue     *value)
647{
648  value->data[0].v_pointer = NULL;
649}
650
651static gboolean
652param_boxed_validate (GParamSpec *pspec,
653		      GValue     *value)
654{
655  /* GParamSpecBoxed *bspec = G_PARAM_SPEC_BOXED (pspec); */
656  guint changed = 0;
657
658  /* can't do a whole lot here since we haven't even G_BOXED_TYPE() */
659
660  return changed;
661}
662
663static gint
664param_boxed_values_cmp (GParamSpec    *pspec,
665			 const GValue *value1,
666			 const GValue *value2)
667{
668  return value1->data[0].v_pointer != value2->data[0].v_pointer;
669}
670
671static void
672param_spec_object_init (GParamSpec *pspec)
673{
674  /* GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec); */
675}
676
677static void
678param_object_set_default (GParamSpec *pspec,
679			  GValue     *value)
680{
681  value->data[0].v_pointer = NULL;
682}
683
684static gboolean
685param_object_validate (GParamSpec *pspec,
686		       GValue     *value)
687{
688  GParamSpecObject *ospec = G_PARAM_SPEC_OBJECT (pspec);
689  GObject *object = value->data[0].v_pointer;
690  guint changed = 0;
691
692  if (object && !g_type_is_a (G_OBJECT_TYPE (object), G_PARAM_SPEC_VALUE_TYPE (ospec)))
693    {
694      g_object_unref (object);
695      value->data[0].v_pointer = NULL;
696      changed++;
697    }
698
699  return changed;
700}
701
702static gint
703param_object_values_cmp (GParamSpec   *pspec,
704			 const GValue *value1,
705			 const GValue *value2)
706{
707  return value1->data[0].v_pointer != value2->data[0].v_pointer;
708}
709
710static void
711value_exch_memcpy (GValue *value1,
712		   GValue *value2)
713{
714  GValue tmp_value;
715  memcpy (&tmp_value.data, &value1->data, sizeof (value1->data));
716  memcpy (&value1->data, &value2->data, sizeof (value1->data));
717  memcpy (&value2->data, &tmp_value.data, sizeof (value2->data));
718}
719
720static void
721value_exch_long_int (GValue *value1,
722		     GValue *value2)
723{
724  glong tmp = value1->data[0].v_long;
725  value1->data[0].v_long = value2->data[0].v_int;
726  value2->data[0].v_int = tmp;
727}
728
729static void
730value_exch_long_uint (GValue *value1,
731		      GValue *value2)
732{
733  glong tmp = value1->data[0].v_long;
734  value1->data[0].v_long = value2->data[0].v_uint;
735  value2->data[0].v_uint = tmp;
736}
737
738static void
739value_exch_ulong_int (GValue *value1,
740		      GValue *value2)
741{
742  gulong tmp = value1->data[0].v_ulong;
743  value1->data[0].v_ulong = value2->data[0].v_int;
744  value2->data[0].v_int = tmp;
745}
746
747static void
748value_exch_ulong_uint (GValue *value1,
749		       GValue *value2)
750{
751  gulong tmp = value1->data[0].v_ulong;
752  value1->data[0].v_ulong = value2->data[0].v_uint;
753  value2->data[0].v_uint = tmp;
754}
755
756static void
757value_exch_float_int (GValue *value1,
758		      GValue *value2)
759{
760  gfloat tmp = value1->data[0].v_float;
761  value1->data[0].v_float = value2->data[0].v_int;
762  value2->data[0].v_int = 0.5 + tmp;
763}
764
765static void
766value_exch_float_uint (GValue *value1,
767		       GValue *value2)
768{
769  gfloat tmp = value1->data[0].v_float;
770  value1->data[0].v_float = value2->data[0].v_uint;
771  value2->data[0].v_uint = 0.5 + tmp;
772}
773
774static void
775value_exch_float_long (GValue *value1,
776		       GValue *value2)
777{
778  gfloat tmp = value1->data[0].v_float;
779  value1->data[0].v_float = value2->data[0].v_long;
780  value2->data[0].v_long = 0.5 + tmp;
781}
782
783static void
784value_exch_float_ulong (GValue *value1,
785			GValue *value2)
786{
787  gfloat tmp = value1->data[0].v_float;
788  value1->data[0].v_float = value2->data[0].v_ulong;
789  value2->data[0].v_ulong = 0.5 + tmp;
790}
791
792static void
793value_exch_double_int (GValue *value1,
794		       GValue *value2)
795{
796  gdouble tmp = value1->data[0].v_double;
797  value1->data[0].v_double = value2->data[0].v_int;
798  value2->data[0].v_int = 0.5 + tmp;
799}
800
801static void
802value_exch_double_uint (GValue *value1,
803			GValue *value2)
804{
805  gdouble tmp = value1->data[0].v_double;
806  value1->data[0].v_double = value2->data[0].v_uint;
807  value2->data[0].v_uint = 0.5 + tmp;
808}
809
810static void
811value_exch_double_long (GValue *value1,
812			GValue *value2)
813{
814  gdouble tmp = value1->data[0].v_double;
815  value1->data[0].v_double = value2->data[0].v_long;
816  value2->data[0].v_long = 0.5 + tmp;
817}
818
819static void
820value_exch_double_ulong (GValue *value1,
821			 GValue *value2)
822{
823  gdouble tmp = value1->data[0].v_double;
824  value1->data[0].v_double = value2->data[0].v_ulong;
825  value2->data[0].v_ulong = 0.5 + tmp;
826}
827
828static void
829value_exch_double_float (GValue *value1,
830			 GValue *value2)
831{
832  gdouble tmp = value1->data[0].v_double;
833  value1->data[0].v_double = value2->data[0].v_float;
834  value2->data[0].v_float = tmp;
835}
836
837
838/* --- type initialization --- */
839void
840g_param_spec_types_init (void)	/* sync with gtype.c */
841{
842  GType type;
843
844  /* G_TYPE_PARAM_CHAR
845   */
846  {
847    static const GParamSpecTypeInfo pspec_info = {
848      sizeof (GParamSpecChar),	/* instance_size */
849      16,			/* n_preallocs */
850      param_spec_char_init,	/* instance_init */
851      G_TYPE_CHAR,		/* value_type */
852      NULL,			/* finalize */
853      param_char_set_default,	/* value_set_default */
854      param_char_validate,	/* value_validate */
855      param_int_values_cmp,	/* values_cmp */
856    };
857    type = g_param_type_register_static ("GParamChar", &pspec_info);
858    g_assert (type == G_TYPE_PARAM_CHAR);
859  }
860
861  /* G_TYPE_PARAM_UCHAR
862   */
863  {
864    static const GParamSpecTypeInfo pspec_info = {
865      sizeof (GParamSpecUChar), /* instance_size */
866      16,                       /* n_preallocs */
867      param_spec_uchar_init,    /* instance_init */
868      G_TYPE_UCHAR,		/* value_type */
869      NULL,			/* finalize */
870      param_uchar_set_default,	/* value_set_default */
871      param_uchar_validate,	/* value_validate */
872      param_uint_values_cmp,	/* values_cmp */
873    };
874    type = g_param_type_register_static ("GParamUChar", &pspec_info);
875    g_assert (type == G_TYPE_PARAM_UCHAR);
876  }
877
878  /* G_TYPE_PARAM_BOOLEAN
879   */
880  {
881    static const GParamSpecTypeInfo pspec_info = {
882      sizeof (GParamSpecBoolean), /* instance_size */
883      16,                         /* n_preallocs */
884      NULL,			  /* instance_init */
885      G_TYPE_BOOLEAN,             /* value_type */
886      NULL,                       /* finalize */
887      param_boolean_set_default,  /* value_set_default */
888      param_boolean_validate,     /* value_validate */
889      param_int_values_cmp,       /* values_cmp */
890    };
891    type = g_param_type_register_static ("GParamBoolean", &pspec_info);
892    g_assert (type == G_TYPE_PARAM_BOOLEAN);
893  }
894
895  /* G_TYPE_PARAM_INT
896   */
897  {
898    static const GParamSpecTypeInfo pspec_info = {
899      sizeof (GParamSpecInt),   /* instance_size */
900      16,                       /* n_preallocs */
901      param_spec_int_init,      /* instance_init */
902      G_TYPE_INT,		/* value_type */
903      NULL,			/* finalize */
904      param_int_set_default,	/* value_set_default */
905      param_int_validate,	/* value_validate */
906      param_int_values_cmp,	/* values_cmp */
907    };
908    type = g_param_type_register_static ("GParamInt", &pspec_info);
909    g_assert (type == G_TYPE_PARAM_INT);
910  }
911
912  /* G_TYPE_PARAM_UINT
913   */
914  {
915    static const GParamSpecTypeInfo pspec_info = {
916      sizeof (GParamSpecUInt),  /* instance_size */
917      16,                       /* n_preallocs */
918      param_spec_uint_init,     /* instance_init */
919      G_TYPE_UINT,		/* value_type */
920      NULL,			/* finalize */
921      param_uint_set_default,	/* value_set_default */
922      param_uint_validate,	/* value_validate */
923      param_uint_values_cmp,	/* values_cmp */
924    };
925    type = g_param_type_register_static ("GParamUInt", &pspec_info);
926    g_assert (type == G_TYPE_PARAM_UINT);
927  }
928
929  /* G_TYPE_PARAM_LONG
930   */
931  {
932    static const GParamSpecTypeInfo pspec_info = {
933      sizeof (GParamSpecLong),  /* instance_size */
934      16,                       /* n_preallocs */
935      param_spec_long_init,     /* instance_init */
936      G_TYPE_LONG,		/* value_type */
937      NULL,			/* finalize */
938      param_long_set_default,	/* value_set_default */
939      param_long_validate,	/* value_validate */
940      param_long_values_cmp,	/* values_cmp */
941    };
942    type = g_param_type_register_static ("GParamLong", &pspec_info);
943    g_assert (type == G_TYPE_PARAM_LONG);
944  }
945
946  /* G_TYPE_PARAM_ULONG
947   */
948  {
949    static const GParamSpecTypeInfo pspec_info = {
950      sizeof (GParamSpecULong), /* instance_size */
951      16,                       /* n_preallocs */
952      param_spec_ulong_init,    /* instance_init */
953      G_TYPE_ULONG,		/* value_type */
954      NULL,			/* finalize */
955      param_ulong_set_default,	/* value_set_default */
956      param_ulong_validate,	/* value_validate */
957      param_ulong_values_cmp,	/* values_cmp */
958    };
959    type = g_param_type_register_static ("GParamULong", &pspec_info);
960    g_assert (type == G_TYPE_PARAM_ULONG);
961  }
962
963  /* G_TYPE_PARAM_ENUM
964   */
965  {
966    static const GParamSpecTypeInfo pspec_info = {
967      sizeof (GParamSpecEnum),  /* instance_size */
968      16,                       /* n_preallocs */
969      param_spec_enum_init,     /* instance_init */
970      G_TYPE_ENUM,		/* value_type */
971      param_spec_enum_finalize,	/* finalize */
972      param_enum_set_default,	/* value_set_default */
973      param_enum_validate,	/* value_validate */
974      param_long_values_cmp,	/* values_cmp */
975    };
976    type = g_param_type_register_static ("GParamEnum", &pspec_info);
977    g_assert (type == G_TYPE_PARAM_ENUM);
978  }
979
980  /* G_TYPE_PARAM_FLAGS
981   */
982  {
983    static const GParamSpecTypeInfo pspec_info = {
984      sizeof (GParamSpecFlags), /* instance_size */
985      16,                       /* n_preallocs */
986      param_spec_flags_init,    /* instance_init */
987      G_TYPE_FLAGS,		/* value_type */
988      param_spec_flags_finalize,/* finalize */
989      param_flags_set_default,	/* value_set_default */
990      param_flags_validate,	/* value_validate */
991      param_ulong_values_cmp,	/* values_cmp */
992    };
993    type = g_param_type_register_static ("GParamFlags", &pspec_info);
994    g_assert (type == G_TYPE_PARAM_FLAGS);
995  }
996
997  /* G_TYPE_PARAM_FLOAT
998   */
999  {
1000    static const GParamSpecTypeInfo pspec_info = {
1001      sizeof (GParamSpecFloat), /* instance_size */
1002      16,                       /* n_preallocs */
1003      param_spec_float_init,    /* instance_init */
1004      G_TYPE_FLOAT,		/* value_type */
1005      NULL,			/* finalize */
1006      param_float_set_default,	/* value_set_default */
1007      param_float_validate,	/* value_validate */
1008      param_float_values_cmp,	/* values_cmp */
1009    };
1010    type = g_param_type_register_static ("GParamFloat", &pspec_info);
1011    g_assert (type == G_TYPE_PARAM_FLOAT);
1012  }
1013
1014  /* G_TYPE_PARAM_DOUBLE
1015   */
1016  {
1017    static const GParamSpecTypeInfo pspec_info = {
1018      sizeof (GParamSpecDouble), /* instance_size */
1019      16,                        /* n_preallocs */
1020      param_spec_double_init,    /* instance_init */
1021      G_TYPE_DOUBLE,		 /* value_type */
1022      NULL,			 /* finalize */
1023      param_double_set_default,	 /* value_set_default */
1024      param_double_validate,	 /* value_validate */
1025      param_double_values_cmp,	 /* values_cmp */
1026    };
1027    type = g_param_type_register_static ("GParamDouble", &pspec_info);
1028    g_assert (type == G_TYPE_PARAM_DOUBLE);
1029  }
1030
1031  /* G_TYPE_PARAM_STRING
1032   */
1033  {
1034    static const GParamSpecTypeInfo pspec_info = {
1035      sizeof (GParamSpecString),  /* instance_size */
1036      16,			  /* n_preallocs */
1037      param_spec_string_init,	  /* instance_init */
1038      G_TYPE_STRING,		  /* value_type */
1039      param_spec_string_finalize, /* finalize */
1040      param_string_set_default,	  /* value_set_default */
1041      param_string_validate,	  /* value_validate */
1042      param_string_values_cmp,	  /* values_cmp */
1043    };
1044    type = g_param_type_register_static ("GParamString", &pspec_info);
1045    g_assert (type == G_TYPE_PARAM_STRING);
1046  }
1047
1048  /* G_TYPE_PARAM_PARAM
1049   */
1050  {
1051    static const GParamSpecTypeInfo pspec_info = {
1052      sizeof (GParamSpecParam),  /* instance_size */
1053      16,                        /* n_preallocs */
1054      param_spec_param_init,     /* instance_init */
1055      G_TYPE_PARAM,		 /* value_type */
1056      NULL,			 /* finalize */
1057      param_param_set_default,	 /* value_set_default */
1058      param_param_validate,	 /* value_validate */
1059      param_pointer_values_cmp,	 /* values_cmp */
1060    };
1061    type = g_param_type_register_static ("GParamParam", &pspec_info);
1062    g_assert (type == G_TYPE_PARAM_PARAM);
1063  }
1064
1065  /* G_TYPE_PARAM_POINTER
1066   */
1067  {
1068    static const GParamSpecTypeInfo pspec_info = {
1069      sizeof (GParamSpecPointer),  /* instance_size */
1070      0,                           /* n_preallocs */
1071      param_spec_pointer_init,     /* instance_init */
1072      G_TYPE_POINTER,  		   /* value_type */
1073      NULL,			   /* finalize */
1074      param_pointer_set_default,   /* value_set_default */
1075      param_pointer_validate,	   /* value_validate */
1076      param_pointer_values_cmp,	   /* values_cmp */
1077    };
1078    type = g_param_type_register_static ("GParamPointer", &pspec_info);
1079    g_assert (type == G_TYPE_PARAM_POINTER);
1080  }
1081
1082  /* G_TYPE_PARAM_CCALLBACK
1083   */
1084  {
1085    static const GParamSpecTypeInfo pspec_info = {
1086      sizeof (GParamSpecCCallback), /* instance_size */
1087      0,                            /* n_preallocs */
1088      param_spec_ccallback_init,    /* instance_init */
1089      G_TYPE_CCALLBACK,		    /* value_type */
1090      NULL,			    /* finalize */
1091      param_ccallback_set_default,  /* value_set_default */
1092      param_ccallback_validate,	    /* value_validate */
1093      param_ccallback_values_cmp,   /* values_cmp */
1094    };
1095    type = g_param_type_register_static ("GParamCCallback", &pspec_info);
1096    g_assert (type == G_TYPE_PARAM_CCALLBACK);
1097  }
1098
1099  /* G_TYPE_PARAM_BOXED
1100   */
1101  {
1102    static const GParamSpecTypeInfo pspec_info = {
1103      sizeof (GParamSpecBoxed),  /* instance_size */
1104      4,                         /* n_preallocs */
1105      param_spec_boxed_init,     /* instance_init */
1106      G_TYPE_BOXED,		 /* value_type */
1107      NULL,			 /* finalize */
1108      param_boxed_set_default,	 /* value_set_default */
1109      param_boxed_validate,	 /* value_validate */
1110      param_boxed_values_cmp,	 /* values_cmp */
1111    };
1112    type = g_param_type_register_static ("GParamBoxed", &pspec_info);
1113    g_assert (type == G_TYPE_PARAM_BOXED);
1114  }
1115
1116  /* G_TYPE_PARAM_OBJECT
1117   */
1118  {
1119    static const GParamSpecTypeInfo pspec_info = {
1120      sizeof (GParamSpecObject), /* instance_size */
1121      16,                        /* n_preallocs */
1122      param_spec_object_init,    /* instance_init */
1123      G_TYPE_OBJECT,		 /* value_type */
1124      NULL,			 /* finalize */
1125      param_object_set_default,	 /* value_set_default */
1126      param_object_validate,	 /* value_validate */
1127      param_object_values_cmp,	 /* values_cmp */
1128    };
1129    type = g_param_type_register_static ("GParamObject", &pspec_info);
1130    g_assert (type == G_TYPE_PARAM_OBJECT);
1131  }
1132
1133  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_UCHAR,   value_exch_memcpy);
1134  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_BOOLEAN, value_exch_memcpy);
1135  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_INT,     value_exch_memcpy);
1136  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_UINT,    value_exch_memcpy);
1137  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_ENUM,    value_exch_memcpy);
1138  g_value_register_exchange_func (G_TYPE_CHAR,    G_TYPE_FLAGS,   value_exch_memcpy);
1139  g_value_register_exchange_func (G_TYPE_UCHAR,   G_TYPE_BOOLEAN, value_exch_memcpy);
1140  g_value_register_exchange_func (G_TYPE_UCHAR,   G_TYPE_INT,     value_exch_memcpy);
1141  g_value_register_exchange_func (G_TYPE_UCHAR,   G_TYPE_UINT,    value_exch_memcpy);
1142  g_value_register_exchange_func (G_TYPE_UCHAR,   G_TYPE_ENUM,    value_exch_memcpy);
1143  g_value_register_exchange_func (G_TYPE_UCHAR,   G_TYPE_FLAGS,   value_exch_memcpy);
1144  g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_INT,     value_exch_memcpy);
1145  g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_UINT,    value_exch_memcpy);
1146  g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_ENUM,    value_exch_memcpy);
1147  g_value_register_exchange_func (G_TYPE_BOOLEAN, G_TYPE_FLAGS,   value_exch_memcpy);
1148  g_value_register_exchange_func (G_TYPE_INT,     G_TYPE_UINT,    value_exch_memcpy);
1149  g_value_register_exchange_func (G_TYPE_INT,     G_TYPE_ENUM,    value_exch_memcpy);
1150  g_value_register_exchange_func (G_TYPE_INT,     G_TYPE_FLAGS,   value_exch_memcpy);
1151  g_value_register_exchange_func (G_TYPE_UINT,    G_TYPE_ENUM,    value_exch_memcpy);
1152  g_value_register_exchange_func (G_TYPE_UINT,    G_TYPE_FLAGS,   value_exch_memcpy);
1153  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_CHAR,    value_exch_long_int);
1154  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_UCHAR,   value_exch_long_uint);
1155  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_BOOLEAN, value_exch_long_int);
1156  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_INT,     value_exch_long_int);
1157  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_UINT,    value_exch_long_uint);
1158  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_ULONG,   value_exch_memcpy);
1159  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_ENUM,    value_exch_long_int);
1160  g_value_register_exchange_func (G_TYPE_LONG,    G_TYPE_FLAGS,   value_exch_long_uint);
1161  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_CHAR,    value_exch_ulong_int);
1162  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_UCHAR,   value_exch_ulong_uint);
1163  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_BOOLEAN, value_exch_ulong_int);
1164  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_INT,     value_exch_ulong_int);
1165  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_UINT,    value_exch_ulong_uint);
1166  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_ENUM,    value_exch_ulong_int);
1167  g_value_register_exchange_func (G_TYPE_ULONG,   G_TYPE_FLAGS,   value_exch_ulong_uint);
1168  g_value_register_exchange_func (G_TYPE_ENUM,    G_TYPE_FLAGS,   value_exch_memcpy);
1169  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_CHAR,    value_exch_float_int);
1170  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_UCHAR,   value_exch_float_uint);
1171  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_BOOLEAN, value_exch_float_int);
1172  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_INT,     value_exch_float_int);
1173  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_UINT,    value_exch_float_uint);
1174  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_LONG,    value_exch_float_long);
1175  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_ULONG,   value_exch_float_ulong);
1176  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_ENUM,    value_exch_float_int);
1177  g_value_register_exchange_func (G_TYPE_FLOAT,   G_TYPE_FLAGS,   value_exch_float_uint);
1178  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_CHAR,    value_exch_double_int);
1179  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_UCHAR,   value_exch_double_uint);
1180  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_BOOLEAN, value_exch_double_int);
1181  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_INT,     value_exch_double_int);
1182  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_UINT,    value_exch_double_uint);
1183  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_LONG,    value_exch_double_long);
1184  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_ULONG,   value_exch_double_ulong);
1185  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_ENUM,    value_exch_double_int);
1186  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_FLAGS,   value_exch_double_uint);
1187  g_value_register_exchange_func (G_TYPE_DOUBLE,  G_TYPE_FLOAT,   value_exch_double_float);
1188}
1189
1190
1191/* --- GParamSpec initialization --- */
1192GParamSpec*
1193g_param_spec_char (const gchar *name,
1194		   const gchar *nick,
1195		   const gchar *blurb,
1196		   gint8	minimum,
1197		   gint8	maximum,
1198		   gint8	default_value,
1199		   GParamFlags	flags)
1200{
1201  GParamSpecChar *cspec = g_param_spec_internal (G_TYPE_PARAM_CHAR,
1202						 name,
1203						 nick,
1204						 blurb,
1205						 flags);
1206
1207  cspec->minimum = minimum;
1208  cspec->maximum = maximum;
1209  cspec->default_value = default_value;
1210
1211  return G_PARAM_SPEC (cspec);
1212}
1213
1214GParamSpec*
1215g_param_spec_uchar (const gchar *name,
1216		    const gchar *nick,
1217		    const gchar *blurb,
1218		    guint8	 minimum,
1219		    guint8	 maximum,
1220		    guint8	 default_value,
1221		    GParamFlags	 flags)
1222{
1223  GParamSpecUChar *uspec = g_param_spec_internal (G_TYPE_PARAM_UCHAR,
1224						  name,
1225						  nick,
1226						  blurb,
1227						  flags);
1228
1229  uspec->minimum = minimum;
1230  uspec->maximum = maximum;
1231  uspec->default_value = default_value;
1232
1233  return G_PARAM_SPEC (uspec);
1234}
1235
1236GParamSpec*
1237g_param_spec_boolean (const gchar *name,
1238		      const gchar *nick,
1239		      const gchar *blurb,
1240		      gboolean	   default_value,
1241		      GParamFlags  flags)
1242{
1243  GParamSpecBoolean *bspec = g_param_spec_internal (G_TYPE_PARAM_BOOLEAN,
1244						    name,
1245						    nick,
1246						    blurb,
1247						    flags);
1248
1249  bspec->default_value = default_value;
1250
1251  return G_PARAM_SPEC (bspec);
1252}
1253
1254GParamSpec*
1255g_param_spec_int (const gchar *name,
1256		  const gchar *nick,
1257		  const gchar *blurb,
1258		  gint	       minimum,
1259		  gint	       maximum,
1260		  gint	       default_value,
1261		  GParamFlags  flags)
1262{
1263  GParamSpecInt *ispec = g_param_spec_internal (G_TYPE_PARAM_INT,
1264						name,
1265						nick,
1266						blurb,
1267						flags);
1268
1269  ispec->minimum = minimum;
1270  ispec->maximum = maximum;
1271  ispec->default_value = default_value;
1272
1273  return G_PARAM_SPEC (ispec);
1274}
1275
1276GParamSpec*
1277g_param_spec_uint (const gchar *name,
1278		   const gchar *nick,
1279		   const gchar *blurb,
1280		   guint	minimum,
1281		   guint	maximum,
1282		   guint	default_value,
1283		   GParamFlags	flags)
1284{
1285  GParamSpecUInt *uspec = g_param_spec_internal (G_TYPE_PARAM_UINT,
1286						 name,
1287						 nick,
1288						 blurb,
1289						 flags);
1290
1291  uspec->minimum = minimum;
1292  uspec->maximum = maximum;
1293  uspec->default_value = default_value;
1294
1295  return G_PARAM_SPEC (uspec);
1296}
1297
1298GParamSpec*
1299g_param_spec_long (const gchar *name,
1300		   const gchar *nick,
1301		   const gchar *blurb,
1302		   glong	minimum,
1303		   glong	maximum,
1304		   glong	default_value,
1305		   GParamFlags	flags)
1306{
1307  GParamSpecLong *lspec = g_param_spec_internal (G_TYPE_PARAM_LONG,
1308						 name,
1309						 nick,
1310						 blurb,
1311						 flags);
1312
1313  lspec->minimum = minimum;
1314  lspec->maximum = maximum;
1315  lspec->default_value = default_value;
1316
1317  return G_PARAM_SPEC (lspec);
1318}
1319
1320GParamSpec*
1321g_param_spec_ulong (const gchar *name,
1322		    const gchar *nick,
1323		    const gchar *blurb,
1324		    gulong	 minimum,
1325		    gulong	 maximum,
1326		    gulong	 default_value,
1327		    GParamFlags	 flags)
1328{
1329  GParamSpecULong *uspec = g_param_spec_internal (G_TYPE_PARAM_ULONG,
1330						  name,
1331						  nick,
1332						  blurb,
1333						  flags);
1334
1335  uspec->minimum = minimum;
1336  uspec->maximum = maximum;
1337  uspec->default_value = default_value;
1338
1339  return G_PARAM_SPEC (uspec);
1340}
1341
1342GParamSpec*
1343g_param_spec_enum (const gchar *name,
1344		   const gchar *nick,
1345		   const gchar *blurb,
1346		   GType	enum_type,
1347		   gint		default_value,
1348		   GParamFlags	flags)
1349{
1350  GParamSpecEnum *espec;
1351
1352  g_return_val_if_fail (G_TYPE_IS_ENUM (enum_type), NULL);
1353
1354  espec = g_param_spec_internal (G_TYPE_PARAM_ENUM,
1355				 name,
1356				 nick,
1357				 blurb,
1358				 flags);
1359
1360  espec->enum_class = g_type_class_ref (enum_type);
1361  espec->default_value = default_value;
1362
1363  return G_PARAM_SPEC (espec);
1364}
1365
1366GParamSpec*
1367g_param_spec_flags (const gchar *name,
1368		    const gchar *nick,
1369		    const gchar *blurb,
1370		    GType	 flags_type,
1371		    guint	 default_value,
1372		    GParamFlags	 flags)
1373{
1374  GParamSpecFlags *fspec;
1375
1376  g_return_val_if_fail (G_TYPE_IS_FLAGS (flags_type), NULL);
1377
1378  fspec = g_param_spec_internal (G_TYPE_PARAM_FLAGS,
1379				 name,
1380				 nick,
1381				 blurb,
1382				 flags);
1383
1384  fspec->flags_class = g_type_class_ref (flags_type);
1385  fspec->default_value = default_value;
1386
1387  return G_PARAM_SPEC (fspec);
1388}
1389
1390GParamSpec*
1391g_param_spec_float (const gchar *name,
1392		    const gchar *nick,
1393		    const gchar *blurb,
1394		    gfloat	 minimum,
1395		    gfloat	 maximum,
1396		    gfloat	 default_value,
1397		    GParamFlags	 flags)
1398{
1399  GParamSpecFloat *fspec = g_param_spec_internal (G_TYPE_PARAM_FLOAT,
1400						  name,
1401						  nick,
1402						  blurb,
1403						  flags);
1404
1405  fspec->minimum = minimum;
1406  fspec->maximum = maximum;
1407  fspec->default_value = default_value;
1408
1409  return G_PARAM_SPEC (fspec);
1410}
1411
1412GParamSpec*
1413g_param_spec_double (const gchar *name,
1414		     const gchar *nick,
1415		     const gchar *blurb,
1416		     gdouble	  minimum,
1417		     gdouble	  maximum,
1418		     gdouble	  default_value,
1419		     GParamFlags  flags)
1420{
1421  GParamSpecDouble *dspec = g_param_spec_internal (G_TYPE_PARAM_DOUBLE,
1422						   name,
1423						   nick,
1424						   blurb,
1425						   flags);
1426
1427  dspec->minimum = minimum;
1428  dspec->maximum = maximum;
1429  dspec->default_value = default_value;
1430
1431  return G_PARAM_SPEC (dspec);
1432}
1433
1434GParamSpec*
1435g_param_spec_string (const gchar *name,
1436		     const gchar *nick,
1437		     const gchar *blurb,
1438		     const gchar *default_value,
1439		     GParamFlags  flags)
1440{
1441  GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING,
1442						   name,
1443						   nick,
1444						   blurb,
1445						   flags);
1446  g_free (sspec->default_value);
1447  sspec->default_value = g_strdup (default_value);
1448
1449  return G_PARAM_SPEC (sspec);
1450}
1451
1452GParamSpec*
1453g_param_spec_string_c (const gchar *name,
1454		       const gchar *nick,
1455		       const gchar *blurb,
1456		       const gchar *default_value,
1457		       GParamFlags  flags)
1458{
1459  GParamSpecString *sspec = g_param_spec_internal (G_TYPE_PARAM_STRING,
1460						   name,
1461						   nick,
1462						   blurb,
1463						   flags);
1464  g_free (sspec->default_value);
1465  sspec->default_value = g_strdup (default_value);
1466  g_free (sspec->cset_first);
1467  sspec->cset_first = g_strdup (G_CSET_a_2_z "_" G_CSET_A_2_Z);
1468  g_free (sspec->cset_nth);
1469  sspec->cset_nth = g_strdup (G_CSET_a_2_z
1470			      "_0123456789"
1471			      /* G_CSET_LATINS G_CSET_LATINC */
1472			      G_CSET_A_2_Z);
1473
1474  return G_PARAM_SPEC (sspec);
1475}
1476
1477GParamSpec*
1478g_param_spec_param (const gchar *name,
1479		    const gchar *nick,
1480		    const gchar *blurb,
1481		    GType	 param_type,
1482		    GParamFlags  flags)
1483{
1484  GParamSpecParam *pspec;
1485
1486  g_return_val_if_fail (G_TYPE_IS_PARAM (param_type), NULL);
1487
1488  pspec = g_param_spec_internal (G_TYPE_PARAM_PARAM,
1489				 name,
1490				 nick,
1491				 blurb,
1492				 flags);
1493  G_PARAM_SPEC (pspec)->value_type = param_type;
1494
1495  return G_PARAM_SPEC (pspec);
1496}
1497
1498GParamSpec*
1499g_param_spec_pointer (const gchar *name,
1500		      const gchar *nick,
1501		      const gchar *blurb,
1502		      GParamFlags  flags)
1503{
1504  GParamSpecPointer *pspec;
1505
1506  pspec = g_param_spec_internal (G_TYPE_PARAM_POINTER,
1507				 name,
1508				 nick,
1509				 blurb,
1510				 flags);
1511  return G_PARAM_SPEC (pspec);
1512}
1513
1514GParamSpec*
1515g_param_spec_ccallback (const gchar *name,
1516			const gchar *nick,
1517			const gchar *blurb,
1518			GParamFlags  flags)
1519{
1520  GParamSpecCCallback *cspec;
1521
1522  cspec = g_param_spec_internal (G_TYPE_PARAM_CCALLBACK,
1523				 name,
1524				 nick,
1525				 blurb,
1526				 flags);
1527  return G_PARAM_SPEC (cspec);
1528}
1529
1530GParamSpec*
1531g_param_spec_boxed (const gchar *name,
1532		    const gchar *nick,
1533		    const gchar *blurb,
1534		    GType	 boxed_type,
1535		    GParamFlags  flags)
1536{
1537  GParamSpecBoxed *bspec;
1538
1539  g_return_val_if_fail (G_TYPE_IS_BOXED (boxed_type), NULL);
1540  g_return_val_if_fail (G_TYPE_IS_DERIVED (boxed_type), NULL);
1541
1542  bspec = g_param_spec_internal (G_TYPE_PARAM_BOXED,
1543				 name,
1544				 nick,
1545				 blurb,
1546				 flags);
1547  G_PARAM_SPEC (bspec)->value_type = boxed_type;
1548
1549  return G_PARAM_SPEC (bspec);
1550}
1551
1552GParamSpec*
1553g_param_spec_object (const gchar *name,
1554		     const gchar *nick,
1555		     const gchar *blurb,
1556		     GType	  object_type,
1557		     GParamFlags  flags)
1558{
1559  GParamSpecObject *ospec;
1560
1561  g_return_val_if_fail (G_TYPE_IS_OBJECT (object_type), NULL);
1562
1563  ospec = g_param_spec_internal (G_TYPE_PARAM_OBJECT,
1564				 name,
1565				 nick,
1566				 blurb,
1567				 flags);
1568  G_PARAM_SPEC (ospec)->value_type = object_type;
1569
1570  return G_PARAM_SPEC (ospec);
1571}
1572