1 #ifndef MACROS_H
2 
3 #define check_size(_t, _size) assert(sizeof(_t) == (_size))
4 
5 #define check_align(_t, _align) assert(__alignof__(_t) == (_align))
6 
7 #define check_align_lv(_t, _align) assert(__alignof__(_t) == (_align) \
8 					  && (((unsigned long)&(_t)) & ((_align) - 1) ) == 0)
9 
10 #define check_basic_struct_size_and_align(_type, _size, _align) { \
11   struct _str { _type dummy; } _t; \
12   check_size(_t, _size); \
13   check_align_lv(_t, _align); \
14 }
15 
16 #define check_array_size_and_align(_type, _size, _align) { \
17   _type _a[1]; _type _b[2]; _type _c[16]; \
18   struct _str { _type _a[1]; } _s; \
19   check_align_lv(_a[0], _align); \
20   check_size(_a, _size); \
21   check_size(_b, (_size*2)); \
22   check_size(_c, (_size*16)); \
23   check_size(_s, _size); \
24   check_align_lv(_s._a[0], _align); \
25 }
26 
27 #define check_basic_union_size_and_align(_type, _size, _align) { \
28   union _union { _type dummy; } _u; \
29   check_size(_u, _size); \
30   check_align_lv(_u, _align); \
31 }
32 
33 #define run_signed_tests2(_function, _arg1, _arg2) \
34   _function(_arg1, _arg2); \
35   _function(signed _arg1, _arg2); \
36   _function(unsigned _arg1, _arg2);
37 
38 #define run_signed_tests3(_function, _arg1, _arg2, _arg3) \
39   _function(_arg1, _arg2, _arg3); \
40   _function(signed _arg1, _arg2, _arg3); \
41   _function(unsigned _arg1, _arg2, _arg3);
42 
43 /* Check size of a struct and a union of three types.  */
44 
45 #define check_struct_and_union3(type1, type2, type3, struct_size, align_size) \
46 { \
47   struct _str { type1 t1; type2 t2; type3 t3; } _t; \
48   union _uni { type1 t1; type2 t2; type3 t3; } _u; \
49   check_size(_t, struct_size); \
50   check_size(_u, align_size); \
51 }
52 
53 #endif // MACROS_H
54