gdb - Local mods (compile)
[dragonfly.git] / sys / sys / cpputil.h
1 /*
2  * Portions Copyright (c) 2011, Aggelos Economopoulos
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in
12  *    the documentation and/or other materials provided with the
13  *    distribution.
14  * 3. Neither the name of The DragonFly Project nor the names of its
15  *    contributors may be used to endorse or promote products derived
16  *    from this software without specific, prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
22  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31
32 #ifndef _SYS_CPPUTIL_H_
33 #define _SYS_CPPUTIL_H_
34
35 #include <sys/cdefs.h>
36 /*
37  * This file includes macros that abuse the preprocessor --
38  * we don't want to have to parse these except when compiling
39  * the files that actually use them.
40  */
41
42 /*
43  * Returns the number of args in __VA_ARGS__.
44  * Note: returns 1 if __VA_ARGS__ is empty!
45  * Taken from the Boost library.
46  */
47
48 #define VA_NARGS(...) __VA_ARGS_SIZE(__VA_ARGS__, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1,)
49
50 #define __VA_ARGS_SIZE(e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13, e14, e15, e16, e17, e18, e19, e20, e21, e22, e23, e24, e25, e26, e27, e28, e29, e30, e31, e32, e33, e34, e35, e36, e37, e38, e39, e40, e41, e42, e43, e44, e45, e46, e47, e48, e49, e50, e51, e52, e53, e54, e55, e56, e57, e58, e59, e60, e61, e62, e63, size, ...) size
51
52 /*
53  * Generate a struction declaration using the arguments passed in.
54  * E.g. __GENSTRUCT(mystruct, int a, char *b); expands to
55  * struct mystruct {
56  *      int a;
57  *      char *b;
58  * };
59  */
60
61 #define __GENSTRUCT(tag, args...)\
62         __CONCAT(__GENSTRUCT,VA_NARGS(args))(tag, args)
63
64
65 #define __GENSTRUCT1(tag, arg1) struct tag {    \
66         arg1;   \
67         }
68 #define __GENSTRUCT2(tag, arg1, arg2)   struct tag {    \
69         arg1;   \
70         arg2;   \
71         }
72 #define __GENSTRUCT3(tag, arg1, arg2, arg3)     struct tag {    \
73         arg1;   \
74         arg2;   \
75         arg3;   \
76         }
77 #define __GENSTRUCT4(tag, arg1, arg2, arg3, arg4)       struct tag {    \
78         arg1;   \
79         arg2;   \
80         arg3;   \
81         arg4;   \
82         }
83 #define __GENSTRUCT5(tag, arg1, arg2, arg3, arg4, arg5) struct tag {    \
84         arg1;   \
85         arg2;   \
86         arg3;   \
87         arg4;   \
88         arg5;   \
89         }
90 #define __GENSTRUCT6(tag, arg1, arg2, arg3, arg4, arg5, arg6)   struct tag {    \
91         arg1;   \
92         arg2;   \
93         arg3;   \
94         arg4;   \
95         arg5;   \
96         arg6;   \
97         }
98 #define __GENSTRUCT7(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7)     struct tag {    \
99         arg1;   \
100         arg2;   \
101         arg3;   \
102         arg4;   \
103         arg5;   \
104         arg6;   \
105         arg7;   \
106         }
107 #define __GENSTRUCT8(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)       struct tag {    \
108         arg1;   \
109         arg2;   \
110         arg3;   \
111         arg4;   \
112         arg5;   \
113         arg6;   \
114         arg7;   \
115         arg8;   \
116         }
117 #define __GENSTRUCT9(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) struct tag {    \
118         arg1;   \
119         arg2;   \
120         arg3;   \
121         arg4;   \
122         arg5;   \
123         arg6;   \
124         arg7;   \
125         arg8;   \
126         arg9;   \
127         }
128 #define __GENSTRUCT10(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) struct tag {    \
129         arg1;   \
130         arg2;   \
131         arg3;   \
132         arg4;   \
133         arg5;   \
134         arg6;   \
135         arg7;   \
136         arg8;   \
137         arg9;   \
138         arg10;  \
139         }
140 #define __GENSTRUCT11(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11)  struct tag {    \
141         arg1;   \
142         arg2;   \
143         arg3;   \
144         arg4;   \
145         arg5;   \
146         arg6;   \
147         arg7;   \
148         arg8;   \
149         arg9;   \
150         arg10;  \
151         arg11;  \
152         }
153 #define __GENSTRUCT12(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12)   struct tag {    \
154         arg1;   \
155         arg2;   \
156         arg3;   \
157         arg4;   \
158         arg5;   \
159         arg6;   \
160         arg7;   \
161         arg8;   \
162         arg9;   \
163         arg10;  \
164         arg11;  \
165         arg12;  \
166         }
167 #define __GENSTRUCT13(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13)    struct tag {    \
168         arg1;   \
169         arg2;   \
170         arg3;   \
171         arg4;   \
172         arg5;   \
173         arg6;   \
174         arg7;   \
175         arg8;   \
176         arg9;   \
177         arg10;  \
178         arg11;  \
179         arg12;  \
180         arg13;  \
181         }
182 #define __GENSTRUCT14(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14)     struct tag {    \
183         arg1;   \
184         arg2;   \
185         arg3;   \
186         arg4;   \
187         arg5;   \
188         arg6;   \
189         arg7;   \
190         arg8;   \
191         arg9;   \
192         arg10;  \
193         arg11;  \
194         arg12;  \
195         arg13;  \
196         arg14;  \
197         }
198 #define __GENSTRUCT15(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)      struct tag {  \
199         arg1;   \
200         arg2;   \
201         arg3;   \
202         arg4;   \
203         arg5;   \
204         arg6;   \
205         arg7;   \
206         arg8;   \
207         arg9;   \
208         arg10;  \
209         arg11;  \
210         arg12;  \
211         arg13;  \
212         arg14;  \
213         arg15;  \
214         }
215 #define __GENSTRUCT16(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16)       struct tag {   \
216         arg1;   \
217         arg2;   \
218         arg3;   \
219         arg4;   \
220         arg5;   \
221         arg6;   \
222         arg7;   \
223         arg8;   \
224         arg9;   \
225         arg10;  \
226         arg11;  \
227         arg12;  \
228         arg13;  \
229         arg14;  \
230         arg15;  \
231         arg16;  \
232         }
233 #define __GENSTRUCT17(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17)      struct tag {     \
234         arg1;   \
235         arg2;   \
236         arg3;   \
237         arg4;   \
238         arg5;   \
239         arg6;   \
240         arg7;   \
241         arg8;   \
242         arg9;   \
243         arg10;  \
244         arg11;  \
245         arg12;  \
246         arg13;  \
247         arg14;  \
248         arg15;  \
249         arg16;  \
250         arg17;  \
251         }
252 #define __GENSTRUCT18(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18)struct tag {    \
253         arg1;   \
254         arg2;   \
255         arg3;   \
256         arg4;   \
257         arg5;   \
258         arg6;   \
259         arg7;   \
260         arg8;   \
261         arg9;   \
262         arg10;  \
263         arg11;  \
264         arg12;  \
265         arg13;  \
266         arg14;  \
267         arg15;  \
268         arg16;  \
269         arg17;  \
270         arg18;  \
271         }
272 #define __GENSTRUCT19(tag, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15, arg16, arg17, arg18, arg19) struct tag {    \
273         arg1;   \
274         arg2;   \
275         arg3;   \
276         arg4;   \
277         arg5;   \
278         arg6;   \
279         arg7;   \
280         arg8;   \
281         arg9;   \
282         arg10;  \
283         arg11;  \
284         arg12;  \
285         arg13;  \
286         arg14;  \
287         arg15;  \
288         arg16;  \
289         arg17;  \
290         arg18;  \
291         arg19;  \
292         }
293 #endif  /* _SYS_CPPUTIL_H_ */