cleanup
[platform/upstream/glib.git] / gobject / gvaluecollector.h
index 04522de..11a1ad8 100644 (file)
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  * gvaluecollector.h: GValue varargs stubs
  */
+/**
+ * SECTION:value_collection
+ * @Short_description: Converting varargs to generic values
+ * @Title: Varargs Value Collection
+ * 
+ * The macros in this section provide the varargs parsing support needed
+ * in variadic GObject functions such as g_object_new() or g_object_set().
+ * They currently support the collection of integral types, floating point 
+ * types and pointers.
+ */
 #ifndef __G_VALUE_COLLECTOR_H__
 #define __G_VALUE_COLLECTOR_H__
 
+#include <glib-object.h>
+
 G_BEGIN_DECLS
 
 /* we may want to add aggregate types here some day, if requested
@@ -32,46 +42,59 @@ 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'
 };
 
 
-/* vararg union holding actuall values collected
+/* vararg union holding actual values collected
+ */
+/**
+ * GTypeCValue:
+ * @v_int: the field for holding integer values
+ * @v_long: the field for holding long integer values
+ * @v_int64: the field for holding 64 bit integer values
+ * @v_double: the field for holding floating point values
+ * @v_pointer: the field for holding pointers
+ * 
+ * A union holding one collected value.
  */
 union _GTypeCValue
 {
   gint     v_int;
   glong    v_long;
+  gint64   v_int64;
   gdouble  v_double;
   gpointer v_pointer;
 };
 
-
-/* G_VALUE_COLLECT() collects a variable argument value
- * from a va_list. we have to implement the varargs collection as a
- * macro, because on some systems va_list variables cannot be passed
- * by reference.
- * value is supposed to be initialized according to the value
- * type to be collected.
- * var_args is the va_list variable and may be evaluated multiple times.
- * __error is a gchar** variable that will be modified to hold a g_new()
- * allocated error messages if something fails.
+/**
+ * G_VALUE_COLLECT_INIT:
+ * @value: a #GValue return location. @value must contain only 0 bytes.
+ * @_value_type: the #GType to use for @value.
+ * @var_args: the va_list variable; it may be evaluated multiple times
+ * @flags: flags which are passed on to the collect_value() function of
+ *  the #GTypeValueTable of @value.
+ * @__error: a #gchar** variable that will be modified to hold a g_new()
+ *  allocated error messages if something fails
+ * 
+ * Collects a variable argument value from a va_list. We have to
+ * implement the varargs collection as a macro, because on some systems
+ * va_list variables cannot be passed by reference.
+ *
+ * Since: 2.24
  */
-#define G_VALUE_COLLECT(value, var_args, flags, __error)                               \
+#define G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error)             \
 G_STMT_START {                                                                         \
-  GValue *_value = (value);                                                            \
+  GValue *_val = (value);                                                              \
   guint _flags = (flags);                                                              \
-  GType _value_type = G_VALUE_TYPE (_value);                                           \
-  GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                    \
-  gchar *_collect_format = _vtable->collect_format;                                    \
+  GTypeValueTable *_vtab = g_type_value_table_peek (_value_type);                      \
+  const gchar *_collect_format = _vtab->collect_format;                                        \
   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };               \
   guint _n_values = 0;                                                                 \
                                                                                         \
-  if (_vtable->value_free)                                                             \
-    _vtable->value_free (_value);                                                      \
-  _value->g_type = _value_type;                /* value_meminit() from gvalue.c */             \
-  memset (_value->data, 0, sizeof (_value->data));                                     \
+  _val->g_type = _value_type;          /* value_meminit() from gvalue.c */             \
   while (*_collect_format)                                                             \
     {                                                                                  \
       GTypeCValue *_cvalue = _cvalues + _n_values++;                                   \
@@ -84,6 +107,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;                                                                        \
@@ -94,23 +120,92 @@ G_STMT_START {                                                                             \
          g_assert_not_reached ();                                                      \
        }                                                                               \
     }                                                                                  \
-  *(__error) = _vtable->collect_value (_value,                                         \
+  *(__error) = _vtab->collect_value (_val,                                             \
                                       _n_values,                                       \
                                       _cvalues,                                        \
                                       _flags);                                         \
 } G_STMT_END
 
