vSMC
vSMC: Scalable Monte Carlo
gcc.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/internal/compiler/gcc.hpp
3 //----------------------------------------------------------------------------
4 // vSMC: Scalable Monte Carlo
5 //----------------------------------------------------------------------------
6 // Copyright (c) 2013,2014, Yan Zhou
7 // All rights reserved.
8 //
9 // Redistribution and use in source and binary forms, with or without
10 // modification, are permitted provided that the following conditions are met:
11 //
12 // Redistributions of source code must retain the above copyright notice,
13 // this list of conditions and the following disclaimer.
14 //
15 // Redistributions in binary form must reproduce the above copyright notice,
16 // this list of conditions and the following disclaimer in the documentation
17 // and/or other materials provided with the distribution.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS
20 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 // POSSIBILITY OF SUCH DAMAGE.
30 //============================================================================
31 
32 #ifndef VSMC_INTERNAL_COMPILER_GCC_HPP
33 #define VSMC_INTERNAL_COMPILER_GCC_HPP
34 
35 #define VSMC_GCC_NONEXIST 0xFFFFFFFFUL
36 
37 #define VSMC_GCC_VERSION \
38  (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
39 
40 #if VSMC_GCC_VERSION >= 40300
41 #ifndef VSMC_HAS_CXX11_LONG_LONG
42 #define VSMC_HAS_CXX11_LONG_LONG 1
43 #endif
44 #endif
45 
46 #if defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
47 
48 // C++11 language features
49 
50 #if VSMC_GCC_VERSION >= 40800
51 #ifndef VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE
52 #define VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE 1
53 #endif
54 #endif
55 
56 #if VSMC_GCC_VERSION >= 40700
57 #ifndef VSMC_HAS_CXX11_ALIAS_TEMPLATES
58 #define VSMC_HAS_CXX11_ALIAS_TEMPLATES 1
59 #endif
60 #endif
61 
62 #if VSMC_GCC_VERSION >= 40800
63 #ifndef VSMC_HAS_CXX11_ALIGNAS
64 #define VSMC_HAS_CXX11_ALIGNAS 1
65 #endif
66 #endif
67 
68 #if VSMC_GCC_VERSION >= 40800
69 #ifndef VSMC_HAS_CXX11_ATTRIBUTES
70 #define VSMC_HAS_CXX11_ATTRIBUTES 1
71 #endif
72 #endif
73 
74 #if VSMC_GCC_VERSION >= 40400
75 #ifndef VSMC_HAS_CXX11_AUTO_TYPE
76 #define VSMC_HAS_CXX11_AUTO_TYPE 1
77 #endif
78 #endif
79 
80 #if VSMC_GCC_VERSION >= 40600
81 #ifndef VSMC_HAS_CXX11_CONSTEXPR
82 #define VSMC_HAS_CXX11_CONSTEXPR 1
83 #endif
84 #endif
85 
86 #if VSMC_GCC_VERSION >= 40300
87 #ifndef VSMC_HAS_CXX11_DECLTYPE
88 #define VSMC_HAS_CXX11_DECLTYPE 1
89 #endif
90 #endif
91 
92 #if VSMC_GCC_VERSION >= 40300
93 #ifndef VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
94 #define VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS 1
95 #endif
96 #endif
97 
98 #if VSMC_GCC_VERSION >= 40400
99 #ifndef VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS
100 #define VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS 1
101 #endif
102 #endif
103 
104 #if VSMC_GCC_VERSION >= 40700
105 #ifndef VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS
106 #define VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS 1
107 #endif
108 #endif
109 
110 #if VSMC_GCC_VERSION >= 40400
111 #ifndef VSMC_HAS_CXX11_DELETED_FUNCTIONS
112 #define VSMC_HAS_CXX11_DELETED_FUNCTIONS 1
113 #endif
114 #endif
115 
116 #if VSMC_GCC_VERSION >= 40500
117 #ifndef VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS
118 #define VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS 1
119 #endif
120 #endif
121 
122 #if VSMC_GCC_VERSION >= 40400
123 #ifndef VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS
124 #define VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS 1
125 #endif
126 #endif
127 
128 #if VSMC_GCC_VERSION >= 40600
129 #ifndef VSMC_HAS_CXX11_IMPLICIT_MOVES
130 #define VSMC_HAS_CXX11_IMPLICIT_MOVES 1
131 #endif
132 #endif
133 
134 #if VSMC_GCC_VERSION >= 40800
135 #ifndef VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS
136 #define VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS 1
137 #endif
138 #endif
139 
140 #if VSMC_GCC_VERSION >= 40400
141 #ifndef VSMC_HAS_CXX11_INLINE_NAMESPACES
142 #define VSMC_HAS_CXX11_INLINE_NAMESPACES 1
143 #endif
144 #endif
145 
146 #if VSMC_GCC_VERSION >= 40500
147 #ifndef VSMC_HAS_CXX11_LAMBDAS
148 #define VSMC_HAS_CXX11_LAMBDAS 1
149 #endif
150 #endif
151 
152 #if VSMC_GCC_VERSION >= 40500
153 #ifndef VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
154 #define VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS 1
155 #endif
156 #endif
157 
158 #if VSMC_GCC_VERSION >= 40600
159 #ifndef VSMC_HAS_CXX11_NOEXCEPT
160 #define VSMC_HAS_CXX11_NOEXCEPT 1
161 #endif
162 #endif
163 
164 #if VSMC_GCC_VERSION >= 40700
165 #ifndef VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT
166 #define VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT 1
167 #endif
168 #endif
169 
170 #if VSMC_GCC_VERSION >= 40600
171 #ifndef VSMC_HAS_CXX11_NULLPTR
172 #define VSMC_HAS_CXX11_NULLPTR 1
173 #endif
174 #endif
175 
176 #if VSMC_GCC_VERSION >= 40700
177 #ifndef VSMC_HAS_CXX11_OVERRIDE_CONTROL
178 #define VSMC_HAS_CXX11_OVERRIDE_CONTROL 1
179 #endif
180 #endif
181 
182 #if VSMC_GCC_VERSION >= 40600
183 #ifndef VSMC_HAS_CXX11_RANGE_FOR
184 #define VSMC_HAS_CXX11_RANGE_FOR 1
185 #endif
186 #endif
187 
188 #if VSMC_GCC_VERSION >= 40500
189 #ifndef VSMC_HAS_CXX11_RAW_STRING_LITERALS
190 #define VSMC_HAS_CXX11_RAW_STRING_LITERALS 1
191 #endif
192 #endif
193 
194 #if VSMC_GCC_VERSION >= 40800
195 #ifndef VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
196 #define VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS 1
197 #endif
198 #endif
199 
200 #if VSMC_GCC_VERSION >= 40300
201 #ifndef VSMC_HAS_CXX11_RVALUE_REFERENCES
202 #define VSMC_HAS_CXX11_RVALUE_REFERENCES 1
203 #endif
204 #endif
205 
206 #if VSMC_GCC_VERSION >= 40300
207 #ifndef VSMC_HAS_CXX11_STATIC_ASSERT
208 #define VSMC_HAS_CXX11_STATIC_ASSERT 1
209 #endif
210 #endif
211 
212 #if VSMC_GCC_VERSION >= 40400
213 #ifndef VSMC_HAS_CXX11_STRONG_ENUMS
214 #define VSMC_HAS_CXX11_STRONG_ENUMS 1
215 #endif
216 #endif
217 
218 #if VSMC_GCC_VERSION >= 40800
219 #ifndef VSMC_HAS_CXX11_THREAD_LOCAL
220 #define VSMC_HAS_CXX11_THREAD_LOCAL 1
221 #endif
222 #endif
223 
224 #if VSMC_GCC_VERSION >= 40400
225 #ifndef VSMC_HAS_CXX11_TRAILING_RETURN
226 #define VSMC_HAS_CXX11_TRAILING_RETURN 1
227 #endif
228 #endif
229 
230 #if VSMC_GCC_VERSION >= 40500
231 #ifndef VSMC_HAS_CXX11_UNICODE_LITERALS
232 #define VSMC_HAS_CXX11_UNICODE_LITERALS 1
233 #endif
234 #endif
235 
236 #if VSMC_GCC_VERSION >= 40600
237 #ifndef VSMC_HAS_CXX11_UNRESTRICTED_UNIONS
238 #define VSMC_HAS_CXX11_UNRESTRICTED_UNIONS 1
239 #endif
240 #endif
241 
242 #if VSMC_GCC_VERSION >= 40700
243 #ifndef VSMC_HAS_CXX11_USER_LITERALS
244 #define VSMC_HAS_CXX11_USER_LITERALS 1
245 #endif
246 #endif
247 
248 #if VSMC_GCC_VERSION >= 40700
249 #ifndef VSMC_HAS_CXX11_VARIADIC_TEMPLATES
250 #define VSMC_HAS_CXX11_VARIADIC_TEMPLATES 1
251 #endif
252 #endif
253 
254 // C++11 library features
255 
256 #if VSMC_GCC_VERSION >= 40900
257 #ifndef VSMC_HAS_CXX11LIB_ALGORITHM
258 #define VSMC_HAS_CXX11LIB_ALGORITHM 1
259 #endif
260 #endif
261 
262 #if VSMC_GCC_VERSION >= 40900
263 #ifndef VSMC_HAS_CXX11LIB_CHRONO
264 #define VSMC_HAS_CXX11LIB_CHRONO 1
265 #endif
266 #endif
267 
268 #if VSMC_GCC_VERSION >= 40900
269 #ifndef VSMC_HAS_CXX11LIB_CMATH
270 #define VSMC_HAS_CXX11LIB_CMATH 1
271 #endif
272 #endif
273 
274 #if VSMC_GCC_VERSION >= 40900
275 #ifndef VSMC_HAS_CXX11LIB_FUNCTIONAL
276 #define VSMC_HAS_CXX11LIB_FUNCTIONAL 1
277 #endif
278 #endif
279 
280 #if VSMC_GCC_VERSION >= 40900
281 #ifndef VSMC_HAS_CXX11LIB_FUTURE
282 #define VSMC_HAS_CXX11LIB_FUTURE 1
283 #endif
284 #endif
285 
286 #if VSMC_GCC_VERSION >= 40900
287 #ifndef VSMC_HAS_CXX11LIB_INITIALIZER_LIST
288 #define VSMC_HAS_CXX11LIB_INITIALIZER_LIST 1
289 #endif
290 #endif
291 
292 #if VSMC_GCC_VERSION >= 40900
293 #ifndef VSMC_HAS_CXX11LIB_MUTEX
294 #define VSMC_HAS_CXX11LIB_MUTEX 1
295 #endif
296 #endif
297 
298 #if VSMC_GCC_VERSION >= 40900
299 #ifndef VSMC_HAS_CXX11LIB_RANDOM
300 #define VSMC_HAS_CXX11LIB_RANDOM 1
301 #endif
302 #endif
303 
304 #if VSMC_GCC_VERSION >= 40900
305 #ifndef VSMC_HAS_CXX11LIB_THREAD
306 #define VSMC_HAS_CXX11LIB_THREAD 1
307 #endif
308 #endif
309 
310 #if VSMC_GCC_VERSION >= 40900
311 #ifndef VSMC_HAS_CXX11LIB_TUPLE
312 #define VSMC_HAS_CXX11LIB_TUPLE 1
313 #endif
314 #endif
315 
316 #endif // defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L
317 
318 #if __cplusplus >= 201402L
319 
320 // C++14 language features
321 
322 #if VSMC_GCC_VERSION >= 50000
323 #ifndef VSMC_HAS_CXX14_AGGREGATE_NSDMI
324 #define VSMC_HAS_CXX14_AGGREGATE_NSDMI 1
325 #endif
326 #endif
327 
328 #if VSMC_GCC_VERSION >= 40900
329 #ifndef VSMC_HAS_CXX14_BINARY_LITERALS
330 #define VSMC_HAS_CXX14_BINARY_LITERALS 1
331 #endif
332 #endif
333 
334 #if VSMC_GCC_VERSION >= 40900
335 #ifndef VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS
336 #define VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS 1
337 #endif
338 #endif
339 
340 #if VSMC_GCC_VERSION >= 40900
341 #ifndef VSMC_HAS_CXX14_DECLTYPE_AUTO
342 #define VSMC_HAS_CXX14_DECLTYPE_AUTO 1
343 #endif
344 #endif
345 
346 #if VSMC_GCC_VERSION >= 40900
347 #ifndef VSMC_HAS_CXX14_DIGIT_SEPERATORS
348 #define VSMC_HAS_CXX14_DIGIT_SEPERATORS 1
349 #endif
350 #endif
351 
352 #if VSMC_GCC_VERSION >= 40900
353 #ifndef VSMC_HAS_CXX14_GENERIC_LAMBDAS
354 #define VSMC_HAS_CXX14_GENERIC_LAMBDAS 1
355 #endif
356 #endif
357 
358 #if VSMC_GCC_VERSION >= 40900
359 #ifndef VSMC_HAS_CXX14_INIT_CAPTURES
360 #define VSMC_HAS_CXX14_INIT_CAPTURES 1
361 #endif
362 #endif
363 
364 #if VSMC_GCC_VERSION >= VSMC_GCC_NONEXIST
365 #ifndef VSMC_HAS_CXX14_RELAXED_CONSTEXPR
366 #define VSMC_HAS_CXX14_RELAXED_CONSTEXPR 1
367 #endif
368 #endif
369 
370 #if VSMC_GCC_VERSION >= 40900
371 #ifndef VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION
372 #define VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION 1
373 #endif
374 #endif
375 
376 #if VSMC_GCC_VERSION >= 40900
377 #ifndef VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS
378 #define VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS 1
379 #endif
380 #endif
381 
382 #if VSMC_GCC_VERSION >= 50000
383 #ifndef VSMC_HAS_CXX14_VARIABLE_TEMPLATES
384 #define VSMC_HAS_CXX14_VARIABLE_TEMPLATES 1
385 #endif
386 #endif
387 
388 #endif // __cplusplus >= 201402L
389 
390 // C99 library features
391 
392 #ifndef VSMC_HAS_C99LIB_MATH
393 #define VSMC_HAS_C99LIB_MATH 1
394 #endif
395 
396 // Compiler features
397 
398 #ifndef VSMC_INT64
399 #define VSMC_INT64 long long
400 #endif
401 
402 #ifdef __x86_64__
403 #ifndef VSMC_HAS_INT128
404 #define VSMC_HAS_INT128 1
405 #endif
406 #ifndef VSMC_INT128
407 #define VSMC_INT128 __int128
408 #endif
409 #endif
410 
411 #ifndef VSMC_HAS_WARNING
412 #define VSMC_HAS_WARNING 1
413 #endif
414 
415 #ifndef VSMC_STRONG_INLINE
416 #define VSMC_STRONG_INLINE __attribute__((always_inline)) inline
417 #endif
418 
419 // Target features
420 
421 #ifdef __AES__
422 #ifndef VSMC_HAS_AES_NI
423 #define VSMC_HAS_AES_NI 1
424 #endif
425 #endif
426 
427 #ifdef __RDRND__
428 #ifndef VSMC_HAS_RDRAND
429 #define VSMC_HAS_RDRAND 1
430 #endif
431 #endif
432 
433 // Parallelization features
434 
435 #ifdef _OPENMP
436 #ifndef VSMC_HAS_OMP
437 #define VSMC_HAS_OMP 1
438 #endif
439 #endif
440 
441 #endif // VSMC_INTERNAL_COMPILER_GCC_HPP