1 /*
2   ==============================================================================
3 
4    This file is part of the JUCE library.
5    Copyright (c) 2020 - Raw Material Software Limited
6 
7    JUCE is an open source library subject to commercial or open-source
8    licensing.
9 
10    The code included in this file is provided under the terms of the ISC license
11    http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12    To use, copy, modify, and/or distribute this software for any purpose with or
13    without fee is hereby granted provided that the above copyright notice and
14    this permission notice appear in all copies.
15 
16    JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17    EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18    DISCLAIMED.
19 
20   ==============================================================================
21 */
22 
23 #pragma once
24 
25 #include "juce_TargetPlatform.h"
26 
27 /** Return the Nth argument. By passing a variadic pack followed by N other
28     parameters, we can select one of those N parameter based on the length of
29     the parameter pack.
30 */
31 #define JUCE_NTH_ARG_(_00, _01, _02, _03, _04, _05, _06, _07, _08, _09,        \
32                       _10, _11, _12, _13, _14, _15, _16, _17, _18, _19,        \
33                       _20, _21, _22, _23, _24, _25, _26, _27, _28, _29,        \
34                       _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, N, ...)\
35     N
36 
37 #define JUCE_EACH_00_(FN)
38 #define JUCE_EACH_01_(FN, X)      FN(X)
39 #define JUCE_EACH_02_(FN, X, ...) FN(X) JUCE_EACH_01_(FN, __VA_ARGS__)
40 #define JUCE_EACH_03_(FN, X, ...) FN(X) JUCE_EACH_02_(FN, __VA_ARGS__)
41 #define JUCE_EACH_04_(FN, X, ...) FN(X) JUCE_EACH_03_(FN, __VA_ARGS__)
42 #define JUCE_EACH_05_(FN, X, ...) FN(X) JUCE_EACH_04_(FN, __VA_ARGS__)
43 #define JUCE_EACH_06_(FN, X, ...) FN(X) JUCE_EACH_05_(FN, __VA_ARGS__)
44 #define JUCE_EACH_07_(FN, X, ...) FN(X) JUCE_EACH_06_(FN, __VA_ARGS__)
45 #define JUCE_EACH_08_(FN, X, ...) FN(X) JUCE_EACH_07_(FN, __VA_ARGS__)
46 #define JUCE_EACH_09_(FN, X, ...) FN(X) JUCE_EACH_08_(FN, __VA_ARGS__)
47 #define JUCE_EACH_10_(FN, X, ...) FN(X) JUCE_EACH_09_(FN, __VA_ARGS__)
48 #define JUCE_EACH_11_(FN, X, ...) FN(X) JUCE_EACH_10_(FN, __VA_ARGS__)
49 #define JUCE_EACH_12_(FN, X, ...) FN(X) JUCE_EACH_11_(FN, __VA_ARGS__)
50 #define JUCE_EACH_13_(FN, X, ...) FN(X) JUCE_EACH_12_(FN, __VA_ARGS__)
51 #define JUCE_EACH_14_(FN, X, ...) FN(X) JUCE_EACH_13_(FN, __VA_ARGS__)
52 #define JUCE_EACH_15_(FN, X, ...) FN(X) JUCE_EACH_14_(FN, __VA_ARGS__)
53 #define JUCE_EACH_16_(FN, X, ...) FN(X) JUCE_EACH_15_(FN, __VA_ARGS__)
54 #define JUCE_EACH_17_(FN, X, ...) FN(X) JUCE_EACH_16_(FN, __VA_ARGS__)
55 #define JUCE_EACH_18_(FN, X, ...) FN(X) JUCE_EACH_17_(FN, __VA_ARGS__)
56 #define JUCE_EACH_19_(FN, X, ...) FN(X) JUCE_EACH_18_(FN, __VA_ARGS__)
57 #define JUCE_EACH_20_(FN, X, ...) FN(X) JUCE_EACH_19_(FN, __VA_ARGS__)
58 #define JUCE_EACH_21_(FN, X, ...) FN(X) JUCE_EACH_20_(FN, __VA_ARGS__)
59 #define JUCE_EACH_22_(FN, X, ...) FN(X) JUCE_EACH_21_(FN, __VA_ARGS__)
60 #define JUCE_EACH_23_(FN, X, ...) FN(X) JUCE_EACH_22_(FN, __VA_ARGS__)
61 #define JUCE_EACH_24_(FN, X, ...) FN(X) JUCE_EACH_23_(FN, __VA_ARGS__)
62 #define JUCE_EACH_25_(FN, X, ...) FN(X) JUCE_EACH_24_(FN, __VA_ARGS__)
63 #define JUCE_EACH_26_(FN, X, ...) FN(X) JUCE_EACH_25_(FN, __VA_ARGS__)
64 #define JUCE_EACH_27_(FN, X, ...) FN(X) JUCE_EACH_26_(FN, __VA_ARGS__)
65 #define JUCE_EACH_28_(FN, X, ...) FN(X) JUCE_EACH_27_(FN, __VA_ARGS__)
66 #define JUCE_EACH_29_(FN, X, ...) FN(X) JUCE_EACH_28_(FN, __VA_ARGS__)
67 #define JUCE_EACH_30_(FN, X, ...) FN(X) JUCE_EACH_29_(FN, __VA_ARGS__)
68 #define JUCE_EACH_31_(FN, X, ...) FN(X) JUCE_EACH_30_(FN, __VA_ARGS__)
69 #define JUCE_EACH_32_(FN, X, ...) FN(X) JUCE_EACH_31_(FN, __VA_ARGS__)
70 #define JUCE_EACH_33_(FN, X, ...) FN(X) JUCE_EACH_32_(FN, __VA_ARGS__)
71 #define JUCE_EACH_34_(FN, X, ...) FN(X) JUCE_EACH_33_(FN, __VA_ARGS__)
72 #define JUCE_EACH_35_(FN, X, ...) FN(X) JUCE_EACH_34_(FN, __VA_ARGS__)
73 #define JUCE_EACH_36_(FN, X, ...) FN(X) JUCE_EACH_35_(FN, __VA_ARGS__)
74 #define JUCE_EACH_37_(FN, X, ...) FN(X) JUCE_EACH_36_(FN, __VA_ARGS__)
75 #define JUCE_EACH_38_(FN, X, ...) FN(X) JUCE_EACH_37_(FN, __VA_ARGS__)
76 #define JUCE_EACH_39_(FN, X, ...) FN(X) JUCE_EACH_38_(FN, __VA_ARGS__)
77 
78 /** Apply the macro FN to each of the other arguments. */
79 #define JUCE_EACH(FN, ...)                                                     \
80     JUCE_NTH_ARG_(, __VA_ARGS__,                                               \
81                   JUCE_EACH_39_,                                               \
82                   JUCE_EACH_38_,                                               \
83                   JUCE_EACH_37_,                                               \
84                   JUCE_EACH_36_,                                               \
85                   JUCE_EACH_35_,                                               \
86                   JUCE_EACH_34_,                                               \
87                   JUCE_EACH_33_,                                               \
88                   JUCE_EACH_32_,                                               \
89                   JUCE_EACH_31_,                                               \
90                   JUCE_EACH_30_,                                               \
91                   JUCE_EACH_29_,                                               \
92                   JUCE_EACH_28_,                                               \
93                   JUCE_EACH_27_,                                               \
94                   JUCE_EACH_26_,                                               \
95                   JUCE_EACH_25_,                                               \
96                   JUCE_EACH_24_,                                               \
97                   JUCE_EACH_23_,                                               \
98                   JUCE_EACH_22_,                                               \
99                   JUCE_EACH_21_,                                               \
100                   JUCE_EACH_20_,                                               \
101                   JUCE_EACH_19_,                                               \
102                   JUCE_EACH_18_,                                               \
103                   JUCE_EACH_17_,                                               \
104                   JUCE_EACH_16_,                                               \
105                   JUCE_EACH_15_,                                               \
106                   JUCE_EACH_14_,                                               \
107                   JUCE_EACH_13_,                                               \
108                   JUCE_EACH_12_,                                               \
109                   JUCE_EACH_11_,                                               \
110                   JUCE_EACH_10_,                                               \
111                   JUCE_EACH_09_,                                               \
112                   JUCE_EACH_08_,                                               \
113                   JUCE_EACH_07_,                                               \
114                   JUCE_EACH_06_,                                               \
115                   JUCE_EACH_05_,                                               \
116                   JUCE_EACH_04_,                                               \
117                   JUCE_EACH_03_,                                               \
118                   JUCE_EACH_02_,                                               \
119                   JUCE_EACH_01_,                                               \
120                   JUCE_EACH_00_)                                               \
121     (FN, __VA_ARGS__)
122 
123 /** Concatenate two tokens to form a new token. */
124 #define JUCE_CONCAT_(a, b) a##b
125 #define JUCE_CONCAT(a, b) JUCE_CONCAT_(a, b)
126 
127 /** Quote the argument, turning it into a string. */
128 #define JUCE_TO_STRING(x) #x
129 
130 #if JUCE_CLANG || JUCE_GCC
131     #define JUCE_IGNORE_GCC_IMPL_(compiler, warning)
132     #define JUCE_IGNORE_GCC_IMPL_0(compiler, warning)
133     #define JUCE_IGNORE_GCC_IMPL_1(compiler, warning)                          \
134         _Pragma(JUCE_TO_STRING(compiler diagnostic ignored warning))
135 
136     /** If 'warning' is recognised by this compiler, ignore it. */
137     #if defined (__has_warning)
138         #define JUCE_IGNORE_GCC_LIKE(compiler, warning)                        \
139             JUCE_CONCAT(JUCE_IGNORE_GCC_IMPL_, __has_warning(warning))(compiler, warning)
140     #else
141         #define JUCE_IGNORE_GCC_LIKE(compiler, warning)                        \
142             JUCE_IGNORE_GCC_IMPL_1(compiler, warning)
143     #endif
144 
145     /** Ignore GCC/clang-specific warnings. */
146     #define JUCE_IGNORE_GCC(warning)   JUCE_IGNORE_GCC_LIKE(GCC, warning)
147     #define JUCE_IGNORE_clang(warning) JUCE_IGNORE_GCC_LIKE(clang, warning)
148 
149     #define JUCE_IGNORE_WARNINGS_GCC_LIKE(compiler, ...)                       \
150         _Pragma(JUCE_TO_STRING(compiler diagnostic push))                      \
151         JUCE_EACH(JUCE_CONCAT(JUCE_IGNORE_, compiler), __VA_ARGS__)
152 
153     /** Push a new warning scope, and then ignore each warning for either clang
154         or gcc. If the compiler doesn't support __has_warning, we add -Wpragmas
155         as the first disabled warning because otherwise we might get complaints
156         about unknown warning options.
157     */
158     #if defined (__has_warning)
159         #define JUCE_PUSH_WARNINGS_GCC_LIKE(compiler, ...)                     \
160             JUCE_IGNORE_WARNINGS_GCC_LIKE(compiler, __VA_ARGS__)
161     #else
162         #define JUCE_PUSH_WARNINGS_GCC_LIKE(compiler, ...)                     \
163             JUCE_IGNORE_WARNINGS_GCC_LIKE(compiler, "-Wpragmas", __VA_ARGS__)
164     #endif
165 
166     /** Pop the current warning scope. */
167     #define JUCE_POP_WARNINGS_GCC_LIKE(compiler)                               \
168         _Pragma(JUCE_TO_STRING(compiler diagnostic pop))
169 
170     /** Push/pop warnings on compilers with gcc-like warning flags.
171         These macros expand to nothing on other compilers (like MSVC).
172     */
173     #if JUCE_CLANG
174         #define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...) JUCE_PUSH_WARNINGS_GCC_LIKE(clang, __VA_ARGS__)
175         #define JUCE_END_IGNORE_WARNINGS_GCC_LIKE JUCE_POP_WARNINGS_GCC_LIKE(clang)
176     #else
177         #define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...) JUCE_PUSH_WARNINGS_GCC_LIKE(GCC, __VA_ARGS__)
178         #define JUCE_END_IGNORE_WARNINGS_GCC_LIKE JUCE_POP_WARNINGS_GCC_LIKE(GCC)
179     #endif
180 #else
181     #define JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE(...)
182     #define JUCE_END_IGNORE_WARNINGS_GCC_LIKE
183 #endif
184 
185 /** Push/pop warnings on MSVC. These macros expand to nothing on other
186     compilers (like clang and gcc).
187 */
188 #if JUCE_MSVC
189     #define JUCE_IGNORE_MSVC(warnings) __pragma(warning(disable:warnings))
190     #define JUCE_BEGIN_IGNORE_WARNINGS_LEVEL_MSVC(level, warnings)              \
191         __pragma(warning(push, level)) JUCE_IGNORE_MSVC(warnings)
192     #define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)                          \
193         __pragma(warning(push)) JUCE_IGNORE_MSVC(warnings)
194     #define JUCE_END_IGNORE_WARNINGS_MSVC __pragma(warning(pop))
195 #else
196     #define JUCE_IGNORE_MSVC(warnings)
197     #define JUCE_BEGIN_IGNORE_WARNINGS_LEVEL_MSVC(level, warnings)
198     #define JUCE_BEGIN_IGNORE_WARNINGS_MSVC(warnings)
199     #define JUCE_END_IGNORE_WARNINGS_MSVC
200 #endif
201