+/**
+ * G_VALUE_COLLECT:
+ * @value: a #GValue return location. @value is supposed to be initialized
+ *  according to the value type to be collected
+ * @var_args: the va_list variable; it may be evaluated multiple times
+ * @flags: flags which are passed on to the collect_value() function of
+ *  the #GTypeValueTable of @value.
+ * @__error: a #gchar** variable that will be modified to hold a g_new()
+ *  allocated error messages if something fails
+ *
+ * Collects a variable argument value from a va_list. We have to
+ * implement the varargs collection as a macro, because on some systems
+ * va_list variables cannot be passed by reference.
+ *
+ * Note: If you are creating the @value argument just before calling this macro,
+ * you should use the #G_VALUE_COLLECT_INIT variant and pass the unitialized
+ * #GValue. That variant is faster than #G_VALUE_COLLECT.
+ */
+#define G_VALUE_COLLECT(value, var_args, flags, __error) G_STMT_START {                        \
+  GValue *_value = (value);                                                            \
+  GType _value_type = G_VALUE_TYPE (_value);                                           \
+  GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                    \
+                                                                                       \
+  if (_vtable->value_free)                                                             \
+    _vtable->value_free (_value);                                                      \
+  memset (_value->data, 0, sizeof (_value->data));                                     \
+                                                                                       \
+  G_VALUE_COLLECT_INIT(value, _value_type, var_args, flags, __error);                  \
+} G_STMT_END
 
-/* G_VALUE_LCOPY() collects a value's variable argument
- * locations from a va_list. usage is analogous to G_VALUE_COLLECT().
+#define G_VALUE_COLLECT_SKIP(_value_type, var_args)                                    \
+G_STMT_START {                                                                         \
+  GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                    \
+  const gchar *_collect_format = _vtable->collect_format;                              \
+                                                                                        \
+  while (*_collect_format)                                                             \
+    {                                                                                  \
+      switch (*_collect_format++)                                                      \
+       {                                                                               \
+       case G_VALUE_COLLECT_INT:                                                       \
+         va_arg ((var_args), gint);                                                    \
+         break;                                                                        \
+       case G_VALUE_COLLECT_LONG:                                                      \
+         va_arg ((var_args), glong);                                                   \
+         break;                                                                        \
+       case G_VALUE_COLLECT_INT64:                                                     \
+         va_arg ((var_args), gint64);                                                  \
+         break;                                                                        \
+       case G_VALUE_COLLECT_DOUBLE:                                                    \
+         va_arg ((var_args), gdouble);                                                 \
+         break;                                                                        \
+       case G_VALUE_COLLECT_POINTER:                                                   \
+         va_arg ((var_args), gpointer);                                                \
+         break;                                                                        \
+       default:                                                                        \
+         g_assert_not_reached ();                                                      \
+       }                                                                               \
+    }                                                                                  \
+} G_STMT_END
+
+/**
+ * G_VALUE_LCOPY:
+ * @value: a #GValue return location. @value is supposed to be initialized 
+ *  according to the value type to be collected
+ * @var_args: the va_list variable; it may be evaluated multiple times
+ * @flags: flags which are passed on to the lcopy_value() function of
+ *  the #GTypeValueTable of @value.
+ * @__error: a #gchar** variable that will be modified to hold a g_new()
+ *  allocated error messages if something fails
+ * 
+ * Collects a value's variable argument locations from a va_list. Usage is
+ * analogous to G_VALUE_COLLECT().
  */
 #define G_VALUE_LCOPY(value, var_args, flags, __error)                                 \
 G_STMT_START {                                                                         \
-  GValue *_value = (value);                                                            \
+  const GValue *_value = (value);                                                      \
   guint _flags = (flags);                                                              \
   GType _value_type = G_VALUE_TYPE (_value);                                           \
   GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                    \
-  gchar *_lcopy_format = _vtable->lcopy_format;                                                \
+  const gchar *_lcopy_format = _vtable->lcopy_format;                                  \
   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };               \
   guint _n_values = 0;                                                                 \
                                                                                         \
@@ -126,6 +221,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;                                                                        \
@@ -143,6 +241,12 @@ G_STMT_START {                                                                             \
 } G_STMT_END
 
 
+/**
+ * G_VALUE_COLLECT_FORMAT_MAX_LENGTH:
+ * 
+ * The maximal number of #GTypeCValues which can be collected for a 
+ * single #GValue.
+ */
 #define        G_VALUE_COLLECT_FORMAT_MAX_LENGTH       (8)
 
 G_END_DECLS