codekingpro/portable-devtools
114k
1/*2//@HEADER3// ************************************************************************4//5// Kokkos v. 2.06// Copyright (2019) Sandia Corporation7//8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,9// the U.S. Government retains certain rights in this software.10//11// Redistribution and use in source and binary forms, with or without12// modification, are permitted provided that the following conditions are13// met:14//15// 1. Redistributions of source code must retain the above copyright16// notice, this list of conditions and the following disclaimer.17//18// 2. Redistributions in binary form must reproduce the above copyright19// notice, this list of conditions and the following disclaimer in the20// documentation and/or other materials provided with the distribution.21//22// 3. Neither the name of the Corporation nor the names of the23// contributors may be used to endorse or promote products derived from24// this software without specific prior written permission.25//26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.37//38// Questions? Contact Christian R. Trott (crtrott@sandia.gov)39//40// ************************************************************************41//@HEADER42*/43 44 45#ifndef _LIBCUDACXX___MDSPAN_MACROS_HPP46#define _LIBCUDACXX___MDSPAN_MACROS_HPP47 48#ifndef __cuda_std__49#include <__config>50#endif // __cuda_std__51 52#include "../__mdspan/config.h"53#include "../__type_traits/enable_if.h"54#include "../__type_traits/is_void.h"55#include "../__type_traits/remove_reference.h"56#include "../__utility/declval.h"57 58#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)59# pragma GCC system_header60#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)61# pragma clang system_header62#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)63# pragma system_header64#endif // no system header65 66#if _LIBCUDACXX_STD_VER > 1167 68#ifndef __MDSPAN_FORCE_INLINE_FUNCTION69# ifdef __MDSPAN_COMPILER_MSVC // Microsoft compilers70# define __MDSPAN_FORCE_INLINE_FUNCTION __forceinline _LIBCUDACXX_HOST_DEVICE71# else72# define __MDSPAN_FORCE_INLINE_FUNCTION __attribute__((always_inline)) _LIBCUDACXX_HOST_DEVICE73# endif74#endif75 76#ifndef __MDSPAN_INLINE_FUNCTION77# define __MDSPAN_INLINE_FUNCTION inline _LIBCUDACXX_HOST_DEVICE78#endif79 80// In CUDA defaulted functions do not need host device markup81#ifndef __MDSPAN_INLINE_FUNCTION_DEFAULTED82# define __MDSPAN_INLINE_FUNCTION_DEFAULTED83#endif84 85//==============================================================================86// <editor-fold desc="Preprocessor helpers"> {{{187 88#define __MDSPAN_PP_COUNT(...) \89 __MDSPAN_PP_INTERNAL_EXPAND_ARGS_PRIVATE( \90 __MDSPAN_PP_INTERNAL_ARGS_AUGMENTER(__VA_ARGS__) \91 )92 93#define __MDSPAN_PP_INTERNAL_ARGS_AUGMENTER(...) unused, __VA_ARGS__94#define __MDSPAN_PP_INTERNAL_EXPAND(x) x95#define __MDSPAN_PP_INTERNAL_EXPAND_ARGS_PRIVATE(...) \96 __MDSPAN_PP_INTERNAL_EXPAND( \97 __MDSPAN_PP_INTERNAL_COUNT_PRIVATE( \98 __VA_ARGS__, 69, 68, 67, 66, 65, 64, 63, 62, 61, \99 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, \100 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, \101 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, \102 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, \103 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 \104 ) \105 )106# define __MDSPAN_PP_INTERNAL_COUNT_PRIVATE( \107 _1_, _2_, _3_, _4_, _5_, _6_, _7_, _8_, _9_, \108 _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, \109 _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, \110 _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, \111 _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, \112 _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, \113 _60, _61, _62, _63, _64, _65, _66, _67, _68, _69, \114 _70, count, ...) count \115 /**/116 117#define __MDSPAN_PP_STRINGIFY_IMPL(x) #x118#define __MDSPAN_PP_STRINGIFY(x) __MDSPAN_PP_STRINGIFY_IMPL(x)119 120#define __MDSPAN_PP_CAT_IMPL(x, y) x ## y121#define __MDSPAN_PP_CAT(x, y) __MDSPAN_PP_CAT_IMPL(x, y)122 123#define __MDSPAN_PP_EVAL(X, ...) X(__VA_ARGS__)124 125#define __MDSPAN_PP_REMOVE_PARENS_IMPL(...) __VA_ARGS__126#define __MDSPAN_PP_REMOVE_PARENS(...) __MDSPAN_PP_REMOVE_PARENS_IMPL __VA_ARGS__127 128// </editor-fold> end Preprocessor helpers }}}1129//==============================================================================130 131//==============================================================================132// <editor-fold desc="Concept emulation"> {{{1133 134// These compatibility macros don't help with partial ordering, but they should do the trick135// for what we need to do with concepts in mdspan136#ifdef __MDSPAN_USE_CONCEPTS137# define __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) > requires REQ138# define __MDSPAN_FUNCTION_REQUIRES(PAREN_PREQUALS, FNAME, PAREN_PARAMS, QUALS, REQ) \139 __MDSPAN_PP_REMOVE_PARENS(PAREN_PREQUALS) FNAME PAREN_PARAMS QUALS requires REQ \140 /**/141#else142# define __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) , typename _CUDA_VSTD::enable_if<(REQ), int>::type = 0>143# define __MDSPAN_FUNCTION_REQUIRES(PAREN_PREQUALS, FNAME, PAREN_PARAMS, QUALS, REQ) \144 __MDSPAN_TEMPLATE_REQUIRES( \145 class __function_requires_ignored=void, \146 (_CUDA_VSTD::is_void<__function_requires_ignored>::value && REQ) \147 ) __MDSPAN_PP_REMOVE_PARENS(PAREN_PREQUALS) FNAME PAREN_PARAMS QUALS \148 /**/149#endif150 151 152#if defined(__MDSPAN_COMPILER_MSVC)153# define __MDSPAN_TEMPLATE_REQUIRES(...) \154 __MDSPAN_PP_CAT( \155 __MDSPAN_PP_CAT(__MDSPAN_TEMPLATE_REQUIRES_, __MDSPAN_PP_COUNT(__VA_ARGS__))\156 (__VA_ARGS__), \157 ) \158 /**/159#else160# define __MDSPAN_TEMPLATE_REQUIRES(...) \161 __MDSPAN_PP_EVAL( \162 __MDSPAN_PP_CAT(__MDSPAN_TEMPLATE_REQUIRES_, __MDSPAN_PP_COUNT(__VA_ARGS__)), \163 __VA_ARGS__ \164 ) \165 /**/166#endif167 168#define __MDSPAN_TEMPLATE_REQUIRES_2(TP1, REQ) \169 template<TP1 \170 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \171 /**/172#define __MDSPAN_TEMPLATE_REQUIRES_3(TP1, TP2, REQ) \173 template<TP1, TP2 \174 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \175 /**/176#define __MDSPAN_TEMPLATE_REQUIRES_4(TP1, TP2, TP3, REQ) \177 template<TP1, TP2, TP3 \178 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \179 /**/180#define __MDSPAN_TEMPLATE_REQUIRES_5(TP1, TP2, TP3, TP4, REQ) \181 template<TP1, TP2, TP3, TP4 \182 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \183 /**/184#define __MDSPAN_TEMPLATE_REQUIRES_6(TP1, TP2, TP3, TP4, TP5, REQ) \185 template<TP1, TP2, TP3, TP4, TP5 \186 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \187 /**/188#define __MDSPAN_TEMPLATE_REQUIRES_7(TP1, TP2, TP3, TP4, TP5, TP6, REQ) \189 template<TP1, TP2, TP3, TP4, TP5, TP6 \190 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \191 /**/192#define __MDSPAN_TEMPLATE_REQUIRES_8(TP1, TP2, TP3, TP4, TP5, TP6, TP7, REQ) \193 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7 \194 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \195 /**/196#define __MDSPAN_TEMPLATE_REQUIRES_9(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, REQ) \197 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8 \198 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \199 /**/200#define __MDSPAN_TEMPLATE_REQUIRES_10(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, REQ) \201 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9 \202 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \203 /**/204#define __MDSPAN_TEMPLATE_REQUIRES_11(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, REQ) \205 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10 \206 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \207 /**/208#define __MDSPAN_TEMPLATE_REQUIRES_12(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, REQ) \209 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11 \210 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \211 /**/212#define __MDSPAN_TEMPLATE_REQUIRES_13(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, REQ) \213 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12 \214 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \215 /**/216#define __MDSPAN_TEMPLATE_REQUIRES_14(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, REQ) \217 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13 \218 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \219 /**/220#define __MDSPAN_TEMPLATE_REQUIRES_15(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, REQ) \221 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14 \222 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \223 /**/224#define __MDSPAN_TEMPLATE_REQUIRES_16(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, REQ) \225 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15 \226 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \227 /**/228#define __MDSPAN_TEMPLATE_REQUIRES_17(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, REQ) \229 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16 \230 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \231 /**/232#define __MDSPAN_TEMPLATE_REQUIRES_18(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, REQ) \233 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17 \234 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \235 /**/236#define __MDSPAN_TEMPLATE_REQUIRES_19(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, TP18, REQ) \237 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, TP18 \238 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \239 /**/240#define __MDSPAN_TEMPLATE_REQUIRES_20(TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, TP18, TP19, REQ) \241 template<TP1, TP2, TP3, TP4, TP5, TP6, TP7, TP8, TP9, TP10, TP11, TP12, TP13, TP14, TP15, TP16, TP17, TP18, TP19 \242 __MDSPAN_CLOSE_ANGLE_REQUIRES(REQ) \243 /**/244 245#define __MDSPAN_INSTANTIATE_ONLY_IF_USED \246 __MDSPAN_TEMPLATE_REQUIRES( \247 class __instantiate_only_if_used_tparam=void, \248 ( _LIBCUDACXX_TRAIT(_CUDA_VSTD::is_void, __instantiate_only_if_used_tparam) ) \249 ) \250 /**/251 252// </editor-fold> end Concept emulation }}}1253//==============================================================================254 255//==============================================================================256// <editor-fold desc="Return type deduction"> {{{1257 258#if __MDSPAN_USE_RETURN_TYPE_DEDUCTION259# define __MDSPAN_DEDUCE_RETURN_TYPE_SINGLE_LINE(SIGNATURE, BODY) \260 auto __MDSPAN_PP_REMOVE_PARENS(SIGNATURE) { return __MDSPAN_PP_REMOVE_PARENS(BODY); }261# define __MDSPAN_DEDUCE_DECLTYPE_AUTO_RETURN_TYPE_SINGLE_LINE(SIGNATURE, BODY) \262 decltype(auto) __MDSPAN_PP_REMOVE_PARENS(SIGNATURE) { return __MDSPAN_PP_REMOVE_PARENS(BODY); }263#else264# define __MDSPAN_DEDUCE_RETURN_TYPE_SINGLE_LINE(SIGNATURE, BODY) \265 auto __MDSPAN_PP_REMOVE_PARENS(SIGNATURE) \266 -> _CUDA_VSTD::remove_cv_t<_CUDA_VSTD::remove_reference_t<decltype(BODY)>> \267 { return __MDSPAN_PP_REMOVE_PARENS(BODY); }268# define __MDSPAN_DEDUCE_DECLTYPE_AUTO_RETURN_TYPE_SINGLE_LINE(SIGNATURE, BODY) \269 auto __MDSPAN_PP_REMOVE_PARENS(SIGNATURE) \270 -> decltype(BODY) \271 { return __MDSPAN_PP_REMOVE_PARENS(BODY); }272 273#endif274 275// </editor-fold> end Return type deduction }}}1276//==============================================================================277 278//==============================================================================279// <editor-fold desc="fold expressions"> {{{1280 281struct __mdspan_enable_fold_comma { };282 283#ifdef __MDSPAN_USE_FOLD_EXPRESSIONS284# define __MDSPAN_FOLD_AND(...) ((__VA_ARGS__) && ...)285# define __MDSPAN_FOLD_AND_TEMPLATE(...) ((__VA_ARGS__) && ...)286# define __MDSPAN_FOLD_OR(...) ((__VA_ARGS__) || ...)287# define __MDSPAN_FOLD_ASSIGN_LEFT(__INIT, ...) (__INIT = ... = (__VA_ARGS__))288# define __MDSPAN_FOLD_ASSIGN_RIGHT(__PACK, ...) (__PACK = ... = (__VA_ARGS__))289# define __MDSPAN_FOLD_TIMES_RIGHT(__PACK, ...) (__PACK * ... * (__VA_ARGS__))290# define __MDSPAN_FOLD_PLUS_RIGHT(__PACK, ...) (__PACK + ... + (__VA_ARGS__))291# define __MDSPAN_FOLD_COMMA(...) ((__VA_ARGS__), ...)292#else293 294_LIBCUDACXX_BEGIN_NAMESPACE_STD295 296namespace __fold_compatibility_impl {297 298// We could probably be more clever here, but at the (small) risk of losing some compiler understanding. For the299// few operations we need, it's not worth generalizing over the operation300 301#if __MDSPAN_USE_RETURN_TYPE_DEDUCTION302 303__MDSPAN_FORCE_INLINE_FUNCTION304constexpr decltype(auto) __fold_right_and_impl() {305 return true;306}307 308template <class _Arg, class... _Args>309__MDSPAN_FORCE_INLINE_FUNCTION310constexpr decltype(auto) __fold_right_and_impl(_Arg&& __arg, _Args&&... __args) {311 return ((_Arg&&)__arg) && __fold_compatibility_impl::__fold_right_and_impl((_Args&&)__args...);312}313 314__MDSPAN_FORCE_INLINE_FUNCTION315constexpr decltype(auto) __fold_right_or_impl() {316 return false;317}318 319template <class _Arg, class... _Args>320__MDSPAN_FORCE_INLINE_FUNCTION321constexpr auto __fold_right_or_impl(_Arg&& __arg, _Args&&... __args) {322 return ((_Arg&&)__arg) || __fold_compatibility_impl::__fold_right_or_impl((_Args&&)__args...);323}324 325template <class _Arg1>326__MDSPAN_FORCE_INLINE_FUNCTION327constexpr auto __fold_left_assign_impl(_Arg1&& __arg1) {328 return (_Arg1&&)__arg1;329}330 331template <class _Arg1, class _Arg2, class... _Args>332__MDSPAN_FORCE_INLINE_FUNCTION333constexpr auto __fold_left_assign_impl(_Arg1&& __arg1, _Arg2&& __arg2, _Args&&... __args) {334 return __fold_compatibility_impl::__fold_left_assign_impl((((_Arg1&&)__arg1) = ((_Arg2&&)__arg2)), (_Args&&)__args...);335}336 337template <class _Arg1>338__MDSPAN_FORCE_INLINE_FUNCTION339constexpr auto __fold_right_assign_impl(_Arg1&& __arg1) {340 return (_Arg1&&)__arg1;341}342 343template <class _Arg1, class _Arg2, class... _Args>344__MDSPAN_FORCE_INLINE_FUNCTION345constexpr auto __fold_right_assign_impl(_Arg1&& __arg1, _Arg2&& __arg2, _Args&&... __args) {346 return ((_Arg1&&)__arg1) = __fold_compatibility_impl::__fold_right_assign_impl((_Arg2&&)__arg2, (_Args&&)__args...);347}348 349template <class _Arg1>350__MDSPAN_FORCE_INLINE_FUNCTION351constexpr auto __fold_right_plus_impl(_Arg1&& __arg1) {352 return (_Arg1&&)__arg1;353}354 355template <class _Arg1, class _Arg2, class... _Args>356__MDSPAN_FORCE_INLINE_FUNCTION357constexpr auto __fold_right_plus_impl(_Arg1&& __arg1, _Arg2&& __arg2, _Args&&... __args) {358 return ((_Arg1&&)__arg1) + __fold_compatibility_impl::__fold_right_plus_impl((_Arg2&&)__arg2, (_Args&&)__args...);359}360 361template <class _Arg1>362__MDSPAN_FORCE_INLINE_FUNCTION363constexpr auto __fold_right_times_impl(_Arg1&& __arg1) {364 return (_Arg1&&)__arg1;365}366 367template <class _Arg1, class _Arg2, class... _Args>368__MDSPAN_FORCE_INLINE_FUNCTION369constexpr auto __fold_right_times_impl(_Arg1&& __arg1, _Arg2&& __arg2, _Args&&... __args) {370 return ((_Arg1&&)__arg1) * __fold_compatibility_impl::__fold_right_times_impl((_Arg2&&)__arg2, (_Args&&)__args...);371}372 373#else374 375//------------------------------------------------------------------------------376// <editor-fold desc="right and"> {{{2377 378template <class... _Args>379struct __fold_right_and_impl_;380template <>381struct __fold_right_and_impl_<> {382 using __rv = bool;383 __MDSPAN_FORCE_INLINE_FUNCTION384 static constexpr __rv385 __impl() noexcept {386 return true;387 }388};389template <class _Arg, class... _Args>390struct __fold_right_and_impl_<_Arg, _Args...> {391 using __next_t = __fold_right_and_impl_<_Args...>;392 using __rv = decltype(_CUDA_VSTD::declval<_Arg>() && _CUDA_VSTD::declval<typename __next_t::__rv>());393 __MDSPAN_FORCE_INLINE_FUNCTION394 static constexpr __rv395 __impl(_Arg&& __arg, _Args&&... __args) noexcept {396 return ((_Arg&&)__arg) && __next_t::__impl((_Args&&)__args...);397 }398};399 400template <class... _Args>401__MDSPAN_FORCE_INLINE_FUNCTION402constexpr typename __fold_right_and_impl_<_Args...>::__rv403__fold_right_and_impl(_Args&&... __args) {404 return __fold_right_and_impl_<_Args...>::__impl((_Args&&)__args...);405}406 407// </editor-fold> end right and }}}2408//------------------------------------------------------------------------------409 410//------------------------------------------------------------------------------411// <editor-fold desc="right or"> {{{2412 413template <class... _Args>414struct __fold_right_or_impl_;415template <>416struct __fold_right_or_impl_<> {417 using __rv = bool;418 __MDSPAN_FORCE_INLINE_FUNCTION419 static constexpr __rv420 __impl() noexcept {421 return false;422 }423};424template <class _Arg, class... _Args>425struct __fold_right_or_impl_<_Arg, _Args...> {426 using __next_t = __fold_right_or_impl_<_Args...>;427 using __rv = decltype(_CUDA_VSTD::declval<_Arg>() || _CUDA_VSTD::declval<typename __next_t::__rv>());428 __MDSPAN_FORCE_INLINE_FUNCTION429 static constexpr __rv430 __impl(_Arg&& __arg, _Args&&... __args) noexcept {431 return ((_Arg&&)__arg) || __next_t::__impl((_Args&&)__args...);432 }433};434 435template <class... _Args>436__MDSPAN_FORCE_INLINE_FUNCTION437constexpr typename __fold_right_or_impl_<_Args...>::__rv438__fold_right_or_impl(_Args&&... __args) {439 return __fold_right_or_impl_<_Args...>::__impl((_Args&&)__args...);440}441 442// </editor-fold> end right or }}}2443//------------------------------------------------------------------------------444 445//------------------------------------------------------------------------------446// <editor-fold desc="right plus"> {{{2447 448template <class... _Args>449struct __fold_right_plus_impl_;450template <class _Arg>451struct __fold_right_plus_impl_<_Arg> {452 using __rv = _Arg&&;453 __MDSPAN_FORCE_INLINE_FUNCTION454 static constexpr __rv455 __impl(_Arg&& __arg) noexcept {456 return (_Arg&&)__arg;457 }458};459template <class _Arg1, class _Arg2, class... _Args>460struct __fold_right_plus_impl_<_Arg1, _Arg2, _Args...> {461 using __next_t = __fold_right_plus_impl_<_Arg2, _Args...>;462 using __rv = decltype(_CUDA_VSTD::declval<_Arg1>() + _CUDA_VSTD::declval<typename __next_t::__rv>());463 __MDSPAN_FORCE_INLINE_FUNCTION464 static constexpr __rv465 __impl(_Arg1&& __arg, _Arg2&& __arg2, _Args&&... __args) noexcept {466 return ((_Arg1&&)__arg) + __next_t::__impl((_Arg2&&)__arg2, (_Args&&)__args...);467 }468};469 470template <class... _Args>471__MDSPAN_FORCE_INLINE_FUNCTION472constexpr typename __fold_right_plus_impl_<_Args...>::__rv473__fold_right_plus_impl(_Args&&... __args) {474 return __fold_right_plus_impl_<_Args...>::__impl((_Args&&)__args...);475}476 477// </editor-fold> end right plus }}}2478//------------------------------------------------------------------------------479 480//------------------------------------------------------------------------------481// <editor-fold desc="right times"> {{{2482 483template <class... _Args>484struct __fold_right_times_impl_;485template <class _Arg>486struct __fold_right_times_impl_<_Arg> {487 using __rv = _Arg&&;488 __MDSPAN_FORCE_INLINE_FUNCTION489 static constexpr __rv490 __impl(_Arg&& __arg) noexcept {491 return (_Arg&&)__arg;492 }493};494template <class _Arg1, class _Arg2, class... _Args>495struct __fold_right_times_impl_<_Arg1, _Arg2, _Args...> {496 using __next_t = __fold_right_times_impl_<_Arg2, _Args...>;497 using __rv = decltype(_CUDA_VSTD::declval<_Arg1>() * _CUDA_VSTD::declval<typename __next_t::__rv>());498 __MDSPAN_FORCE_INLINE_FUNCTION499 static constexpr __rv500 __impl(_Arg1&& __arg, _Arg2&& __arg2, _Args&&... __args) noexcept {501 return ((_Arg1&&)__arg) * __next_t::__impl((_Arg2&&)__arg2, (_Args&&)__args...);502 }503};504 505template <class... _Args>506__MDSPAN_FORCE_INLINE_FUNCTION507constexpr typename __fold_right_times_impl_<_Args...>::__rv508__fold_right_times_impl(_Args&&... __args) {509 return __fold_right_times_impl_<_Args...>::__impl((_Args&&)__args...);510}511 512// </editor-fold> end right times }}}2513//------------------------------------------------------------------------------514 515//------------------------------------------------------------------------------516// <editor-fold desc="right assign"> {{{2517 518template <class... _Args>519struct __fold_right_assign_impl_;520template <class _Arg>521struct __fold_right_assign_impl_<_Arg> {522 using __rv = _Arg&&;523 __MDSPAN_FORCE_INLINE_FUNCTION524 static constexpr __rv525 __impl(_Arg&& __arg) noexcept {526 return (_Arg&&)__arg;527 }528};529template <class _Arg1, class _Arg2, class... _Args>530struct __fold_right_assign_impl_<_Arg1, _Arg2, _Args...> {531 using __next_t = __fold_right_assign_impl_<_Arg2, _Args...>;532 using __rv = decltype(_CUDA_VSTD::declval<_Arg1>() = _CUDA_VSTD::declval<typename __next_t::__rv>());533 __MDSPAN_FORCE_INLINE_FUNCTION534 static constexpr __rv535 __impl(_Arg1&& __arg, _Arg2&& __arg2, _Args&&... __args) noexcept {536 return ((_Arg1&&)__arg) = __next_t::__impl((_Arg2&&)__arg2, (_Args&&)__args...);537 }538};539 540template <class... _Args>541__MDSPAN_FORCE_INLINE_FUNCTION542constexpr typename __fold_right_assign_impl_<_Args...>::__rv543__fold_right_assign_impl(_Args&&... __args) {544 return __fold_right_assign_impl_<_Args...>::__impl((_Args&&)__args...);545}546 547// </editor-fold> end right assign }}}2548//------------------------------------------------------------------------------549 550//------------------------------------------------------------------------------551// <editor-fold desc="left assign"> {{{2552 553template <class... _Args>554struct __fold_left_assign_impl_;555template <class _Arg>556struct __fold_left_assign_impl_<_Arg> {557 using __rv = _Arg&&;558 __MDSPAN_FORCE_INLINE_FUNCTION559 static constexpr __rv560 __impl(_Arg&& __arg) noexcept {561 return (_Arg&&)__arg;562 }563};564template <class _Arg1, class _Arg2, class... _Args>565struct __fold_left_assign_impl_<_Arg1, _Arg2, _Args...> {566 using __assign_result_t = decltype(_CUDA_VSTD::declval<_Arg1>() = _CUDA_VSTD::declval<_Arg2>());567 using __next_t = __fold_left_assign_impl_<__assign_result_t, _Args...>;568 using __rv = typename __next_t::__rv;569 __MDSPAN_FORCE_INLINE_FUNCTION570 static constexpr __rv571 __impl(_Arg1&& __arg, _Arg2&& __arg2, _Args&&... __args) noexcept {572 return __next_t::__impl(((_Arg1&&)__arg) = (_Arg2&&)__arg2, (_Args&&)__args...);573 }574};575 576template <class... _Args>577__MDSPAN_FORCE_INLINE_FUNCTION578constexpr typename __fold_left_assign_impl_<_Args...>::__rv579__fold_left_assign_impl(_Args&&... __args) {580 return __fold_left_assign_impl_<_Args...>::__impl((_Args&&)__args...);581}582 583// </editor-fold> end left assign }}}2584//------------------------------------------------------------------------------585 586#endif587 588 589template <class... _Args>590_LIBCUDACXX_HOST_DEVICE591constexpr __mdspan_enable_fold_comma __fold_comma_impl(_Args&&...) noexcept { return { }; }592 593template <bool... _Bs>594struct __bools;595 596} // __fold_compatibility_impl597 598_LIBCUDACXX_END_NAMESPACE_STD599 600# define __MDSPAN_FOLD_AND(...) _CUDA_VSTD::__fold_compatibility_impl::__fold_right_and_impl((__VA_ARGS__)...)601# define __MDSPAN_FOLD_OR(...) _CUDA_VSTD::__fold_compatibility_impl::__fold_right_or_impl((__VA_ARGS__)...)602# define __MDSPAN_FOLD_ASSIGN_LEFT(__INIT, ...) _CUDA_VSTD::__fold_compatibility_impl::__fold_left_assign_impl(__INIT, (__VA_ARGS__)...)603# define __MDSPAN_FOLD_ASSIGN_RIGHT(__PACK, ...) _CUDA_VSTD::__fold_compatibility_impl::__fold_right_assign_impl((__PACK)..., __VA_ARGS__)604# define __MDSPAN_FOLD_TIMES_RIGHT(__PACK, ...) _CUDA_VSTD::__fold_compatibility_impl::__fold_right_times_impl((__PACK)..., __VA_ARGS__)605# define __MDSPAN_FOLD_PLUS_RIGHT(__PACK, ...) _CUDA_VSTD::__fold_compatibility_impl::__fold_right_plus_impl((__PACK)..., __VA_ARGS__)606# define __MDSPAN_FOLD_COMMA(...) _CUDA_VSTD::__fold_compatibility_impl::__fold_comma_impl((__VA_ARGS__)...)607 608# define __MDSPAN_FOLD_AND_TEMPLATE(...) \609 _LIBCUDACXX_TRAIT(_CUDA_VSTD::is_same, __fold_compatibility_impl::__bools<(__VA_ARGS__)..., true>, __fold_compatibility_impl::__bools<true, (__VA_ARGS__)...>)610 611#endif612 613// </editor-fold> end Variable template compatibility }}}1614//==============================================================================615 616//==============================================================================617// <editor-fold desc="Pre-C++14 constexpr"> {{{1618 619#if __MDSPAN_USE_CONSTEXPR_14620// Workaround for a bug (I think?) in EDG frontends621# ifdef __EDG__622# define __MDSPAN_CONSTEXPR_14_DEFAULTED623# else624# define __MDSPAN_CONSTEXPR_14_DEFAULTED constexpr625# endif626#else627# define __MDSPAN_CONSTEXPR_14_DEFAULTED628#endif629 630// </editor-fold> end Pre-C++14 constexpr }}}1631//==============================================================================632 633#endif // _LIBCUDACXX_STD_VER > 11634 635#ifndef _LIBCUDACXX_NO_EXCEPTIONS636#define _LIBCUDACXX_THROW_RUNTIME_ERROR(_COND, _MESSAGE) \637 if (!(_COND)) __throw_runtime_error(_MESSAGE)638#else639#define _LIBCUDACXX_THROW_RUNTIME_ERROR(_COND, _MESSAGE) \640 _LIBCUDACXX_ASSERT(_COND, _MESSAGE)641#endif642 643#endif // _LIBCUDACXX___MDSPAN_MACROS_HPP644 