GCS  0.2.3
gu_macros.h
1 // Copyright (C) 2007-2013 Codership Oy <info@codership.com>
2 
9 #ifndef _gu_macros_h_
10 #define _gu_macros_h_
11 
12 /*
13  * Platform-dependent macros
14  */
15 
16 #if defined(_MSC_VER)
17 # define GU_NORETURN __declspec(noreturn)
18 # define GU_INLINE __forceinline
19 # define GU_FORCE_INLINE __forceinline
20 # define GU_UNUSED
21 # define GU_LONG(x) (x)
22 # define GU_ULONG(x) (x)
23 # define GU_LONG_LONG(x) (x)
24 # define GU_ULONG_LONG(x) (x)
25 # define GU_DEBUG_NORETURN
26 #else /* !defined(_MSC_VER) */
27 # define GU_NORETURN __attribute__((noreturn))
28 # define GU_INLINE inline
29 # define GU_FORCE_INLINE inline __attribute__((always_inline))
30 # define GU_UNUSED __attribute__((unused))
31 # define GU_LONG(x) (x##L)
32 # define GU_ULONG(x) (x##LU)
33 # define GU_LONG_LONG(x) (x##LL)
34 # define GU_ULONG_LONG(x) (x##LLU)
35 # ifndef __OPTIMIZE__
36 # define GU_DEBUG_NORETURN abort();
37 # else
38 # define GU_DEBUG_NORETURN
39 # endif
40 #endif /* !defined(_MSC_VER) */
41 
42 /*
43  * End of paltform-dependent macros
44  */
45 
46 /* "Shamelessly stolen" (tm) goods from Linux kernel */
47 /*
48  * min()/max() macros that also do
49  * strict type-checking.. See the
50  * "unnecessary" pointer comparison.
51  */
52 #if 0 // typeof() is not in C99
53 #define GU_MAX(x,y) ({ \
54  typeof(x) _x = (x); \
55  typeof(y) _y = (y); \
56  (void) (&_x == &_y); \
57  _x > _y ? _x : _y; })
58 
59 #define GU_MIN(x,y) ({ \
60  typeof(x) _x = (x); \
61  typeof(y) _y = (y); \
62  (void) (&_x == &_y); \
63  _x < _y ? _x : _y; })
64 #endif
65 
66 #define gu_offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
67 
68 #if __GNUC__ >= 3
69 # define gu_likely(x) __builtin_expect((x), 1)
70 # define gu_unlikely(x) __builtin_expect((x), 0)
71 #else
72 # define gu_likely(x) (x)
73 # define gu_unlikely(x) (x)
74 #endif
75 
76 #endif /* _gu_macros_h_ */