Fill in missing support for gint64 & guint64 (#59254).
authorJoshua N Pritikin <vishnu@src.gnome.org>
Thu, 11 Oct 2001 02:43:04 +0000 (02:43 +0000)
committerJoshua N Pritikin <vishnu@src.gnome.org>
Thu, 11 Oct 2001 02:43:04 +0000 (02:43 +0000)
* glib-genmarshal.c gparamspecs.[ch] gtype.[ch] gvalue.h
gvaluecollector.h gvaluetypes.[ch]: Fill in missing support for
gint64 & guint64 (#59254).

* Unconditionalize same (compile with or without G_HAVE_INT64).

gobject/ChangeLog
gobject/glib-genmarshal.c
gobject/gparamspecs.c
gobject/gparamspecs.h
gobject/gtype.c
gobject/gtype.h
gobject/gvalue.h
gobject/gvaluecollector.h
gobject/gvaluetypes.c
gobject/gvaluetypes.h

index 803d95d..139f641 100644 (file)
@@ -1,3 +1,11 @@
+Wed Oct 10 17:25:22 2001  Joshua N Pritikin  <vishnu@pobox.com>
+
+       * glib-genmarshal.c gparamspecs.[ch] gtype.[ch] gvalue.h
+       gvaluecollector.h gvaluetypes.[ch]: Fill in missing support for
+       gint64 & guint64 (#59254).
+       
+       * Unconditionalize same (compile with or without G_HAVE_INT64).
+
 Wed Oct 10 15:38:58 2001  Joshua N Pritikin  <vishnu@pobox.com>
 
        * gparamspecs.h (G_IS_PARAM_SPEC_FLAGS): Fix order of
index ff21629..2b49963 100644 (file)
@@ -144,6 +144,8 @@ complete_in_arg (InArgument *iarg)
     { "UINT",          "UINT",         "guint",        "g_value_get_uint",     },
     { "LONG",          "LONG",         "glong",        "g_value_get_long",     },
     { "ULONG",         "ULONG",        "gulong",       "g_value_get_ulong",    },
+    { "INT64",         "INT64",        "gint64",       "g_value_get_int64",    },
+    { "UINT64",                "UINT64",       "guint64",      "g_value_get_uint64",   },
     { "ENUM",          "ENUM",         "gint",         "g_value_get_enum",     },
     { "FLAGS",         "FLAGS",        "guint",        "g_value_get_flags",    },
     { "FLOAT",         "FLOAT",        "gfloat",       "g_value_get_float",    },
@@ -153,10 +155,6 @@ complete_in_arg (InArgument *iarg)
     { "BOXED",         "BOXED",        "gpointer",     "g_value_get_boxed",    },
     { "POINTER",       "POINTER",      "gpointer",     "g_value_get_pointer",  },
     { "OBJECT",                "OBJECT",       "gpointer",     "g_value_get_object",   },
-#ifdef G_HAVE_GINT64
-    { "INT64",         "INT64",        "gint64",       "g_value_get_int64",    },
-    { "UINT64",                "UINT64",       "guint64",      "g_value_get_uint64",   },
-#endif /* G_HAVE_GINT64 */
     /* deprecated: */
     { "NONE",          "VOID",         "void",         NULL,                   },
     { "BOOL",          "BOOLEAN",      "gboolean",     "g_value_get_boolean",  },
@@ -191,6 +189,8 @@ complete_out_arg (OutArgument *oarg)
     { "UINT",          "UINT",         "guint",        "g_value_set_uint",     NULL,                   NULL          },
     { "LONG",          "LONG",         "glong",        "g_value_set_long",     NULL,                   NULL          },
     { "ULONG",         "ULONG",        "gulong",       "g_value_set_ulong",    NULL,                   NULL          },
+    { "INT64",         "INT64",        "gint64",       "g_value_set_int64",    NULL,                   NULL          },
+    { "UINT64",                "UINT64",       "guint64",      "g_value_set_uint64",   NULL,                   NULL          },
     { "ENUM",          "ENUM",         "gint",         "g_value_set_enum",     NULL,                   NULL          },
     { "FLAGS",         "FLAGS",        "guint",        "g_value_set_flags",    NULL,                   NULL          },
     { "FLOAT",         "FLOAT",        "gfloat",       "g_value_set_float",    NULL,                   NULL          },
@@ -200,10 +200,6 @@ complete_out_arg (OutArgument *oarg)
     { "BOXED",         "BOXED",        "gpointer",     "g_value_set_boxed_take_ownership", NULL,       NULL          },
     { "POINTER",       "POINTER",      "gpointer",     "g_value_set_pointer",  NULL,                   NULL          },
     { "OBJECT",                "OBJECT",       "GObject*",     "g_value_set_object",   "g_object_unref",       "NULL !="     },
-#ifdef G_HAVE_GINT64
-    { "INT64",         "INT64",        "gint64",       "g_value_set_int64",    NULL,                   NULL          },
-    { "UINT64",                "UINT64",       "guint64",      "g_value_set_uint64",   NULL,                   NULL          },
-#endif /* G_HAVE_GINT64 */
     /* deprecated: */
     { "NONE",          "VOID",         "void",         NULL,                   NULL,                   NULL          },
     { "BOOL",          "BOOLEAN",      "gboolean",     "g_value_set_boolean",  NULL,                   NULL          }
index 182315f..00580ab 100644 (file)
@@ -279,6 +279,86 @@ param_ulong_values_cmp (GParamSpec   *pspec,
 }
 
 static void
+param_int64_init (GParamSpec *pspec)
+{
+  GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec);
+  
+  lspec->minimum = G_MININT64;
+  lspec->maximum = G_MAXINT64;
+  lspec->default_value = 0;
+}
+
+static void
+param_int64_set_default (GParamSpec *pspec,
+                       GValue     *value)
+{
+  value->data[0].v_int64 = G_PARAM_SPEC_INT64 (pspec)->default_value;
+}
+
+static gboolean
+param_int64_validate (GParamSpec *pspec,
+                    GValue     *value)
+{
+  GParamSpecInt64 *lspec = G_PARAM_SPEC_INT64 (pspec);
+  gint64 oval = value->data[0].v_int64;
+  
+  value->data[0].v_int64 = CLAMP (value->data[0].v_int64, lspec->minimum, lspec->maximum);
+  
+  return value->data[0].v_int64 != oval;
+}
+
+static gint
+param_int64_values_cmp (GParamSpec   *pspec,
+                      const GValue *value1,
+                      const GValue *value2)
+{
+  if (value1->data[0].v_int64 < value2->data[0].v_int64)
+    return -1;
+  else
+    return value1->data[0].v_int64 > value2->data[0].v_int64;
+}
+
+static void
+param_uint64_init (GParamSpec *pspec)
+{
+  GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec);
+  
+  uspec->minimum = 0;
+  uspec->maximum = G_MAXUINT64;
+  uspec->default_value = 0;
+}
+
+static void
+param_uint64_set_default (GParamSpec *pspec,
+                        GValue     *value)
+{
+  value->data[0].v_uint64 = G_PARAM_SPEC_UINT64 (pspec)->default_value;
+}
+
+static gboolean
+param_uint64_validate (GParamSpec *pspec,
+                     GValue     *value)
+{
+  GParamSpecUInt64 *uspec = G_PARAM_SPEC_UINT64 (pspec);
+  guint64 oval = value->data[0].v_uint64;
+  
+  value->data[0].v_uint64 = CLAMP (value->data[0].v_uint64, uspec->minimum, uspec->maximum);
+  
+  return value->data[0].v_uint64 != oval;
+}
+
+static gint
+param_uint64_values_cmp (GParamSpec   *pspec,
+                       const GValue *value1,
+                       const GValue *value2)
+{
+  if (value1->data[0].v_uint64 < value2->data[0].v_uint64)
+    return -1;
+  else
+    return value1->data[0].v_uint64 > value2->data[0].v_uint64;
+}
+
+static void
 param_unichar_init (GParamSpec *pspec)
 {
   GParamSpecUnichar *uspec = G_PARAM_SPEC_UNICHAR (pspec);
@@ -1042,6 +1122,40 @@ g_param_spec_types_init (void)   /* sync with gtype.c */
     g_assert (type == G_TYPE_PARAM_ULONG);
   }
 
+  /* G_TYPE_PARAM_INT64
+   */
+  {
+    static const GParamSpecTypeInfo pspec_info = {
+      sizeof (GParamSpecInt64),  /* instance_size */
+      16,                       /* n_preallocs */
+      param_int64_init,         /* instance_init */
+      G_TYPE_INT64,            /* value_type */
+      NULL,                    /* finalize */
+      param_int64_set_default, /* value_set_default */
+      param_int64_validate,    /* value_validate */
+      param_int64_values_cmp,  /* values_cmp */
+    };
+    type = g_param_type_register_static ("GParamInt64", &pspec_info);
+    g_assert (type == G_TYPE_PARAM_INT64);
+  }
+  
+  /* G_TYPE_PARAM_UINT64
+   */
+  {
+    static const GParamSpecTypeInfo pspec_info = {
+      sizeof (GParamSpecUInt64), /* instance_size */
+      16,                       /* n_preallocs */
+      param_uint64_init,        /* instance_init */
+      G_TYPE_UINT64,           /* value_type */
+      NULL,                    /* finalize */
+      param_uint64_set_default,        /* value_set_default */
+      param_uint64_validate,   /* value_validate */
+      param_uint64_values_cmp, /* values_cmp */
+    };
+    type = g_param_type_register_static ("GParamUInt64", &pspec_info);
+    g_assert (type == G_TYPE_PARAM_UINT64);
+  }
+
   /* G_TYPE_PARAM_UNICHAR
    */
   {
@@ -1428,6 +1542,58 @@ g_param_spec_ulong (const gchar *name,
 }
 
 GParamSpec*
+g_param_spec_int64 (const gchar *name,
+                  const gchar *nick,
+                  const gchar *blurb,
+                  gint64       minimum,
+                  gint64       maximum,
+                  gint64       default_value,
+                  GParamFlags  flags)
+{
+  GParamSpecInt64 *lspec;
+
+  g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+  lspec = g_param_spec_internal (G_TYPE_PARAM_INT64,
+                                name,
+                                nick,
+                                blurb,
+                                flags);
+  
+  lspec->minimum = minimum;
+  lspec->maximum = maximum;
+  lspec->default_value = default_value;
+  
+  return G_PARAM_SPEC (lspec);
+}
+
+GParamSpec*
+g_param_spec_uint64 (const gchar *name,
+                   const gchar *nick,
+                   const gchar *blurb,
+                   guint64      minimum,
+                   guint64      maximum,
+                   guint64      default_value,
+                   GParamFlags  flags)
+{
+  GParamSpecUInt64 *uspec;
+
+  g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
+
+  uspec = g_param_spec_internal (G_TYPE_PARAM_UINT64,
+                                name,
+                                nick,
+                                blurb,
+                                flags);
+  
+  uspec->minimum = minimum;
+  uspec->maximum = maximum;
+  uspec->default_value = default_value;
+  
+  return G_PARAM_SPEC (uspec);
+}
+
+GParamSpec*
 g_param_spec_unichar (const gchar *name,
                      const gchar *nick,
                      const gchar *blurb,
@@ -1698,59 +1864,3 @@ g_param_spec_object (const gchar *name,
   
   return G_PARAM_SPEC (ospec);
 }
-
-#ifdef G_HAVE_GINT64
-
-GParamSpec*
-g_param_spec_int64 (const gchar *name,
-                  const gchar *nick,
-                  const gchar *blurb,
-                  gint64        minimum,
-                  gint64       maximum,
-                  gint64       default_value,
-                  GParamFlags  flags)
-{
-  GParamSpecInt64 *ispec;
-
-  g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
-
-  ispec = g_param_spec_internal (G_TYPE_PARAM_INT64,
-                                name,
-                                nick,
-                                blurb,
-                                flags);
-  
-  ispec->minimum = minimum;
-  ispec->maximum = maximum;
-  ispec->default_value = default_value;
-  
-  return G_PARAM_SPEC (ispec);
-}
-
-GParamSpec*
-g_param_spec_uint64 (const gchar *name,
-                  const gchar *nick,
-                  const gchar *blurb,
-                  guint64        minimum,
-                  guint64      maximum,
-                  guint64      default_value,
-                  GParamFlags  flags)
-{
-  GParamSpecUInt64 *ispec;
-
-  g_return_val_if_fail (default_value >= minimum && default_value <= maximum, NULL);
-
-  ispec = g_param_spec_internal (G_TYPE_PARAM_UINT64,
-                                name,
-                                nick,
-                                blurb,
-                                flags);
-  
-  ispec->minimum = minimum;
-  ispec->maximum = maximum;
-  ispec->default_value = default_value;
-  
-  return G_PARAM_SPEC (ispec);
-}
-
-#endif /* G_HAVE_GINT64 */
index ca7fe42..972d918 100644 (file)
@@ -44,6 +44,10 @@ G_BEGIN_DECLS
 #define G_PARAM_SPEC_LONG(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_LONG, GParamSpecLong))
 #define G_IS_PARAM_SPEC_ULONG(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ULONG))
 #define G_PARAM_SPEC_ULONG(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_ULONG, GParamSpecULong))
+#define G_IS_PARAM_SPEC_INT64(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_INT64))
+#define G_PARAM_SPEC_INT64(pspec)           (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_INT64, GParamSpecInt64))
+#define G_IS_PARAM_SPEC_UINT64(pspec)       (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UINT64))
+#define G_PARAM_SPEC_UINT64(pspec)          (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UINT64, GParamSpecUInt64))
 #define G_PARAM_SPEC_UNICHAR(pspec)        (G_TYPE_CHECK_INSTANCE_CAST ((pspec), G_TYPE_PARAM_UNICHAR, GParamSpecUnichar))
 #define G_IS_PARAM_SPEC_UNICHAR(pspec)     (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_UNICHAR))
 #define G_IS_PARAM_SPEC_ENUM(pspec)        (G_TYPE_CHECK_INSTANCE_TYPE ((pspec), G_TYPE_PARAM_ENUM))
@@ -78,6 +82,8 @@ typedef struct _GParamSpecInt        GParamSpecInt;
 typedef struct _GParamSpecUInt       GParamSpecUInt;
 typedef struct _GParamSpecLong       GParamSpecLong;
 typedef struct _GParamSpecULong      GParamSpecULong;
+typedef struct _GParamSpecInt64      GParamSpecInt64;
+typedef struct _GParamSpecUInt64     GParamSpecUInt64;
 typedef struct _GParamSpecUnichar    GParamSpecUnichar;
 typedef struct _GParamSpecEnum       GParamSpecEnum;
 typedef struct _GParamSpecFlags      GParamSpecFlags;
@@ -90,10 +96,6 @@ typedef struct _GParamSpecPointer    GParamSpecPointer;
 typedef struct _GParamSpecValueArray GParamSpecValueArray;
 typedef struct _GParamSpecClosure    GParamSpecClosure;
 typedef struct _GParamSpecObject     GParamSpecObject;
-#ifdef G_HAVE_GINT64
-typedef struct _GParamSpecInt64      GParamSpecInt64;
-typedef struct _GParamSpecUInt64     GParamSpecUInt64;
-#endif /* G_HAVE_GINT64 */
 
 struct _GParamSpecChar
 {
@@ -149,6 +151,22 @@ struct _GParamSpecULong
   gulong        maximum;
   gulong        default_value;
 };
+struct _GParamSpecInt64
+{
+  GParamSpec    parent_instance;
+  
+  gint64        minimum;
+  gint64        maximum;
+  gint64        default_value;
+};
+struct _GParamSpecUInt64
+{
+  GParamSpec    parent_instance;
+  
+  guint64       minimum;
+  guint64       maximum;
+  guint64       default_value;
+};
 struct _GParamSpecUnichar
 {
   GParamSpec    parent_instance;
@@ -224,24 +242,6 @@ struct _GParamSpecObject
 {
   GParamSpec    parent_instance;
 };
-#ifdef G_HAVE_GINT64
-struct _GParamSpecInt64
-{
-  GParamSpec    parent_instance;
-  
-  gint64        minimum;
-  gint64        maximum;
-  gint64        default_value;
-};
-struct _GParamSpecUInt64
-{
-  GParamSpec    parent_instance;
-  
-  guint64       minimum;
-  guint64       maximum;
-  guint64       default_value;
-};
-#endif /* G_HAVE_GINT64 */
 
 /* --- GParamSpec prototypes --- */
 GParamSpec*    g_param_spec_char        (const gchar    *name,
@@ -291,6 +291,20 @@ GParamSpec*        g_param_spec_ulong       (const gchar    *name,
                                          gulong          maximum,
                                          gulong          default_value,
                                          GParamFlags     flags);
+GParamSpec*    g_param_spec_int64       (const gchar    *name,
+                                         const gchar    *nick,
+                                         const gchar    *blurb,
+                                         gint64          minimum,
+                                         gint64          maximum,
+                                         gint64          default_value,
+                                         GParamFlags     flags);
+GParamSpec*    g_param_spec_uint64      (const gchar    *name,
+                                         const gchar    *nick,
+                                         const gchar    *blurb,
+                                         guint64         minimum,
+                                         guint64         maximum,
+                                         guint64         default_value,
+                                         GParamFlags     flags);
 GParamSpec*    g_param_spec_unichar      (const gchar    *name,
                                          const gchar    *nick,
                                          const gchar    *blurb,
@@ -356,23 +370,6 @@ GParamSpec*        g_param_spec_object      (const gchar    *name,
                                          GType           object_type,
                                          GParamFlags     flags);
 
-#ifdef G_HAVE_GINT64
-GParamSpec*    g_param_spec_int64       (const gchar    *name,
-                                         const gchar    *nick,
-                                         const gchar    *blurb,
-                                         gint64          minimum,
-                                         gint64          maximum,
-                                         gint64          default_value,
-                                         GParamFlags     flags);
-GParamSpec*    g_param_spec_uint64      (const gchar    *name,
-                                         const gchar    *nick,
-                                         const gchar    *blurb,
-                                         guint64         minimum,
-                                         guint64         maximum,
-                                         guint64         default_value,
-                                         GParamFlags     flags);
-#endif /* G_HAVE_GINT64 */
-
 G_END_DECLS
 
 #endif /* __G_PARAMSPECS_H__ */
index 414c4d1..3d1cddc 100644 (file)
@@ -629,8 +629,8 @@ check_collect_format_I (const gchar *collect_format)
 {
   const gchar *p = collect_format;
   gchar valid_format[] = { G_VALUE_COLLECT_INT, G_VALUE_COLLECT_LONG,
-                          G_VALUE_COLLECT_DOUBLE, G_VALUE_COLLECT_POINTER,
-                          0 };
+                          G_VALUE_COLLECT_INT64, G_VALUE_COLLECT_DOUBLE,
+                          G_VALUE_COLLECT_POINTER, 0 };
 
   while (*p)
     if (!strchr (valid_format, *p++))
index 686638a..cd83270 100644 (file)
@@ -81,20 +81,20 @@ typedef enum    /*< skip >*/
   G_TYPE_PARAM_UINT            = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 5),
   G_TYPE_PARAM_LONG            = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 6),
   G_TYPE_PARAM_ULONG           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 7),
-  G_TYPE_PARAM_UNICHAR         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8),
-  G_TYPE_PARAM_ENUM            = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9),
-  G_TYPE_PARAM_FLAGS           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10),
-  G_TYPE_PARAM_FLOAT           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11),
-  G_TYPE_PARAM_DOUBLE          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12),
-  G_TYPE_PARAM_STRING          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13),
-  G_TYPE_PARAM_PARAM           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14),
-  G_TYPE_PARAM_BOXED           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15),
-  G_TYPE_PARAM_POINTER         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16),
-  G_TYPE_PARAM_VALUE_ARRAY     = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17),
-  G_TYPE_PARAM_CLOSURE         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18),
-  G_TYPE_PARAM_OBJECT          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 19),
-  G_TYPE_PARAM_INT64           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 20),
-  G_TYPE_PARAM_UINT64          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 21)
+  G_TYPE_PARAM_INT64           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 8),
+  G_TYPE_PARAM_UINT64          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 9),
+  G_TYPE_PARAM_UNICHAR         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 10),
+  G_TYPE_PARAM_ENUM            = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 11),
+  G_TYPE_PARAM_FLAGS           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 12),
+  G_TYPE_PARAM_FLOAT           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 13),
+  G_TYPE_PARAM_DOUBLE          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 14),
+  G_TYPE_PARAM_STRING          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 15),
+  G_TYPE_PARAM_PARAM           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 16),
+  G_TYPE_PARAM_BOXED           = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 17),
+  G_TYPE_PARAM_POINTER         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 18),
+  G_TYPE_PARAM_VALUE_ARRAY     = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 19),
+  G_TYPE_PARAM_CLOSURE         = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 20),
+  G_TYPE_PARAM_OBJECT          = G_TYPE_DERIVE_ID (G_TYPE_PARAM, 21)
 
 } GTypeFundamentals;
 
