codekingpro/portable-devtools
114k
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES.7//8//===----------------------------------------------------------------------===//9 10#ifndef _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H11#define _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H12 13#ifdef __cuda_std__14 15# if defined(_LIBCUDACXX_COMPILER_CLANG)16# pragma clang diagnostic push17# pragma clang diagnostic ignored "-Wmismatched-tags"18# endif // _LIBCUDACXX_COMPILER_CLANG19 20# if !defined(__CUDACC_RTC__)21// Fetch utility to get primary template for ::std::tuple_size necessary for the specialization of22// ::std::tuple_size<cuda::std::tuple> to enable structured bindings.23// See https://github.com/NVIDIA/libcudacxx/issues/31624# include <utility>25# endif26 27# include "../__fwd/array.h"28# include "../__fwd/pair.h"29# include "../__fwd/tuple.h"30# include "../__tuple_dir/tuple_element.h"31# include "../__tuple_dir/tuple_size.h"32# include "../__type_traits/integral_constant.h"33 34// This is a workaround for the fact that structured bindings require that the specializations of35// `tuple_size` and `tuple_element` reside in namespace std (https://eel.is/c++draft/dcl.struct.bind#4).36// See https://github.com/NVIDIA/libcudacxx/issues/316 for a short discussion37# if _LIBCUDACXX_STD_VER > 1438namespace std {39# if defined(__CUDACC_RTC__)40template <class... _Tp>41struct tuple_size;42 43template <size_t _Ip, class... _Tp>44struct tuple_element;45# endif46 47template <class _Tp, size_t _Size>48struct tuple_size<_CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>>49{};50 51template <class _Tp, size_t _Size>52struct tuple_size<const _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>>53{};54 55template <class _Tp, size_t _Size>56struct tuple_size<volatile _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>>57{};58 59template <class _Tp, size_t _Size>60struct tuple_size<const volatile _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>>61{};62 63template <size_t _Ip, class _Tp, size_t _Size>64struct tuple_element<_Ip, _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::array<_Tp, _Size>>65{};66 67template <size_t _Ip, class _Tp, size_t _Size>68struct tuple_element<_Ip, const _CUDA_VSTD::array<_Tp, _Size>>69 : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::array<_Tp, _Size>>70{};71 72template <size_t _Ip, class _Tp, size_t _Size>73struct tuple_element<_Ip, volatile _CUDA_VSTD::array<_Tp, _Size>>74 : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::array<_Tp, _Size>>75{};76 77template <size_t _Ip, class _Tp, size_t _Size>78struct tuple_element<_Ip, const volatile _CUDA_VSTD::array<_Tp, _Size>>79 : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::array<_Tp, _Size>>80{};81 82template <class _Tp, class _Up>83struct tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>>84{};85 86template <class _Tp, class _Up>87struct tuple_size<const _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>>88{};89 90template <class _Tp, class _Up>91struct tuple_size<volatile _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>>92{};93 94template <class _Tp, class _Up>95struct tuple_size<const volatile _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>>96{};97 98template <size_t _Ip, class _Tp, class _Up>99struct tuple_element<_Ip, _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::pair<_Tp, _Up>>100{};101 102template <size_t _Ip, class _Tp, class _Up>103struct tuple_element<_Ip, const _CUDA_VSTD::pair<_Tp, _Up>>104 : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::pair<_Tp, _Up>>105{};106 107template <size_t _Ip, class _Tp, class _Up>108struct tuple_element<_Ip, volatile _CUDA_VSTD::pair<_Tp, _Up>>109 : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::pair<_Tp, _Up>>110{};111 112template <size_t _Ip, class _Tp, class _Up>113struct tuple_element<_Ip, const volatile _CUDA_VSTD::pair<_Tp, _Up>>114 : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::pair<_Tp, _Up>>115{};116 117template <class... _Tp>118struct tuple_size<_CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>>119{};120 121template <class... _Tp>122struct tuple_size<const _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>>123{};124 125template <class... _Tp>126struct tuple_size<volatile _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>>127{};128 129template <class... _Tp>130struct tuple_size<const volatile _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>>131{};132 133template <size_t _Ip, class... _Tp>134struct tuple_element<_Ip, _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::tuple<_Tp...>>135{};136 137template <size_t _Ip, class... _Tp>138struct tuple_element<_Ip, const _CUDA_VSTD::tuple<_Tp...>>139 : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::tuple<_Tp...>>140{};141 142template <size_t _Ip, class... _Tp>143struct tuple_element<_Ip, volatile _CUDA_VSTD::tuple<_Tp...>>144 : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::tuple<_Tp...>>145{};146 147template <size_t _Ip, class... _Tp>148struct tuple_element<_Ip, const volatile _CUDA_VSTD::tuple<_Tp...>>149 : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::tuple<_Tp...>>150{};151} // namespace std152# endif // _LIBCUDACXX_STD_VER > 14153 154# if defined(_LIBCUDACXX_COMPILER_CLANG)155# pragma clang diagnostic pop156# endif // _LIBCUDACXX_COMPILER_CLANG157 158#endif // __cuda_std__159 160#endif // _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H161 