epoc32/include/stdapis/glib-2.0/gobject/gvaluecollector.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 0 061f57f2323e
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     1 /* GObject - GLib Type, Object, Parameter and Signal Library
     2  * Copyright (C) 1998-1999, 2000-2001 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  * gvaluecollector.h: GValue varargs stubs
    20  */
    21 #ifndef __G_VALUE_COLLECTOR_H__
    22 #define __G_VALUE_COLLECTOR_H__
    23 
    24 #include <glib-object.h>
    25 
    26 G_BEGIN_DECLS
    27 
    28 /* we may want to add aggregate types here some day, if requested
    29  * by users. the basic C types are covered already, everything
    30  * smaller than an int is promoted to an integer and floats are
    31  * always promoted to doubles for varargs call constructions.
    32  */
    33 enum	/*< skip >*/
    34 {
    35   G_VALUE_COLLECT_INT		= 'i',
    36   G_VALUE_COLLECT_LONG		= 'l',
    37   G_VALUE_COLLECT_INT64         = 'q',
    38   G_VALUE_COLLECT_DOUBLE	= 'd',
    39   G_VALUE_COLLECT_POINTER	= 'p'
    40 };
    41 
    42 
    43 /* vararg union holding actuall values collected
    44  */
    45 union _GTypeCValue
    46 {
    47   gint     v_int;
    48   glong    v_long;
    49   gint64   v_int64;
    50   gdouble  v_double;
    51   gpointer v_pointer;
    52 };
    53 
    54 
    55 /* G_VALUE_COLLECT() collects a variable argument value
    56  * from a va_list. we have to implement the varargs collection as a
    57  * macro, because on some systems va_list variables cannot be passed
    58  * by reference.
    59  * value is supposed to be initialized according to the value
    60  * type to be collected.
    61  * var_args is the va_list variable and may be evaluated multiple times.
    62  * __error is a gchar** variable that will be modified to hold a g_new()
    63  * allocated error messages if something fails.
    64  */
    65 #define G_VALUE_COLLECT(value, var_args, flags, __error)				\
    66 G_STMT_START {										\
    67   GValue *_value = (value);								\
    68   guint _flags = (flags);								\
    69   GType _value_type = G_VALUE_TYPE (_value);						\
    70   GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);			\
    71   gchar *_collect_format = _vtable->collect_format;					\
    72   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
    73   guint _n_values = 0;									\
    74                                                                                         \
    75   if (_vtable->value_free)								\
    76     _vtable->value_free (_value);							\
    77   _value->g_type = _value_type;		/* value_meminit() from gvalue.c */		\
    78   memset (_value->data, 0, sizeof (_value->data));					\
    79   while (*_collect_format)								\
    80     {											\
    81       GTypeCValue *_cvalue = _cvalues + _n_values++;					\
    82                                                                                         \
    83       switch (*_collect_format++)							\
    84 	{										\
    85 	case G_VALUE_COLLECT_INT:							\
    86 	  _cvalue->v_int = va_arg ((var_args), gint);					\
    87 	  break;									\
    88 	case G_VALUE_COLLECT_LONG:							\
    89 	  _cvalue->v_long = va_arg ((var_args), glong);					\
    90 	  break;									\
    91 	case G_VALUE_COLLECT_INT64:							\
    92 	  _cvalue->v_int64 = va_arg ((var_args), gint64);				\
    93 	  break;									\
    94 	case G_VALUE_COLLECT_DOUBLE:							\
    95 	  _cvalue->v_double = va_arg ((var_args), gdouble);				\
    96 	  break;									\
    97 	case G_VALUE_COLLECT_POINTER:							\
    98 	  _cvalue->v_pointer = va_arg ((var_args), gpointer);				\
    99 	  break;									\
   100 	default:									\
   101 	  g_assert_not_reached ();							\
   102 	}										\
   103     }											\
   104   *(__error) = _vtable->collect_value (_value,						\
   105 				       _n_values,					\
   106 				       _cvalues,					\
   107 				       _flags);						\
   108 } G_STMT_END
   109 
   110 
   111 /* G_VALUE_LCOPY() collects a value's variable argument
   112  * locations from a va_list. usage is analogous to G_VALUE_COLLECT().
   113  */
   114 #define G_VALUE_LCOPY(value, var_args, flags, __error)					\
   115 G_STMT_START {										\
   116   const GValue *_value = (value);							\
   117   guint _flags = (flags);								\
   118   GType _value_type = G_VALUE_TYPE (_value);						\
   119   GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);			\
   120   gchar *_lcopy_format = _vtable->lcopy_format;						\
   121   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };		\
   122   guint _n_values = 0;									\
   123                                                                                         \
   124   while (*_lcopy_format)								\
   125     {											\
   126       GTypeCValue *_cvalue = _cvalues + _n_values++;					\
   127                                                                                         \
   128       switch (*_lcopy_format++)								\
   129 	{										\
   130 	case G_VALUE_COLLECT_INT:							\
   131 	  _cvalue->v_int = va_arg ((var_args), gint);					\
   132 	  break;									\
   133 	case G_VALUE_COLLECT_LONG:							\
   134 	  _cvalue->v_long = va_arg ((var_args), glong);					\
   135 	  break;									\
   136 	case G_VALUE_COLLECT_INT64:							\
   137 	  _cvalue->v_int64 = va_arg ((var_args), gint64);				\
   138 	  break;									\
   139 	case G_VALUE_COLLECT_DOUBLE:							\
   140 	  _cvalue->v_double = va_arg ((var_args), gdouble);				\
   141 	  break;									\
   142 	case G_VALUE_COLLECT_POINTER:							\
   143 	  _cvalue->v_pointer = va_arg ((var_args), gpointer);				\
   144 	  break;									\
   145 	default:									\
   146 	  g_assert_not_reached ();							\
   147 	}										\
   148     }											\
   149   *(__error) = _vtable->lcopy_value (_value,						\
   150 				     _n_values,						\
   151 				     _cvalues,						\
   152 				     _flags);						\
   153 } G_STMT_END
   154 
   155 
   156 #define	G_VALUE_COLLECT_FORMAT_MAX_LENGTH	(8)
   157 
   158 G_END_DECLS
   159 
   160 #endif /* __G_VALUE_COLLECTOR_H__ */