index 083cc57..4afb95c 100644 (file)
@@ -50,10 +50,8 @@ struct _GValue
     guint      v_uint;
     glong      v_long;
     gulong     v_ulong;
-#ifdef G_HAVE_GINT64
     gint64      v_int64;
     guint64     v_uint64;
-#endif /* G_HAVE_GINT64 */
     gfloat     v_float;
     gdouble    v_double;
     gpointer   v_pointer;
index 5f0cbbf..5ca80e9 100644 (file)
@@ -32,6 +32,7 @@ enum  /*< skip >*/
 {
   G_VALUE_COLLECT_INT          = 'i',
   G_VALUE_COLLECT_LONG         = 'l',
+  G_VALUE_COLLECT_INT64         = 'q',
   G_VALUE_COLLECT_DOUBLE       = 'd',
   G_VALUE_COLLECT_POINTER      = 'p'
 };
@@ -43,6 +44,7 @@ union _GTypeCValue
 {
   gint     v_int;
   glong    v_long;
+  gint64   v_int64;
   gdouble  v_double;
   gpointer v_pointer;
 };
@@ -84,6 +86,9 @@ G_STMT_START {                                                                                \
        case G_VALUE_COLLECT_LONG:                                                      \
          _cvalue->v_long = va_arg ((var_args), glong);                                 \
          break;                                                                        \
+       case G_VALUE_COLLECT_INT64:                                                     \
+         _cvalue->v_int64 = va_arg ((var_args), gint64);                                       \
+         break;                                                                        \
        case G_VALUE_COLLECT_DOUBLE:                                                    \
          _cvalue->v_double = va_arg ((var_args), gdouble);                             \
          break;                                                                        \
@@ -126,6 +131,9 @@ G_STMT_START {                                                                              \
        case G_VALUE_COLLECT_LONG:                                                      \
          _cvalue->v_long = va_arg ((var_args), glong);                                 \
          break;                                                                        \
+       case G_VALUE_COLLECT_INT64:                                                     \
+         _cvalue->v_int64 = va_arg ((var_args), gint64);                                       \
+         break;                                                                        \
        case G_VALUE_COLLECT_DOUBLE:                                                    \
          _cvalue->v_double = va_arg ((var_args), gdouble);                             \
          break;                                                                        \
index cdbcc07..042dea2 100644 (file)
@@ -129,6 +129,46 @@ value_lcopy_long (const GValue *value,
 }
 
 static void
+value_init_int64 (GValue *value)
+{
+  value->data[0].v_int64 = 0;
+}
+
+static void
+value_copy_int64 (const GValue *src_value,
+                GValue       *dest_value)
+{
+  dest_value->data[0].v_int64 = src_value->data[0].v_int64;
+}
+
+static gchar*
+value_collect_int64 (GValue      *value,
+                   guint        n_collect_values,
+                   GTypeCValue *collect_values,
+                   guint        collect_flags)
+{
+  value->data[0].v_int64 = collect_values[0].v_int64;
+  
+  return NULL;
+}
+
+static gchar*
+value_lcopy_int64 (const GValue *value,
+                 guint         n_collect_values,
+                 GTypeCValue  *collect_values,
+                 guint         collect_flags)
+{
+  gint64 *int64_p = collect_values[0].v_pointer;
+  
+  if (!int64_p)
+    return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
+  
+  *int64_p = value->data[0].v_int64;
+  
+  return NULL;
+}
+
+static void
 value_init_float (GValue *value)
 {
   value->data[0].v_float = 0.0;
@@ -412,6 +452,26 @@ g_value_types_init (void)  /* sync with gtype.c */
     g_assert (type == G_TYPE_ULONG);
   }
   
+  /* G_TYPE_INT64 / G_TYPE_UINT64
+   */
+  {
+    static const GTypeValueTable value_table = {
+      value_init_int64,                /* value_init */
+      NULL,                    /* value_free */
+      value_copy_int64,                /* value_copy */
+      NULL,                     /* value_peek_pointer */
+      "q",                     /* collect_format */
+      value_collect_int64,     /* collect_value */
+      "p",                     /* lcopy_format */
+      value_lcopy_int64,               /* lcopy_value */
+    };
+    info.value_table = &value_table;
+    type = g_type_register_fundamental (G_TYPE_INT64, "gint64", &info, &finfo, 0);
+    g_assert (type == G_TYPE_INT64);
+    type = g_type_register_fundamental (G_TYPE_UINT64, "guint64", &info, &finfo, 0);
+    g_assert (type == G_TYPE_UINT64);
+  }
+  
   /* G_TYPE_FLOAT
    */
   {
@@ -607,6 +667,40 @@ g_value_get_ulong (const GValue *value)
 }
 
 void
+g_value_set_int64 (GValue *value,
+                 gint64          v_int64)
+{
+  g_return_if_fail (G_VALUE_HOLDS_INT64 (value));
+  
+  value->data[0].v_int64 = v_int64;
+}
+
+gint64
+g_value_get_int64 (const GValue *value)
+{
+  g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0);
+  
+  return value->data[0].v_int64;
+}
+
+void
+g_value_set_uint64 (GValue *value,
+                  guint64  v_uint64)
+{
+  g_return_if_fail (G_VALUE_HOLDS_UINT64 (value));
+  
+  value->data[0].v_uint64 = v_uint64;
+}
+
+guint64
+g_value_get_uint64 (const GValue *value)
+{
+  g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0);
+  
+  return value->data[0].v_uint64;
+}
+
+void
 g_value_set_float (GValue *value,
                   gfloat  v_float)
 {
@@ -711,42 +805,6 @@ g_value_get_pointer (const GValue *value)
   return value->data[0].v_pointer;
 }
 
