25#ifndef FORTRAN_COMMON_REFERENCE_WRAPPER_H
26#define FORTRAN_COMMON_REFERENCE_WRAPPER_H
28#include "flang/Common/api-attrs.h"
32#if !defined(STD_REFERENCE_WRAPPER_UNSUPPORTED) && \
33 (defined(__CUDACC__) || defined(__CUDA__)) && defined(__CUDA_ARCH__)
34#define STD_REFERENCE_WRAPPER_UNSUPPORTED 1
40using __remove_cvref_t = std::remove_cv_t<std::remove_reference_t<_Tp>>;
41template <
class _Tp,
class _Up>
43 : std::is_same<__remove_cvref_t<_Tp>, __remove_cvref_t<_Up>> {};
45#if STD_REFERENCE_WRAPPER_UNSUPPORTED
46template <
class _Tp>
class reference_wrapper {
54 static RT_API_ATTRS
void __fun(_Tp &);
55 static void __fun(_Tp &&) =
delete;
60 std::enable_if_t<!__is_same_uncvref<_Up, reference_wrapper>::value,
61 decltype(__fun(std::declval<_Up>()))>>
62 constexpr RT_API_ATTRS reference_wrapper(_Up &&__u) {
63 type &__f =
static_cast<_Up &&
>(__u);
64 __f_ = std::addressof(__f);
68 constexpr RT_API_ATTRS
operator type &()
const {
return *__f_; }
69 constexpr RT_API_ATTRS type &get()
const {
return *__f_; }
72 template <
class... _ArgTypes>
73 constexpr RT_API_ATTRS
typename std::invoke_result_t<type &, _ArgTypes...>
74 operator()(_ArgTypes &&...__args)
const {
75 return std::invoke(get(), std::forward<_ArgTypes>(__args)...);
79template <
class _Tp> reference_wrapper(_Tp &) -> reference_wrapper<_Tp>;
82inline constexpr RT_API_ATTRS reference_wrapper<_Tp> ref(_Tp &__t) {
83 return reference_wrapper<_Tp>(__t);
87inline constexpr RT_API_ATTRS reference_wrapper<_Tp> ref(
88 reference_wrapper<_Tp> __t) {
93inline constexpr RT_API_ATTRS reference_wrapper<const _Tp> cref(
95 return reference_wrapper<const _Tp>(__t);
99inline constexpr RT_API_ATTRS reference_wrapper<const _Tp> cref(
100 reference_wrapper<_Tp> __t) {
104template <
class _Tp>
void ref(
const _Tp &&) =
delete;
105template <
class _Tp>
void cref(
const _Tp &&) =
delete;
109using std::reference_wrapper;
Definition: bit-population-count.h:20
Definition: reference-wrapper.h:43