epoc32/include/stdapis/glib-2.0/glib/gmacros.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
parent 0 061f57f2323e
permissions -rw-r--r--
Final list of Symbian^2 public API header files
     1 /* GLIB - Library of useful routines for C programming
     2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
     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 Public
    15  * 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 
    20 /*
    21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
    22  * file for a list of people on the GLib Team.  See the ChangeLog
    23  * files for a list of changes.  These files are distributed with
    24  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
    25  */
    26 
    27 /* This file must not include any other glib header file and must thus
    28  * not refer to variables from glibconfig.h 
    29  */
    30 
    31 #ifndef __G_MACROS_H__
    32 #define __G_MACROS_H__
    33 
    34 /* We include stddef.h to get the system's definition of NULL
    35  */
    36 #include <stddef.h>
    37 
    38 /* Here we provide G_GNUC_EXTENSION as an alias for __extension__,
    39  * where this is valid. This allows for warningless compilation of
    40  * "long long" types even in the presence of '-ansi -pedantic'. 
    41  */
    42 #if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)
    43 #  define G_GNUC_EXTENSION __extension__
    44 #else
    45 #  define G_GNUC_EXTENSION
    46 #endif
    47 
    48 /* Provide macros to feature the GCC function attribute.
    49  */
    50 #if    __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
    51 #define G_GNUC_PURE                            \
    52   __attribute__((__pure__))
    53 #define G_GNUC_MALLOC    			\
    54   __attribute__((__malloc__))
    55 #else
    56 #define G_GNUC_PURE
    57 #define G_GNUC_MALLOC
    58 #endif
    59 
    60 #if     __GNUC__ >= 4
    61 #define G_GNUC_NULL_TERMINATED __attribute__((__sentinel__))
    62 #else
    63 #define G_GNUC_NULL_TERMINATED
    64 #endif
    65 
    66 #if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
    67 #define G_GNUC_PRINTF( format_idx, arg_idx )    \
    68   __attribute__((__format__ (__printf__, format_idx, arg_idx)))
    69 #define G_GNUC_SCANF( format_idx, arg_idx )     \
    70   __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
    71 #define G_GNUC_FORMAT( arg_idx )                \
    72   __attribute__((__format_arg__ (arg_idx)))
    73 #define G_GNUC_NORETURN                         \
    74   __attribute__((__noreturn__))
    75 #define G_GNUC_CONST                            \
    76   __attribute__((__const__))
    77 #define G_GNUC_UNUSED                           \
    78   __attribute__((__unused__))
    79 #define G_GNUC_NO_INSTRUMENT			\
    80   __attribute__((__no_instrument_function__))
    81 #else   /* !__GNUC__ */
    82 #define G_GNUC_PRINTF( format_idx, arg_idx )
    83 #define G_GNUC_SCANF( format_idx, arg_idx )
    84 #define G_GNUC_FORMAT( arg_idx )
    85 #define G_GNUC_NORETURN
    86 #define G_GNUC_CONST
    87 #define G_GNUC_UNUSED
    88 #define G_GNUC_NO_INSTRUMENT
    89 #endif  /* !__GNUC__ */
    90 
    91 #if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
    92 #define G_GNUC_DEPRECATED                            \
    93   __attribute__((__deprecated__))
    94 #else
    95 #define G_GNUC_DEPRECATED
    96 #endif /* __GNUC__ */
    97 
    98 #if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
    99 #define G_GNUC_WARN_UNUSED_RESULT 		\
   100   __attribute__((warn_unused_result))
   101 #else
   102 #define G_GNUC_WARN_UNUSED_RESULT
   103 #endif /* __GNUC__ */
   104 
   105 /* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
   106  * macros, so we can refer to them as strings unconditionally.
   107  * usage not-recommended since gcc-3.0
   108  */
   109 #if defined (__GNUC__) && (__GNUC__ < 3)
   110 #define G_GNUC_FUNCTION         __FUNCTION__
   111 #define G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__
   112 #else   /* !__GNUC__ */
   113 #define G_GNUC_FUNCTION         ""
   114 #define G_GNUC_PRETTY_FUNCTION  ""
   115 #endif  /* !__GNUC__ */
   116 
   117 #define G_STRINGIFY(macro_or_string)	G_STRINGIFY_ARG (macro_or_string)
   118 #define	G_STRINGIFY_ARG(contents)	#contents
   119 
   120 /* Provide a string identifying the current code position */
   121 #if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
   122 #  define G_STRLOC	__FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
   123 #else
   124 #  define G_STRLOC	__FILE__ ":" G_STRINGIFY (__LINE__)
   125 #endif
   126 
   127 /* Provide a string identifying the current function, non-concatenatable */
   128 #if defined (__GNUC__)
   129 #  define G_STRFUNC     ((const char*) (__PRETTY_FUNCTION__))
   130 #elif defined (G_HAVE_ISO_VARARGS)
   131 #  define G_STRFUNC     ((const char*) (__func__))
   132 #else
   133 #  define G_STRFUNC     ((const char*) ("???"))
   134 #endif
   135 
   136 /* Guard C code in headers, while including them from C++ */
   137 #ifdef  __cplusplus
   138 # define G_BEGIN_DECLS  extern "C" {
   139 # define G_END_DECLS    }
   140 #else
   141 # define G_BEGIN_DECLS
   142 # define G_END_DECLS
   143 #endif
   144 
   145 /* Provide definitions for some commonly used macros.
   146  *  Some of them are only provided if they haven't already
   147  *  been defined. It is assumed that if they are already
   148  *  defined then the current definition is correct.
   149  */
   150 #ifndef NULL
   151 #  ifdef __cplusplus
   152 #    define NULL        (0L)
   153 #  else /* !__cplusplus */
   154 #    define NULL        ((void*) 0)
   155 #  endif /* !__cplusplus */
   156 #endif
   157 
   158 #ifndef	FALSE
   159 #define	FALSE	(0)
   160 #endif
   161 
   162 #ifndef	TRUE
   163 #define	TRUE	(!FALSE)
   164 #endif
   165 
   166 #undef	MAX
   167 #define MAX(a, b)  (((a) > (b)) ? (a) : (b))
   168 
   169 #undef	MIN
   170 #define MIN(a, b)  (((a) < (b)) ? (a) : (b))
   171 
   172 #undef	ABS
   173 #define ABS(a)	   (((a) < 0) ? -(a) : (a))
   174 
   175 #undef	CLAMP
   176 #define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
   177 
   178 /* Count the number of elements in an array. The array must be defined
   179  * as such; using this with a dynamically allocated array will give
   180  * incorrect results.
   181  */
   182 #define G_N_ELEMENTS(arr)		(sizeof (arr) / sizeof ((arr)[0]))
   183 
   184 /* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT
   185  */
   186 #define GPOINTER_TO_SIZE(p)	((gsize) (p))
   187 #define GSIZE_TO_POINTER(s)	((gpointer) (gsize) (s))
   188 
   189 /* Provide convenience macros for handling structure
   190  * fields through their offsets.
   191  */
   192 #define G_STRUCT_OFFSET(struct_type, member)	\
   193     ((glong) ((guint8*) &((struct_type*) 0)->member))
   194 #define G_STRUCT_MEMBER_P(struct_p, struct_offset)   \
   195     ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
   196 #define G_STRUCT_MEMBER(member_type, struct_p, struct_offset)   \
   197     (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
   198 
   199 /* Provide simple macro statement wrappers (adapted from Perl):
   200  *  G_STMT_START { statements; } G_STMT_END;
   201  *  can be used as a single statement, as in
   202  *  if (x) G_STMT_START { ... } G_STMT_END; else ...
   203  *
   204  *  When GCC is compiling C code in non-ANSI mode, it will use the
   205  *  compiler __extension__ to wrap the statements wihin `({' and '})' braces.
   206  *  When compiling on platforms where configure has defined
   207  *  HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'.
   208  *  For any other platforms (SunOS4 is known to have this issue), wrap the
   209  *  statements with `if (1)' and `else (void) 0'.
   210  */
   211 #if !(defined (G_STMT_START) && defined (G_STMT_END))
   212 # if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
   213 #  define G_STMT_START (void) __extension__ (
   214 #  define G_STMT_END )
   215 # else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
   216 #  if defined (HAVE_DOWHILE_MACROS)
   217 #   define G_STMT_START do
   218 #   define G_STMT_END while (0)
   219 #  else /* !HAVE_DOWHILE_MACROS */
   220 #   define G_STMT_START if (1)
   221 #   define G_STMT_END else (void) 0
   222 #  endif /* !HAVE_DOWHILE_MACROS */
   223 # endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */
   224 #endif
   225 
   226 /* Allow the app programmer to select whether or not return values
   227  * (usually char*) are const or not.  Don't try using this feature for
   228  * functions with C++ linkage.
   229  */
   230 #ifdef G_DISABLE_CONST_RETURNS
   231 #define G_CONST_RETURN
   232 #else
   233 #define G_CONST_RETURN const
   234 #endif
   235 
   236 /*
   237  * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to 
   238  * the compiler about the expected result of an expression. Some compilers
   239  * can use this information for optimizations.
   240  *
   241  * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
   242  * putting assignments in g_return_if_fail ().  
   243  */
   244 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
   245 #define _G_BOOLEAN_EXPR(expr)                   \
   246  __extension__ ({                               \
   247    int _g_boolean_var_;                         \
   248    if (expr)                                    \
   249       _g_boolean_var_ = 1;                      \
   250    else                                         \
   251       _g_boolean_var_ = 0;                      \
   252    _g_boolean_var_;                             \
   253 })
   254 #define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
   255 #define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
   256 #else
   257 #define G_LIKELY(expr) (expr)
   258 #define G_UNLIKELY(expr) (expr)
   259 #endif
   260 
   261 #endif /* __G_MACROS_H__ */