-#ifdef G_HAVE_GINT64
-void
-g_value_set_int64 (GValue *value,
-                 gint64 v_int64)
-{
-  g_return_if_fail (G_VALUE_HOLDS_INT64 (value));
-
-  value->data[0].v_int64 = v_int64;
-}
-
-gint64
-g_value_get_int64 (const GValue *value)
-{
-  g_return_val_if_fail (G_VALUE_HOLDS_INT64 (value), 0);
-
-  return value->data[0].v_int64;
-}
-
-void
-g_value_set_uint64 (GValue *value,
-                  guint64 v_uint64)
-{
-  g_return_if_fail (G_VALUE_HOLDS_UINT64 (value));
-
-  value->data[0].v_uint64 = v_uint64;
-}
-
-guint64
-g_value_get_uint64 (const GValue *value)
-{
-  g_return_val_if_fail (G_VALUE_HOLDS_UINT64 (value), 0);
-
-  return value->data[0].v_uint64;
-}
-#endif /* G_HAVE_GINT64 */
-
 /* need extra includes for g_strdup_value_contents() ;( */
 #include "gobject.h"
 #include "gparam.h"
index 00ebb83..6f74af3 100644 (file)
@@ -34,12 +34,12 @@ G_BEGIN_DECLS
 #define G_VALUE_HOLDS_UINT(value)       (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT))
 #define G_VALUE_HOLDS_LONG(value)       (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_LONG))
 #define G_VALUE_HOLDS_ULONG(value)      (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_ULONG))
