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__
27 /* Guard C code in headers, while including them from C++ */
29 # define HKL_BEGIN_DECLS extern "C" {
30 # define HKL_END_DECLS }
32 # define HKL_BEGIN_DECLS
33 # define HKL_END_DECLS
36 // add the win32 portability part
37 #if _MSC_VER && _MSC_VER <= 1200
39 # define INFINITY DBL_MAX
40 # define M_PI 3.14159265358979323846264338328
41 # define M_PI_2 1.57079632679489661923132169164
49 #define HKL_VERSION (HKL_MAJOR * 10000 + HKL_MINOR * 100 + HKL_PATCH)
58 #define HKL_EPSILON 1e-6
59 #define HKL_DEGTORAD (M_PI/180.)
60 #define HKL_RADTODEG (180./M_PI)
62 #define HKL_TAU (2. * M_PI)
64 // specific part for the eulerian -> kappa conversion
65 #define HKL_EULERIAN_KAPPA_SOLUTION 1
69 # include <execinfo.h>
71 # define hkl_assert(x) do{ if (!(x)) {hkl_printbt(); assert(x); } } while(0)
73 # define hkl_assert(x)
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) \
93 if (alloc_nr(alloc) < (nr)) \
96 alloc = alloc_nr(alloc); \
97 x = realloc((x), alloc * sizeof(*(x))); \
102 # define NORETURN __attribute__((__noreturn__))
105 # ifndef __attribute__
106 # define __attribute__(x)
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
);
123 #define HKL_MALLOC(type) _hkl_malloc(sizeof(type), "Can not allocate memory for a " #type)