source: trunk/third/glib2/glib/gmacros.h @ 20721

Revision 20721, 8.0 KB checked in by ghudson, 20 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20720, which included commits to RCS files with non-trunk default branches.
Line 
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#else
54#define G_GNUC_PURE
55#endif
56
57#if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
58#define G_GNUC_PRINTF( format_idx, arg_idx )    \
59  __attribute__((__format__ (__printf__, format_idx, arg_idx)))
60#define G_GNUC_SCANF( format_idx, arg_idx )     \
61  __attribute__((__format__ (__scanf__, format_idx, arg_idx)))
62#define G_GNUC_FORMAT( arg_idx )                \
63  __attribute__((__format_arg__ (arg_idx)))
64#define G_GNUC_NORETURN                         \
65  __attribute__((__noreturn__))
66#define G_GNUC_CONST                            \
67  __attribute__((__const__))
68#define G_GNUC_UNUSED                           \
69  __attribute__((__unused__))
70#define G_GNUC_NO_INSTRUMENT                    \
71  __attribute__((__no_instrument_function__))
72#else   /* !__GNUC__ */
73#define G_GNUC_PRINTF( format_idx, arg_idx )
74#define G_GNUC_SCANF( format_idx, arg_idx )
75#define G_GNUC_FORMAT( arg_idx )
76#define G_GNUC_NORETURN
77#define G_GNUC_CONST
78#define G_GNUC_UNUSED
79#define G_GNUC_NO_INSTRUMENT
80#endif  /* !__GNUC__ */
81
82#if    __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
83#define G_GNUC_DEPRECATED                            \
84  __attribute__((__deprecated__))
85#else
86#define G_GNUC_DEPRECATED
87#endif /* __GNUC__ */
88
89/* Wrap the gcc __PRETTY_FUNCTION__ and __FUNCTION__ variables with
90 * macros, so we can refer to them as strings unconditionally.
91 * usage not-recommended since gcc-3.0
92 */
93#if defined (__GNUC__) && (__GNUC__ < 3)
94#define G_GNUC_FUNCTION         __FUNCTION__
95#define G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__
96#else   /* !__GNUC__ */
97#define G_GNUC_FUNCTION         ""
98#define G_GNUC_PRETTY_FUNCTION  ""
99#endif  /* !__GNUC__ */
100
101#define G_STRINGIFY(macro_or_string)    G_STRINGIFY_ARG (macro_or_string)
102#define G_STRINGIFY_ARG(contents)       #contents
103
104/* Provide a string identifying the current code position */
105#if defined(__GNUC__) && (__GNUC__ < 3) && !defined(__cplusplus)
106#  define G_STRLOC      __FILE__ ":" G_STRINGIFY (__LINE__) ":" __PRETTY_FUNCTION__ "()"
107#else
108#  define G_STRLOC      __FILE__ ":" G_STRINGIFY (__LINE__)
109#endif
110
111/* Provide a string identifying the current function, non-concatenatable */
112#if defined (__GNUC__)
113#  define G_STRFUNC     ((const char*) (__PRETTY_FUNCTION__))
114#elif defined (G_HAVE_ISO_VARARGS)
115#  define G_STRFUNC     ((const char*) (__func__))
116#else
117#  define G_STRFUNC     ((const char*) ("???"))
118#endif
119
120/* Guard C code in headers, while including them from C++ */
121#ifdef  __cplusplus
122# define G_BEGIN_DECLS  extern "C" {
123# define G_END_DECLS    }
124#else
125# define G_BEGIN_DECLS
126# define G_END_DECLS
127#endif
128
129/* Provide definitions for some commonly used macros.
130 *  Some of them are only provided if they haven't already
131 *  been defined. It is assumed that if they are already
132 *  defined then the current definition is correct.
133 */
134#ifndef NULL
135#  ifdef __cplusplus
136#    define NULL        (0L)
137#  else /* !__cplusplus */
138#    define NULL        ((void*) 0)
139#  endif /* !__cplusplus */
140#endif
141
142#ifndef FALSE
143#define FALSE   (0)
144#endif
145
146#ifndef TRUE
147#define TRUE    (!FALSE)
148#endif
149
150#undef  MAX
151#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
152
153#undef  MIN
154#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
155
156#undef  ABS
157#define ABS(a)     (((a) < 0) ? -(a) : (a))
158
159#undef  CLAMP
160#define CLAMP(x, low, high)  (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
161
162/* Count the number of elements in an array. The array must be defined
163 * as such; using this with a dynamically allocated array will give
164 * incorrect results.
165 */
166#define G_N_ELEMENTS(arr)               (sizeof (arr) / sizeof ((arr)[0]))
167
168/* Macros by analogy to GINT_TO_POINTER, GPOINTER_TO_INT
169 */
170#define GPOINTER_TO_SIZE(p)     ((gsize) (p))
171#define GSIZE_TO_POINTER(s)     ((gpointer) (gsize) (s))
172
173/* Provide convenience macros for handling structure
174 * fields through their offsets.
175 */
176#define G_STRUCT_OFFSET(struct_type, member)    \
177    ((glong) ((guint8*) &((struct_type*) 0)->member))
178#define G_STRUCT_MEMBER_P(struct_p, struct_offset)   \
179    ((gpointer) ((guint8*) (struct_p) + (glong) (struct_offset)))
180#define G_STRUCT_MEMBER(member_type, struct_p, struct_offset)   \
181    (*(member_type*) G_STRUCT_MEMBER_P ((struct_p), (struct_offset)))
182
183/* Provide simple macro statement wrappers (adapted from Perl):
184 *  G_STMT_START { statements; } G_STMT_END;
185 *  can be used as a single statement, as in
186 *  if (x) G_STMT_START { ... } G_STMT_END; else ...
187 *
188 *  For gcc we will wrap the statements within `({' and `})' braces.
189 *  For SunOS they will be wrapped within `if (1)' and `else (void) 0',
190 *  and otherwise within `do' and `while (0)'.
191 */
192#if !(defined (G_STMT_START) && defined (G_STMT_END))
193#  if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus)
194#    define G_STMT_START        (void) __extension__ (
195#    define G_STMT_END          )
196#  else
197#    if (defined (sun) || defined (__sun__))
198#      define G_STMT_START      if (1)
199#      define G_STMT_END        else (void)0
200#    else
201#      define G_STMT_START      do
202#      define G_STMT_END        while (0)
203#    endif
204#  endif
205#endif
206
207/* Allow the app programmer to select whether or not return values
208 * (usually char*) are const or not.  Don't try using this feature for
209 * functions with C++ linkage.
210 */
211#ifdef G_DISABLE_CONST_RETURNS
212#define G_CONST_RETURN
213#else
214#define G_CONST_RETURN const
215#endif
216
217/*
218 * The G_LIKELY and G_UNLIKELY macros let the programmer give hints to
219 * the compiler about the expected result of an expression. Some compilers
220 * can use this information for optimizations.
221 *
222 * The _G_BOOLEAN_EXPR macro is intended to trigger a gcc warning when
223 * putting assignments in g_return_if_fail (). 
224 */
225#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
226#define _G_BOOLEAN_EXPR(expr)                   \
227 __extension__ ({                               \
228   int _g_boolean_var_;                         \
229   if (expr)                                    \
230      _g_boolean_var_ = 1;                      \
231   else                                         \
232      _g_boolean_var_ = 0;                      \
233   _g_boolean_var_;                             \
234})
235#define G_LIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 1))
236#define G_UNLIKELY(expr) (__builtin_expect (_G_BOOLEAN_EXPR(expr), 0))
237#else
238#define G_LIKELY(expr) (expr)
239#define G_UNLIKELY(expr) (expr)
240#endif
241
242#endif /* __G_MACROS_H__ */
Note: See TracBrowser for help on using the repository browser.