+#define G_VALUE_HOLDS_INT64(value)      (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64))
+#define G_VALUE_HOLDS_UINT64(value)     (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64))
 #define G_VALUE_HOLDS_FLOAT(value)      (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT))
 #define G_VALUE_HOLDS_DOUBLE(value)     (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_DOUBLE))
 #define G_VALUE_HOLDS_STRING(value)     (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_STRING))
 #define G_VALUE_HOLDS_POINTER(value)    (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_POINTER))
-#define G_VALUE_HOLDS_INT64(value)      (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT64))
-#define G_VALUE_HOLDS_UINT64(value)     (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_UINT64))
 
 
 /* --- prototypes --- */
@@ -64,6 +64,12 @@ glong                      g_value_get_long          (const GValue *value);
 void                 g_value_set_ulong         (GValue       *value,
                                                 gulong        v_ulong);
 gulong               g_value_get_ulong         (const GValue *value);
+void                 g_value_set_int64         (GValue       *value,
+                                                gint64        v_int64);
+gint64               g_value_get_int64         (const GValue *value);
+void                 g_value_set_uint64        (GValue       *value,
+                                                guint64      v_uint64);
+guint64                      g_value_get_uint64        (const GValue *value);
 void                 g_value_set_float         (GValue       *value,
                                                 gfloat        v_float);
 gfloat               g_value_get_float         (const GValue *value);
@@ -79,14 +85,6 @@ gchar*                     g_value_dup_string        (const GValue *value);
 void                 g_value_set_pointer       (GValue       *value,
                                                 gpointer      v_pointer);
 gpointer             g_value_get_pointer       (const GValue *value);
-#ifdef G_HAVE_GINT64
-void                 g_value_set_int64         (GValue       *value,
-                                                gint64        v_int64);
-gint64               g_value_get_int64         (const GValue *value);
-void                 g_value_set_uint64        (GValue       *value,
-                                                guint64      v_uint64);
-guint64                      g_value_get_uint64        (const GValue *value);
-#endif /* G_HAVE_GINT64 */
 
 
 /* debugging aid, describe value contents as string */