forked from kokkos/mdspan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.hpp
302 lines (269 loc) · 10.6 KB
/
config.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
/*
//@HEADER
// ************************************************************************
//
// Kokkos v. 2.0
// Copyright (2019) Sandia Corporation
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// 3. Neither the name of the Corporation nor the names of the
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Questions? Contact Christian R. Trott (crtrott@sandia.gov)
//
// ************************************************************************
//@HEADER
*/
#pragma once
#ifndef __has_include
# define __has_include(x) 0
#endif
#if __has_include(<version>)
# include <version>
#else
# include <type_traits>
# include <utility>
#endif
#ifdef _MSVC_LANG
#define _MDSPAN_CPLUSPLUS _MSVC_LANG
#else
#define _MDSPAN_CPLUSPLUS __cplusplus
#endif
#define MDSPAN_CXX_STD_14 201402L
#define MDSPAN_CXX_STD_17 201703L
#define MDSPAN_CXX_STD_20 202002L
#define MDSPAN_HAS_CXX_14 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_14)
#define MDSPAN_HAS_CXX_17 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_17)
#define MDSPAN_HAS_CXX_20 (_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_20)
static_assert(_MDSPAN_CPLUSPLUS >= MDSPAN_CXX_STD_14, "mdspan requires C++14 or later.");
#ifndef _MDSPAN_COMPILER_CLANG
# if defined(__clang__)
# define _MDSPAN_COMPILER_CLANG __clang__
# endif
#endif
#if !defined(_MDSPAN_COMPILER_MSVC) && !defined(_MDSPAN_COMPILER_MSVC_CLANG)
# if defined(_MSC_VER)
# if !defined(_MDSPAN_COMPILER_CLANG)
# define _MDSPAN_COMPILER_MSVC _MSC_VER
# else
# define _MDSPAN_COMPILER_MSVC_CLANG _MSC_VER
# endif
# endif
#endif
#ifndef _MDSPAN_COMPILER_INTEL
# ifdef __INTEL_COMPILER
# define _MDSPAN_COMPILER_INTEL __INTEL_COMPILER
# endif
#endif
#ifndef _MDSPAN_COMPILER_APPLECLANG
# ifdef __apple_build_version__
# define _MDSPAN_COMPILER_APPLECLANG __apple_build_version__
# endif
#endif
#ifndef _MDSPAN_HAS_CUDA
# if defined(__CUDACC__)
# define _MDSPAN_HAS_CUDA __CUDACC__
# endif
#endif
#ifndef _MDSPAN_HAS_HIP
# if defined(__HIPCC__)
# define _MDSPAN_HAS_HIP __HIPCC__
# endif
#endif
#ifndef __has_cpp_attribute
# define __has_cpp_attribute(x) 0
#endif
#ifndef _MDSPAN_PRESERVE_STANDARD_LAYOUT
// Preserve standard layout by default, but we're not removing the old version
// that turns this off until we're sure this doesn't have an unreasonable cost
// to the compiler or optimizer.
# define _MDSPAN_PRESERVE_STANDARD_LAYOUT 1
#endif
#if !defined(_MDSPAN_USE_ATTRIBUTE_NO_UNIQUE_ADDRESS)
# if ((__has_cpp_attribute(no_unique_address) >= 201803L) && \
(!defined(__NVCC__) || MDSPAN_HAS_CXX_20) && \
(!defined(_MDSPAN_COMPILER_MSVC) || MDSPAN_HAS_CXX_20))
# define _MDSPAN_USE_ATTRIBUTE_NO_UNIQUE_ADDRESS 1
# define _MDSPAN_NO_UNIQUE_ADDRESS [[no_unique_address]]
# else
# define _MDSPAN_NO_UNIQUE_ADDRESS
# endif
#endif
// NVCC older than 11.6 chokes on the no-unique-address-emulation
// so just pretend to use it (to avoid the full blown EBO workaround
// which NVCC also doesn't like ...), and leave the macro empty
#ifndef _MDSPAN_NO_UNIQUE_ADDRESS
# if defined(__NVCC__)
# define _MDSPAN_USE_ATTRIBUTE_NO_UNIQUE_ADDRESS 1
# define _MDSPAN_USE_FAKE_ATTRIBUTE_NO_UNIQUE_ADDRESS
# endif
# define _MDSPAN_NO_UNIQUE_ADDRESS
#endif
#ifndef _MDSPAN_USE_CONCEPTS
# if defined(__cpp_concepts) && __cpp_concepts >= 201507L
# define _MDSPAN_USE_CONCEPTS 1
# endif
#endif
#ifndef _MDSPAN_USE_FOLD_EXPRESSIONS
# if (defined(__cpp_fold_expressions) && __cpp_fold_expressions >= 201603L) \
|| (!defined(__cpp_fold_expressions) && MDSPAN_HAS_CXX_17)
# define _MDSPAN_USE_FOLD_EXPRESSIONS 1
# endif
#endif
#ifndef _MDSPAN_USE_INLINE_VARIABLES
# if defined(__cpp_inline_variables) && __cpp_inline_variables >= 201606L \
|| (!defined(__cpp_inline_variables) && MDSPAN_HAS_CXX_17)
# define _MDSPAN_USE_INLINE_VARIABLES 1
# endif
#endif
#ifndef _MDSPAN_NEEDS_TRAIT_VARIABLE_TEMPLATE_BACKPORTS
# if (!(defined(__cpp_lib_type_trait_variable_templates) && __cpp_lib_type_trait_variable_templates >= 201510L) \
|| !MDSPAN_HAS_CXX_17)
# if !(defined(_MDSPAN_COMPILER_APPLECLANG) && MDSPAN_HAS_CXX_17)
# define _MDSPAN_NEEDS_TRAIT_VARIABLE_TEMPLATE_BACKPORTS 1
# endif
# endif
#endif
#ifndef _MDSPAN_USE_VARIABLE_TEMPLATES
# if (defined(__cpp_variable_templates) && __cpp_variable_templates >= 201304 && MDSPAN_HAS_CXX_17) \
|| (!defined(__cpp_variable_templates) && MDSPAN_HAS_CXX_17)
# define _MDSPAN_USE_VARIABLE_TEMPLATES 1
# endif
#endif // _MDSPAN_USE_VARIABLE_TEMPLATES
#ifndef _MDSPAN_USE_CONSTEXPR_14
# if (defined(__cpp_constexpr) && __cpp_constexpr >= 201304) \
|| (!defined(__cpp_constexpr) && MDSPAN_HAS_CXX_14) \
&& (!(defined(__INTEL_COMPILER) && __INTEL_COMPILER <= 1700))
# define _MDSPAN_USE_CONSTEXPR_14 1
# endif
#endif
#ifndef _MDSPAN_USE_INTEGER_SEQUENCE
# if defined(_MDSPAN_COMPILER_MSVC)
# if (defined(__cpp_lib_integer_sequence) && __cpp_lib_integer_sequence >= 201304)
# define _MDSPAN_USE_INTEGER_SEQUENCE 1
# endif
# endif
#endif
#ifndef _MDSPAN_USE_INTEGER_SEQUENCE
# if (defined(__cpp_lib_integer_sequence) && __cpp_lib_integer_sequence >= 201304) \
|| (!defined(__cpp_lib_integer_sequence) && MDSPAN_HAS_CXX_14) \
/* as far as I can tell, libc++ seems to think this is a C++11 feature... */ \
|| (defined(__GLIBCXX__) && __GLIBCXX__ > 20150422 && __GNUC__ < 5 && !defined(__INTEL_CXX11_MODE__))
// several compilers lie about integer_sequence working properly unless the C++14 standard is used
# define _MDSPAN_USE_INTEGER_SEQUENCE 1
# elif defined(_MDSPAN_COMPILER_APPLECLANG) && MDSPAN_HAS_CXX_14
// appleclang seems to be missing the __cpp_lib_... macros, but doesn't seem to lie about C++14 making
// integer_sequence work
# define _MDSPAN_USE_INTEGER_SEQUENCE 1
# endif
#endif
#ifndef _MDSPAN_USE_RETURN_TYPE_DEDUCTION
# if (defined(__cpp_return_type_deduction) && __cpp_return_type_deduction >= 201304) \
|| (!defined(__cpp_return_type_deduction) && MDSPAN_HAS_CXX_14)
# define _MDSPAN_USE_RETURN_TYPE_DEDUCTION 1
# endif
#endif
#ifndef _MDSPAN_USE_CLASS_TEMPLATE_ARGUMENT_DEDUCTION
// GCC 10's CTAD seems sufficiently broken to prevent its use.
# if (defined(_MDSPAN_COMPILER_CLANG) || !defined(__GNUC__) || __GNUC__ >= 11) \
&& ((defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201703) \
|| (!defined(__cpp_deduction_guides) && MDSPAN_HAS_CXX_17))
# define _MDSPAN_USE_CLASS_TEMPLATE_ARGUMENT_DEDUCTION 1
# endif
#endif
#ifndef _MDSPAN_USE_ALIAS_TEMPLATE_ARGUMENT_DEDUCTION
// GCC 10's CTAD seems sufficiently broken to prevent its use.
# if (defined(_MDSPAN_COMPILER_CLANG) || !defined(__GNUC__) || __GNUC__ >= 11) \
&& ((defined(__cpp_deduction_guides) && __cpp_deduction_guides >= 201907) \
|| (!defined(__cpp_deduction_guides) && MDSPAN_HAS_CXX_20))
# define _MDSPAN_USE_ALIAS_TEMPLATE_ARGUMENT_DEDUCTION 1
# endif
#endif
#ifndef _MDSPAN_USE_STANDARD_TRAIT_ALIASES
# if (defined(__cpp_lib_transformation_trait_aliases) && __cpp_lib_transformation_trait_aliases >= 201304) \
|| (!defined(__cpp_lib_transformation_trait_aliases) && MDSPAN_HAS_CXX_14)
# define _MDSPAN_USE_STANDARD_TRAIT_ALIASES 1
# elif defined(_MDSPAN_COMPILER_APPLECLANG) && MDSPAN_HAS_CXX_14
// appleclang seems to be missing the __cpp_lib_... macros, but doesn't seem to lie about C++14
# define _MDSPAN_USE_STANDARD_TRAIT_ALIASES 1
# endif
#endif
#ifndef _MDSPAN_DEFAULTED_CONSTRUCTORS_INHERITANCE_WORKAROUND
# ifdef __GNUC__
# if __GNUC__ < 9
# define _MDSPAN_DEFAULTED_CONSTRUCTORS_INHERITANCE_WORKAROUND 1
# endif
# endif
#endif
#ifndef MDSPAN_CONDITIONAL_EXPLICIT
# if MDSPAN_HAS_CXX_20 && !defined(_MDSPAN_COMPILER_MSVC)
# define MDSPAN_CONDITIONAL_EXPLICIT(COND) explicit(COND)
# else
# define MDSPAN_CONDITIONAL_EXPLICIT(COND)
# endif
#endif
#ifndef MDSPAN_USE_BRACKET_OPERATOR
# if defined(__cpp_multidimensional_subscript)
# define MDSPAN_USE_BRACKET_OPERATOR 1
# else
# define MDSPAN_USE_BRACKET_OPERATOR 0
# endif
#endif
#ifndef MDSPAN_USE_PAREN_OPERATOR
# if !MDSPAN_USE_BRACKET_OPERATOR
# define MDSPAN_USE_PAREN_OPERATOR 1
# else
# define MDSPAN_USE_PAREN_OPERATOR 0
# endif
#endif
#if MDSPAN_USE_BRACKET_OPERATOR
# define __MDSPAN_OP(mds,...) mds[__VA_ARGS__]
// Corentins demo compiler for subscript chokes on empty [] call,
// though I believe the proposal supports it?
#ifdef MDSPAN_NO_EMPTY_BRACKET_OPERATOR
# define __MDSPAN_OP0(mds) mds.accessor().access(mds.data_handle(),0)
#else
# define __MDSPAN_OP0(mds) mds[]
#endif
# define __MDSPAN_OP1(mds, a) mds[a]
# define __MDSPAN_OP2(mds, a, b) mds[a,b]
# define __MDSPAN_OP3(mds, a, b, c) mds[a,b,c]
# define __MDSPAN_OP4(mds, a, b, c, d) mds[a,b,c,d]
# define __MDSPAN_OP5(mds, a, b, c, d, e) mds[a,b,c,d,e]
# define __MDSPAN_OP6(mds, a, b, c, d, e, f) mds[a,b,c,d,e,f]
#else
# define __MDSPAN_OP(mds,...) mds(__VA_ARGS__)
# define __MDSPAN_OP0(mds) mds()
# define __MDSPAN_OP1(mds, a) mds(a)
# define __MDSPAN_OP2(mds, a, b) mds(a,b)
# define __MDSPAN_OP3(mds, a, b, c) mds(a,b,c)
# define __MDSPAN_OP4(mds, a, b, c, d) mds(a,b,c,d)
# define __MDSPAN_OP5(mds, a, b, c, d, e) mds(a,b,c,d,e)
# define __MDSPAN_OP6(mds, a, b, c, d, e, f) mds(a,b,c,d,e,f)
#endif