* solve an inline problem with the gcc3.4 compiler used at SOLEIL
[hkl.git] / include / hkl / hkl-macros.h
blobd89e670ff8fedd99a1515ce425f3563f876a8e23
1 /* This file is part of the hkl library.
3 * The hkl library is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * The hkl library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with the hkl library. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright (C) 2003-2010 Synchrotron SOLEIL
17 * L'Orme des Merisiers Saint-Aubin
18 * BP 48 91192 GIF-sur-YVETTE CEDEX
20 * Authors: Picca Frédéric-Emmanuel <picca@synchrotron-soleil.fr>
22 #ifndef __HKL_MACROS_H__
23 #define __HKL_MACROS_H__
25 #include <stdlib.h>
27 /* Guard C code in headers, while including them from C++ */
28 #ifdef __cplusplus
29 # define HKL_BEGIN_DECLS extern "C" {
30 # define HKL_END_DECLS }
31 #else
32 # define HKL_BEGIN_DECLS
33 # define HKL_END_DECLS
34 #endif
36 // add the win32 portability part
37 #if _MSC_VER && _MSC_VER <= 1200
38 # include <float.h>
39 # define INFINITY DBL_MAX
40 # define M_PI 3.14159265358979323846264338328
41 # define M_PI_2 1.57079632679489661923132169164
42 #endif
44 // common part
45 #define HKL_MAJOR 2
46 #define HKL_MINOR 3
47 #define HKL_PATCH 0
49 #define HKL_VERSION (HKL_MAJOR * 10000 + HKL_MINOR * 100 + HKL_PATCH)
51 #define HKL_TRUE 1
52 #define HKL_FALSE 0
54 #define HKL_SUCCESS 0
55 #define HKL_FAIL -1
57 #define HKL_TINY 1e-7
58 #define HKL_EPSILON 1e-6
59 #define HKL_DEGTORAD (M_PI/180.)
60 #define HKL_RADTODEG (180./M_PI)
61 // tau = 2pi or 1
62 #define HKL_TAU (2. * M_PI)
64 // specific part for the eulerian -> kappa conversion
65 #define HKL_EULERIAN_KAPPA_SOLUTION 1
67 // the assert method
68 #ifndef NDEBUG
69 # include <execinfo.h>
70 # include <assert.h>
71 # define hkl_assert(x) do{ if (!(x)) {hkl_printbt(); assert(x); } } while(0)
72 #else
73 # define hkl_assert(x)
74 #endif
76 // use for the printf format methods took from glib
77 #define G_GNUC_PRINTF( format_idx, arg_idx ) \
78 __attribute__((__format__ (__printf__, format_idx, arg_idx)))
80 // use for the hkl_list
81 #define alloc_nr(x) (((x)+16)*3/2)
84 * Realloc the buffer pointed at by variable 'x' so that it can hold
85 * at least 'nr' entries; the number of entries currently allocated
86 * is 'alloc', using the standard growing factor alloc_nr() macro.
88 * DO NOT USE any expression with side-effect for 'x' or 'alloc'.
90 #define ALLOC_GROW(x, nr, alloc) \
91 do { \
92 if ((nr) > alloc) { \
93 if (alloc_nr(alloc) < (nr)) \
94 alloc = (nr); \
95 else \
96 alloc = alloc_nr(alloc); \
97 x = realloc((x), alloc * sizeof(*(x))); \
98 } \
99 } while(0)
101 #ifdef __GNUC__
102 # define NORETURN __attribute__((__noreturn__))
103 #else
104 # define NORETURN
105 # ifndef __attribute__
106 # define __attribute__(x)
107 # endif
108 #endif
110 HKL_BEGIN_DECLS
112 extern void die(const char *err, ...) NORETURN __attribute__((format (printf, 1, 2)));
114 extern void warning(const char *err, ...);
116 extern void hkl_printbt(void);
118 __inline__ void *_hkl_malloc(int size, const char *error);
120 HKL_END_DECLS
122 // malloc method
123 #define HKL_MALLOC(type) _hkl_malloc(sizeof(type), "Can not allocate memory for a " #type)
125 #endif