vSMC
vSMC: Scalable Monte Carlo
msvc.hpp
Go to the documentation of this file.
1 //============================================================================
2 // vSMC/include/vsmc/internal/compiler/msvc.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_MSVC_HPP
33 #define VSMC_INTERNAL_COMPILER_MSVC_HPP
34 
35 #define VSMC_MSVC_NONEXIST 0xFFFFFFFFUL
36 
37 #define VSMC_MSVC_VERSION _MSC_VER
38 
39 #if VSMC_MSVC_VERSION >= 1600
40 #ifndef VSMC_HAS_CXX11_LONG_LONG
41 #define VSMC_HAS_CXX11_LONG_LONG 1
42 #endif
43 #endif
44 
45 // C++11 language features
46 
47 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
48 #ifndef VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE
49 #define VSMC_HAS_CXX11_ACCESS_CONTROL_SFINAE 1
50 #endif
51 #endif
52 
53 #if VSMC_MSVC_VERSION >= 1800
54 #ifndef VSMC_HAS_CXX11_ALIAS_TEMPLATES
55 #define VSMC_HAS_CXX11_ALIAS_TEMPLATES 1
56 #endif
57 #endif
58 
59 #if VSMC_MSVC_VERSION >= 1900
60 #ifndef VSMC_HAS_CXX11_ALIGNAS
61 #define VSMC_HAS_CXX11_ALIGNAS 1
62 #endif
63 #endif
64 
65 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
66 #ifndef VSMC_HAS_CXX11_ATTRIBUTES
67 #define VSMC_HAS_CXX11_ATTRIBUTES 1
68 #endif
69 #endif
70 
71 #if VSMC_MSVC_VERSION >= 1600
72 #ifndef VSMC_HAS_CXX11_AUTO_TYPE
73 #define VSMC_HAS_CXX11_AUTO_TYPE 1
74 #endif
75 #endif
76 
77 #if VSMC_MSVC_VERSION >= 1900
78 #ifndef VSMC_HAS_CXX11_CONSTEXPR
79 #define VSMC_HAS_CXX11_CONSTEXPR 1
80 #endif
81 #endif
82 
83 #if VSMC_MSVC_VERSION >= 1600
84 #ifndef VSMC_HAS_CXX11_DECLTYPE
85 #define VSMC_HAS_CXX11_DECLTYPE 1
86 #endif
87 #endif
88 
89 #if VSMC_MSVC_VERSION >= 1800
90 #ifndef VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS
91 #define VSMC_HAS_CXX11_DEFAULT_FUNCTION_TEMPLATE_ARGS 1
92 #endif
93 #endif
94 
95 #if VSMC_MSVC_VERSION >= 1900
96 #ifndef VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS
97 #define VSMC_HAS_CXX11_DEFAULTED_FUNCTIONS 1
98 #endif
99 #endif
100 
101 #if VSMC_MSVC_VERSION >= 1800
102 #ifndef VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS
103 #define VSMC_HAS_CXX11_DELEGATING_CONSTRUCTORS 1
104 #endif
105 #endif
106 
107 #if VSMC_MSVC_VERSION >= 1900
108 #ifndef VSMC_HAS_CXX11_DELETED_FUNCTIONS
109 #define VSMC_HAS_CXX11_DELETED_FUNCTIONS 1
110 #endif
111 #endif
112 
113 #if VSMC_MSVC_VERSION >= 1800
114 #ifndef VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS
115 #define VSMC_HAS_CXX11_EXPLICIT_CONVERSIONS 1
116 #endif
117 #endif
118 
119 #if VSMC_MSVC_VERSION >= 1800
120 #ifndef VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS
121 #define VSMC_HAS_CXX11_GENERALIZED_INITIALIZERS 1
122 #endif
123 #endif
124 
125 #if VSMC_MSVC_VERSION >= 1900
126 #ifndef VSMC_HAS_CXX11_IMPLICIT_MOVES
127 #define VSMC_HAS_CXX11_IMPLICIT_MOVES 1
128 #endif
129 #endif
130 
131 #if VSMC_MSVC_VERSION >= 1900
132 #ifndef VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS
133 #define VSMC_HAS_CXX11_INHERITING_CONSTRUCTORS 1
134 #endif
135 #endif
136 
137 #if VSMC_MSVC_VERSION >= 1900
138 #ifndef VSMC_HAS_CXX11_INLINE_NAMESPACES
139 #define VSMC_HAS_CXX11_INLINE_NAMESPACES 1
140 #endif
141 #endif
142 
143 #if VSMC_MSVC_VERSION >= 1600
144 #ifndef VSMC_HAS_CXX11_LAMBDAS
145 #define VSMC_HAS_CXX11_LAMBDAS 1
146 #endif
147 #endif
148 
149 #if VSMC_MSVC_VERSION >= 1600
150 #ifndef VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS
151 #define VSMC_HAS_CXX11_LOCAL_TYPE_TEMPLATE_ARGS 1
152 #endif
153 #endif
154 
155 #if VSMC_MSVC_VERSION >= 1900
156 #ifndef VSMC_HAS_CXX11_NOEXCEPT
157 #define VSMC_HAS_CXX11_NOEXCEPT 1
158 #endif
159 #endif
160 
161 #if VSMC_MSVC_VERSION >= 1800
162 #ifndef VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT
163 #define VSMC_HAS_CXX11_NONSTATIC_MEMBER_INIT 1
164 #endif
165 #endif
166 
167 #if VSMC_MSVC_VERSION >= 1600
168 #ifndef VSMC_HAS_CXX11_NULLPTR
169 #define VSMC_HAS_CXX11_NULLPTR 1
170 #endif
171 #endif
172 
173 #if VSMC_MSVC_VERSION >= 1700
174 #ifndef VSMC_HAS_CXX11_OVERRIDE_CONTROL
175 #define VSMC_HAS_CXX11_OVERRIDE_CONTROL 1
176 #endif
177 #endif
178 
179 #if VSMC_MSVC_VERSION >= 1700
180 #ifndef VSMC_HAS_CXX11_RANGE_FOR
181 #define VSMC_HAS_CXX11_RANGE_FOR 1
182 #endif
183 #endif
184 
185 #if VSMC_MSVC_VERSION >= 1800
186 #ifndef VSMC_HAS_CXX11_RAW_STRING_LITERALS
187 #define VSMC_HAS_CXX11_RAW_STRING_LITERALS 1
188 #endif
189 #endif
190 
191 #if VSMC_MSVC_VERSION >= 1900
192 #ifndef VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS
193 #define VSMC_HAS_CXX11_REFERENCE_QUALIFIED_FUNCTIONS 1
194 #endif
195 #endif
196 
197 #if VSMC_MSVC_VERSION >= 1600
198 #ifndef VSMC_HAS_CXX11_RVALUE_REFERENCES
199 #define VSMC_HAS_CXX11_RVALUE_REFERENCES 1
200 #endif
201 #endif
202 
203 #if VSMC_MSVC_VERSION >= 1600
204 #ifndef VSMC_HAS_CXX11_STATIC_ASSERT
205 #define VSMC_HAS_CXX11_STATIC_ASSERT 1
206 #endif
207 #endif
208 
209 #if VSMC_MSVC_VERSION >= 1700
210 #ifndef VSMC_HAS_CXX11_STRONG_ENUMS
211 #define VSMC_HAS_CXX11_STRONG_ENUMS 1
212 #endif
213 #endif
214 
215 #if VSMC_MSVC_VERSION >= 1900
216 #ifndef VSMC_HAS_CXX11_THREAD_LOCAL
217 #define VSMC_HAS_CXX11_THREAD_LOCAL 1
218 #endif
219 #endif
220 
221 #if VSMC_MSVC_VERSION >= 1600
222 #ifndef VSMC_HAS_CXX11_TRAILING_RETURN
223 #define VSMC_HAS_CXX11_TRAILING_RETURN 1
224 #endif
225 #endif
226 
227 #if VSMC_MSVC_VERSION >= 1900
228 #ifndef VSMC_HAS_CXX11_UNICODE_LITERALS
229 #define VSMC_HAS_CXX11_UNICODE_LITERALS 1
230 #endif
231 #endif
232 
233 #if VSMC_MSVC_VERSION >= 1900
234 #ifndef VSMC_HAS_CXX11_UNRESTRICTED_UNIONS
235 #define VSMC_HAS_CXX11_UNRESTRICTED_UNIONS 1
236 #endif
237 #endif
238 
239 #if VSMC_MSVC_VERSION >= 1900
240 #ifndef VSMC_HAS_CXX11_USER_LITERALS
241 #define VSMC_HAS_CXX11_USER_LITERALS 1
242 #endif
243 #endif
244 
245 #if VSMC_MSVC_VERSION >= 1800
246 #ifndef VSMC_HAS_CXX11_VARIADIC_TEMPLATES
247 #define VSMC_HAS_CXX11_VARIADIC_TEMPLATES 1
248 #endif
249 #endif
250 
251 // C++11 library features
252 
253 #if VSMC_MSVC_VERSION >= 1600
254 #ifndef VSMC_HAS_CXX11LIB_ALGORITHM
255 #define VSMC_HAS_CXX11LIB_ALGORITHM 1
256 #endif
257 #endif
258 
259 #if VSMC_MSVC_VERSION >= 1900
260 #ifndef VSMC_HAS_CXX11LIB_CHRONO
261 #define VSMC_HAS_CXX11LIB_CHRONO 1
262 #endif
263 #endif
264 
265 #if VSMC_MSVC_VERSION >= 1800
266 #ifndef VSMC_HAS_CXX11LIB_CMATH
267 #define VSMC_HAS_CXX11LIB_CMATH 1
268 #endif
269 #endif
270 
271 #if VSMC_MSVC_VERSION >= 1700
272 #ifndef VSMC_HAS_CXX11LIB_FUNCTIONAL
273 #define VSMC_HAS_CXX11LIB_FUNCTIONAL 1
274 #endif
275 #endif
276 
277 #if VSMC_MSVC_VERSION >= 1700
278 #ifndef VSMC_HAS_CXX11LIB_FUTURE
279 #define VSMC_HAS_CXX11LIB_FUTURE 1
280 #endif
281 #endif
282 
283 #if VSMC_MSVC_VERSION >= 1800
284 #ifndef VSMC_HAS_CXX11LIB_INITIALIZER_LIST
285 #define VSMC_HAS_CXX11LIB_INITIALIZER_LIST 1
286 #endif
287 #endif
288 
289 #if VSMC_MSVC_VERSION >= 1700
290 #ifndef VSMC_HAS_CXX11LIB_MUTEX
291 #define VSMC_HAS_CXX11LIB_MUTEX 1
292 #endif
293 #endif
294 
295 #if VSMC_MSVC_VERSION >= 1800
296 #ifndef VSMC_HAS_CXX11LIB_RANDOM
297 #define VSMC_HAS_CXX11LIB_RANDOM 1
298 #endif
299 #endif
300 
301 #if VSMC_MSVC_VERSION >= 1800
302 #ifndef VSMC_HAS_CXX11LIB_THREAD
303 #define VSMC_HAS_CXX11LIB_THREAD 1
304 #endif
305 #endif
306 
307 #if VSMC_MSVC_VERSION >= 1800
308 #ifndef VSMC_HAS_CXX11LIB_TUPLE
309 #define VSMC_HAS_CXX11LIB_TUPLE 1
310 #endif
311 #endif
312 
313 // C++14 language features
314 
315 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
316 #ifndef VSMC_HAS_CXX14_AGGREGATE_NSDMI
317 #define VSMC_HAS_CXX14_AGGREGATE_NSDMI 1
318 #endif
319 #endif
320 
321 #if VSMC_MSVC_VERSION >= 1900
322 #ifndef VSMC_HAS_CXX14_BINARY_LITERALS
323 #define VSMC_HAS_CXX14_BINARY_LITERALS 1
324 #endif
325 #endif
326 
327 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
328 #ifndef VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS
329 #define VSMC_HAS_CXX14_CONTEXTUAL_CONVERSIONS 1
330 #endif
331 #endif
332 
333 #if VSMC_MSVC_VERSION >= 1900
334 #ifndef VSMC_HAS_CXX14_DECLTYPE_AUTO
335 #define VSMC_HAS_CXX14_DECLTYPE_AUTO 1
336 #endif
337 #endif
338 
339 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
340 #ifndef VSMC_HAS_CXX14_DIGIT_SEPERATORS
341 #define VSMC_HAS_CXX14_DIGIT_SEPERATORS 1
342 #endif
343 #endif
344 
345 #if VSMC_MSVC_VERSION >= 1900
346 #ifndef VSMC_HAS_CXX14_GENERIC_LAMBDAS
347 #define VSMC_HAS_CXX14_GENERIC_LAMBDAS 1
348 #endif
349 #endif
350 
351 #if VSMC_MSVC_VERSION >= 1900
352 #ifndef VSMC_HAS_CXX14_INIT_CAPTURES
353 #define VSMC_HAS_CXX14_INIT_CAPTURES 1
354 #endif
355 #endif
356 
357 #if VSMC_MSVC_VERSION >= VSMC_NONEXIST
358 #ifndef VSMC_HAS_CXX14_RELAXED_CONSTEXPR
359 #define VSMC_HAS_CXX14_RELAXED_CONSTEXPR 1
360 #endif
361 #endif
362 
363 #if VSMC_MSVC_VERSION >= 1900
364 #ifndef VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION
365 #define VSMC_HAS_CXX14_RETURN_TYPE_DEDUCTION 1
366 #endif
367 #endif
368 
369 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
370 #ifndef VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS
371 #define VSMC_HAS_CXX14_RUNTIME_SIZED_ARRAYS 1
372 #endif
373 #endif
374 
375 #if VSMC_MSVC_VERSION >= VSMC_MSVC_NONEXIST
376 #ifndef VSMC_HAS_CXX14_VARIABLE_TEMPLATES
377 #define VSMC_HAS_CXX14_VARIABLE_TEMPLATES 1
378 #endif
379 #endif
380 
381 // C99 library features
382 
383 #if VSMC_MSVC_VERSION >= 1800
384 #ifndef VSMC_HAS_C99LIB_MATH
385 #define VSMC_HAS_C99LIB_MATH 1
386 #endif
387 #endif
388 
389 // Compiler features
390 
391 #ifndef VSMC_INT64
392 #define VSMC_INT64 __int64
393 #endif
394 
395 #ifndef VSMC_STRONG_INLINE
396 #define VSMC_STRONG_INLINE __forceinline
397 #endif
398 
399 // Target features
400 
401 #if _M_IX86_FP == 2 || defined(__AVX__)
402 #ifndef VSMC_HAS_SSE2
403 #define VSMC_HAS_SSE2 1
404 #endif
405 #endif
406 
407 // Parallelization features
408 
409 #if VSMC_MSVC_VERSION >= 1700
410 #ifndef VSMC_HAS_PPL
411 #define VSMC_HAS_PPL 1
412 #endif
413 #endif
414 
415 #ifdef _OPENMP
416 #ifndef VSMC_HAS_OMP
417 #define VSMC_HAS_OMP 1
418 #endif
419 #endif
420 
421 #endif // VSMC_INTERNAL_COMPILER_MSVC_HPP