epoc32/include/stdapis/glib-2.0/gobject/gvaluecollector.h
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
equal deleted inserted replaced
1:666f914201fb 2:2fe1408b6811
     1 gvaluecollector.h
     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__ */