//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // SPDX-FileCopyrightText: Copyright (c) 2023-24 NVIDIA CORPORATION & AFFILIATES. // //===----------------------------------------------------------------------===// #ifndef _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H #define _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H #include #if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC) # pragma GCC system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG) # pragma clang system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC) # pragma system_header #endif // no system header _CCCL_DIAG_PUSH _CCCL_DIAG_SUPPRESS_CLANG("-Wmismatched-tags") #if !defined(_CCCL_COMPILER_NVRTC) // Fetch utility to get primary template for ::std::tuple_size necessary for the specialization of // ::std::tuple_size to enable structured bindings. // See https://github.com/NVIDIA/libcudacxx/issues/316 # include #endif // !_CCCL_COMPILER_NVRTC #include #include #include #include #include #include #include // This is a workaround for the fact that structured bindings require that the specializations of // `tuple_size` and `tuple_element` reside in namespace std (https://eel.is/c++draft/dcl.struct.bind#4). // See https://github.com/NVIDIA/libcudacxx/issues/316 for a short discussion #if _CCCL_STD_VER >= 2017 namespace std { # if defined(_CCCL_COMPILER_NVRTC) template struct tuple_size; template struct tuple_element; # endif // _CCCL_COMPILER_NVRTC template struct tuple_size<_CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_element<_Ip, _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_element<_Ip, const _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_element<_Ip, volatile _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_element<_Ip, const volatile _CUDA_VSTD::array<_Tp, _Size>> : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::array<_Tp, _Size>> {}; template struct tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_element<_Ip, _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_element<_Ip, const _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_element<_Ip, volatile _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_element<_Ip, const volatile _CUDA_VSTD::pair<_Tp, _Up>> : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::pair<_Tp, _Up>> {}; template struct tuple_size<_CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_element<_Ip, _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_element<_Ip, _CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_element<_Ip, const _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_element<_Ip, const _CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_element<_Ip, volatile _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_element<_Ip, volatile _CUDA_VSTD::tuple<_Tp...>> {}; template struct tuple_element<_Ip, const volatile _CUDA_VSTD::tuple<_Tp...>> : _CUDA_VSTD::tuple_element<_Ip, const volatile _CUDA_VSTD::tuple<_Tp...>> {}; # if !defined(_CCCL_COMPILER_MSVC_2017) template struct tuple_size<_CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> : _CUDA_VSTD::tuple_size<_CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_size> : _CUDA_VSTD::tuple_size<_CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_element<_Idx, _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> : _CUDA_VSTD::tuple_element<_Idx, _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_element<_Idx, const _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> : _CUDA_VSTD::tuple_element<_Idx, const _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_element<_Idx, volatile _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> : _CUDA_VSTD::tuple_element<_Idx, volatile _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; template struct tuple_element<_Idx, const volatile _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> : _CUDA_VSTD::tuple_element<_Idx, const volatile _CUDA_VRANGES::subrange<_Ip, _Sp, _Kp>> {}; # endif // !_CCCL_COMPILER_MSVC_2017 } // namespace std #endif // _CCCL_STD_VER >= 2017 _CCCL_DIAG_POP #endif // _LIBCUDACXX___TUPLE_STRUCTURED_BINDINGS_H