Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
preprocess.h
Go to the documentation of this file.
1/*
2 * The MIT License (MIT)
3 *
4 * Copyright © 2015-2016 Franklin "Snaipe" Mathieu <http://snai.pe/>
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24#ifndef CRITERION_PREPROCESS_H_
25#define CRITERION_PREPROCESS_H_
26
27#define CR_NOOP do {} while (0)
28
29#ifdef __cplusplus
30# define CR_NOTHROW throw ()
31#else
32# define CR_NOTHROW
33#endif
34
35#define CR_EXPAND(x) x
36#define CR_IDENTITY(...) __VA_ARGS__
37#define CR_EMPTY()
38#define CR_DEFER(x) x CR_EMPTY()
39#define CR_OBSTRUCT(...) __VA_ARGS__ CR_DEFER(CR_EMPTY)()
40
41#define CR_EAT(...) __VA_ARGS__
42
43#define CRI_DEFER1(x) CR_DEFER(x)
44#define CRI_DEFER2(x) CR_DEFER(CRI_DEFER1)(x)
45#define CRI_DEFER3(x) CR_DEFER(CRI_DEFER2)(x)
46#define CRI_DEFER4(x) CR_DEFER(CRI_DEFER3)(x)
47
48#define CRI_OBSTRUCT1(...) __VA_ARGS__ CRI_DEFER4(CR_EMPTY)()
49#define CRI_OBSTRUCT2(...) __VA_ARGS__ CRI_DEFER4(CRI_OBSTRUCT1)()
50#define CRI_OBSTRUCT3(...) __VA_ARGS__ CRI_DEFER4(CRI_OBSTRUCT2)()
51#define CRI_OBSTRUCT_N(...) __VA_ARGS__ CRI_DEFER4(CRI_OBSTRUCT3)()
52
53#define CR_EVAL(...) CR_EVAL1(CR_EVAL1(CR_EVAL1(CR_EVAL1(__VA_ARGS__))))
54#define CR_EVAL1(...) CR_EVAL2(CR_EVAL2(CR_EVAL2(CR_EVAL2(__VA_ARGS__))))
55#define CR_EVAL2(...) CR_EVAL3(CR_EVAL3(CR_EVAL3(CR_EVAL3(__VA_ARGS__))))
56#define CR_EVAL3(...) CR_IDENTITY(__VA_ARGS__)
57
58#define CR_STR(...) CR_EXPAND(CR_STR_(__VA_ARGS__))
59#define CR_STR_(...) #__VA_ARGS__
60
61#define CR_VA_TAIL(...) CR_EXPAND(CR_VA_TAIL_HELPER(CR_VA_TAIL_SELECT(__VA_ARGS__), __VA_ARGS__))
62
63#define CR_VA_TAIL_HELPER(N, ...) CR_EXPAND(CR_VA_TAIL_HELPER_(N, __VA_ARGS__))
64#define CR_VA_TAIL_HELPER_(N, ...) CR_EXPAND(CR_VA_TAIL_HELPER_ ## N(__VA_ARGS__))
65#define CR_VA_TAIL_HELPER_1(Head)
66#define CR_VA_TAIL_HELPER_2(Head, ...) __VA_ARGS__
67
68#define CR_VA_HEAD(...) CR_EXPAND(CR_VA_HEAD_HELPER(CR_VA_TAIL_SELECT(__VA_ARGS__), __VA_ARGS__))
69
70#define CR_VA_HEAD_HELPER(N, ...) CR_EXPAND(CR_VA_HEAD_HELPER_(N, __VA_ARGS__))
71#define CR_VA_HEAD_HELPER_(N, ...) CR_EXPAND(CR_VA_HEAD_HELPER_ ## N(__VA_ARGS__))
72#define CR_VA_HEAD_HELPER_1(Head) Head
73#define CR_VA_HEAD_HELPER_2(Head, ...) Head
74
75#define CR_VA_TAIL_SELECT(...) \
76 CR_EXPAND(CR_VA_TAIL_SELECT64(__VA_ARGS__, \
77 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
78 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
79 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
80 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
81 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
82 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \
83 2, 2, 1, _))
84
85#define CR_VA_TAIL_SELECT64( \
86 _01, _02, _03, _04, _05, _06, _07, _08, _09, _10, \
87 _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, \
88 _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, \
89 _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, \
90 _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, \
91 _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, \
92 _61, _62, _63, X, ...) X
93
94#define CR_CONCAT_E(A, B) CR_CONCAT(CR_EXPAND(A), CR_EXPAND(B))
95#define CR_CONCAT(A, B) CR_CONCAT2(A, B)
96#define CR_CONCAT2(A, B) CR_CONCAT3(A, B)
97#define CR_CONCAT3(A, B) A ## B
98
99#define CRI_IF_DEFINED__(M, N) M ## N
100#define CRI_IF_DEFINED_(M, N) CRI_IF_DEFINED__(M, N)
101#define CRI_IF_DEFINED(M, Then, ThenParams, Else, ElseParams) CRI_IF_DEFINED_(CRI_IF_DEFINED_, CR_VA_TAIL_SELECT(M))(Then, ThenParams, Else, ElseParams)
102#define CRI_IF_DEFINED_1(Then, ThenParams, Else, ElseParams) CRI_DEFER2(Else) ElseParams
103#define CRI_IF_DEFINED_2(Then, ThenParams, Else, ElseParams) CRI_DEFER2(Then) ThenParams
104
105#define CRI_IF_DEFINED_NODEFER__(M, N) M ## N
106#define CRI_IF_DEFINED_NODEFER_(M, N) CRI_IF_DEFINED_NODEFER__(M, N)
107#define CRI_IF_DEFINED_NODEFER(M, Then, ThenParams, Else, ElseParams) CRI_IF_DEFINED_NODEFER_(CRI_IF_DEFINED_NODEFER_, CR_VA_TAIL_SELECT(M))(Then, ThenParams, Else, ElseParams)
108#define CRI_IF_DEFINED_NODEFER_1(Then, ThenParams, Else, ElseParams) Else ElseParams
109#define CRI_IF_DEFINED_NODEFER_2(Then, ThenParams, Else, ElseParams) Then ThenParams
110
111#endif /* !CRITERION_PREPROCESS_H_ */