codekingpro/portable-devtools
114k
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES.8//9//===----------------------------------------------------------------------===//10 11#ifndef _LIBCUDACXX___ITERATOR_ITER_MOVE_H12#define _LIBCUDACXX___ITERATOR_ITER_MOVE_H13 14#ifndef __cuda_std__15#include <__config>16#endif // __cuda_std__17 18#include "../__concepts/class_or_enum.h"19#include "../__iterator/iterator_traits.h"20#include "../__type_traits/enable_if.h"21#include "../__type_traits/is_reference.h"22#include "../__type_traits/remove_cvref.h"23#include "../__utility/declval.h"24#include "../__utility/forward.h"25#include "../__utility/move.h"26 27#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)28# pragma GCC system_header29#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)30# pragma clang system_header31#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)32# pragma system_header33#endif // no system header34 35#if defined(__clang__)36#pragma clang diagnostic push37#pragma clang diagnostic ignored "-Wvoid-ptr-dereference"38#endif39 40 41#if _LIBCUDACXX_STD_VER > 1442 43// [iterator.cust.move]44 45_LIBCUDACXX_BEGIN_NAMESPACE_RANGES46_LIBCUDACXX_BEGIN_NAMESPACE_CPO(__iter_move)47 48_LIBCUDACXX_INLINE_VISIBILITY49void iter_move();50 51#if LIBCUDACXX_STD_VER > 1752template <class _Tp>53concept __unqualified_iter_move =54 __class_or_enum<remove_cvref_t<_Tp>> &&55 requires (_Tp&& __t) {56 iter_move(_CUDA_VSTD::forward<_Tp>(__t));57 };58 59template<class _Tp>60concept __move_deref =61 !__unqualified_iter_move<_Tp> &&62 requires (_Tp&& __t) {63 *__t;64 requires is_lvalue_reference_v<decltype(*__t)>;65 };66 67template<class _Tp>68concept __just_deref =69 !__unqualified_iter_move<_Tp> &&70 !__move_deref<_Tp> &&71 requires (_Tp&& __t) {72 *__t;73 requires (!is_lvalue_reference_v<decltype(*__t)>);74 };75 76#else // ^^^ CXX20 ^^^ / vvv CXX17 vvv77 78template <class _Tp>79_LIBCUDACXX_CONCEPT_FRAGMENT(80 __unqualified_iter_move_,81 requires(_Tp&& __t)(82 requires(__class_or_enum<remove_cvref_t<_Tp>>),83 (iter_move(_CUDA_VSTD::forward<_Tp>(__t)))84 ));85 86template <class _Tp>87_LIBCUDACXX_CONCEPT __unqualified_iter_move = _LIBCUDACXX_FRAGMENT(__unqualified_iter_move_, _Tp);88 89template <class _Tp>90_LIBCUDACXX_CONCEPT_FRAGMENT(91 __move_deref_,92 requires(_Tp&& __t)(93 requires(!__unqualified_iter_move<_Tp>),94 requires(is_lvalue_reference_v<decltype(*__t)>)95 ));96 97template<class _Tp>98_LIBCUDACXX_CONCEPT __move_deref = _LIBCUDACXX_FRAGMENT(__move_deref_, _Tp);99 100template<class _Tp>101_LIBCUDACXX_CONCEPT_FRAGMENT(102 __just_deref_,103 requires(_Tp&& __t)(104 requires(!__unqualified_iter_move<_Tp>),105 requires(!__move_deref<_Tp>),106 requires(!is_lvalue_reference_v<decltype(*__t)>)107 ));108 109template<class _Tp>110_LIBCUDACXX_CONCEPT __just_deref = _LIBCUDACXX_FRAGMENT(__just_deref_, _Tp);111#endif // LIBCUDACXX_STD_VER < 20112 113// [iterator.cust.move]114 115struct __fn {116 _LIBCUDACXX_TEMPLATE(class _Ip)117 _LIBCUDACXX_REQUIRES( __unqualified_iter_move<_Ip>)118 _LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_INLINE_VISIBILITY119 constexpr decltype(auto) operator()(_Ip&& __i) const120 noexcept(noexcept(iter_move(_CUDA_VSTD::forward<_Ip>(__i))))121 {122 return iter_move(_CUDA_VSTD::forward<_Ip>(__i));123 }124 125 _LIBCUDACXX_TEMPLATE(class _Ip)126 _LIBCUDACXX_REQUIRES( __move_deref<_Ip>)127 _LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_INLINE_VISIBILITY constexpr auto operator()(_Ip&& __i) const128 noexcept(noexcept(_CUDA_VSTD::move(*_CUDA_VSTD::forward<_Ip>(__i))))129 -> decltype( _CUDA_VSTD::move(*_CUDA_VSTD::forward<_Ip>(__i)))130 { return _CUDA_VSTD::move(*_CUDA_VSTD::forward<_Ip>(__i)); }131 132 _LIBCUDACXX_TEMPLATE(class _Ip)133 _LIBCUDACXX_REQUIRES( __just_deref<_Ip>)134 _LIBCUDACXX_NODISCARD_ATTRIBUTE _LIBCUDACXX_INLINE_VISIBILITY constexpr auto operator()(_Ip&& __i) const135 noexcept(noexcept(*_CUDA_VSTD::forward<_Ip>(__i)))136 -> decltype( *_CUDA_VSTD::forward<_Ip>(__i))137 { return *_CUDA_VSTD::forward<_Ip>(__i); }138};139_LIBCUDACXX_END_NAMESPACE_CPO140inline namespace __cpo {141 _LIBCUDACXX_CPO_ACCESSIBILITY auto iter_move = __iter_move::__fn{};142} // namespace __cpo143_LIBCUDACXX_END_NAMESPACE_RANGES144 145_LIBCUDACXX_BEGIN_NAMESPACE_STD146 147#if _LIBCUDACXX_STD_VER > 17148template<__dereferenceable _Tp>149 requires requires(_Tp& __t) { { _CUDA_VRANGES::iter_move(__t) } -> __can_reference; }150using iter_rvalue_reference_t = decltype(_CUDA_VRANGES::iter_move(_CUDA_VSTD::declval<_Tp&>()));151 152#else153 154template<class _Tp>155_LIBCUDACXX_CONCEPT_FRAGMENT(156 __can_iter_rvalue_reference_t_,157 requires(_Tp& __t)(158 requires(__dereferenceable<_Tp>),159 requires(__can_reference<decltype(_CUDA_VRANGES::iter_move(__t))>)160 ));161 162template<class _Tp>163_LIBCUDACXX_CONCEPT __can_iter_rvalue_reference_t = _LIBCUDACXX_FRAGMENT(__can_iter_rvalue_reference_t_, _Tp);164 165template<class _Tp>166using __iter_rvalue_reference_t = decltype(_CUDA_VRANGES::iter_move(_CUDA_VSTD::declval<_Tp&>()));167 168template<class _Tp>169using iter_rvalue_reference_t = enable_if_t<__can_iter_rvalue_reference_t<_Tp>,170 __iter_rvalue_reference_t<_Tp>>;171#endif // LIBCUDACXX_STD_VER < 20172 173_LIBCUDACXX_END_NAMESPACE_STD174 175#endif // _LIBCUDACXX_STD_VER > 14176 177#if defined(__clang__)178#pragma clang diagnostic pop179#endif180 181#endif // _LIBCUDACXX___ITERATOR_ITER_MOVE_H182 