mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-26 17:57:07 +00:00
57b08b0944
to reflect the new license. These used slightly different spellings that defeated my regular expressions. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351648
224 lines
6.4 KiB
C++
224 lines
6.4 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP_FUNCTIONAL_BASE_03
|
|
#define _LIBCPP_FUNCTIONAL_BASE_03
|
|
|
|
// manual variadic expansion for <functional>
|
|
|
|
// __invoke
|
|
|
|
template <class _Ret, class _T1, bool _IsFunc, bool _IsBase>
|
|
struct __enable_invoke_imp;
|
|
|
|
template <class _Ret, class _T1>
|
|
struct __enable_invoke_imp<_Ret, _T1, true, true> {
|
|
typedef _Ret _Bullet1;
|
|
typedef _Bullet1 type;
|
|
};
|
|
|
|
template <class _Ret, class _T1>
|
|
struct __enable_invoke_imp<_Ret, _T1, true, false> {
|
|
typedef _Ret _Bullet2;
|
|
typedef _Bullet2 type;
|
|
};
|
|
|
|
template <class _Ret, class _T1>
|
|
struct __enable_invoke_imp<_Ret, _T1, false, true> {
|
|
typedef typename add_lvalue_reference<
|
|
typename __apply_cv<_T1, _Ret>::type
|
|
>::type _Bullet3;
|
|
typedef _Bullet3 type;
|
|
};
|
|
|
|
template <class _Ret, class _T1>
|
|
struct __enable_invoke_imp<_Ret, _T1, false, false> {
|
|
typedef typename add_lvalue_reference<
|
|
typename __apply_cv<decltype(*_VSTD::declval<_T1>()), _Ret>::type
|
|
>::type _Bullet4;
|
|
typedef _Bullet4 type;
|
|
};
|
|
|
|
template <class _Ret, class _T1>
|
|
struct __enable_invoke_imp<_Ret, _T1*, false, false> {
|
|
typedef typename add_lvalue_reference<
|
|
typename __apply_cv<_T1, _Ret>::type
|
|
>::type _Bullet4;
|
|
typedef _Bullet4 type;
|
|
};
|
|
|
|
template <class _Fn, class _T1,
|
|
class _Traits = __member_pointer_traits<_Fn>,
|
|
class _Ret = typename _Traits::_ReturnType,
|
|
class _Class = typename _Traits::_ClassType>
|
|
struct __enable_invoke : __enable_invoke_imp<
|
|
_Ret, _T1,
|
|
is_member_function_pointer<_Fn>::value,
|
|
is_base_of<_Class, typename remove_reference<_T1>::type>::value>
|
|
{
|
|
};
|
|
|
|
__nat __invoke(__any, ...);
|
|
|
|
// first bullet
|
|
|
|
template <class _Fn, class _T1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
|
__invoke(_Fn __f, _T1& __t1) {
|
|
return (__t1.*__f)();
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
|
|
return (__t1.*__f)(__a0);
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0, class _A1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
|
|
return (__t1.*__f)(__a0, __a1);
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0, class _A1, class _A2>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet1
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
|
|
return (__t1.*__f)(__a0, __a1, __a2);
|
|
}
|
|
|
|
template <class _Fn, class _T1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
|
__invoke(_Fn __f, _T1& __t1) {
|
|
return ((*__t1).*__f)();
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
|
|
return ((*__t1).*__f)(__a0);
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0, class _A1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
|
|
return ((*__t1).*__f)(__a0, __a1);
|
|
}
|
|
|
|
template <class _Fn, class _T1, class _A0, class _A1, class _A2>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet2
|
|
__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
|
|
return ((*__t1).*__f)(__a0, __a1, __a2);
|
|
}
|
|
|
|
template <class _Fn, class _T1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet3
|
|
__invoke(_Fn __f, _T1& __t1) {
|
|
return __t1.*__f;
|
|
}
|
|
|
|
template <class _Fn, class _T1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
typename __enable_invoke<_Fn, _T1>::_Bullet4
|
|
__invoke(_Fn __f, _T1& __t1) {
|
|
return (*__t1).*__f;
|
|
}
|
|
|
|
// fifth bullet
|
|
|
|
template <class _Fp>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
decltype(_VSTD::declval<_Fp&>()())
|
|
__invoke(_Fp& __f)
|
|
{
|
|
return __f();
|
|
}
|
|
|
|
template <class _Fp, class _A0>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>()))
|
|
__invoke(_Fp& __f, _A0& __a0)
|
|
{
|
|
return __f(__a0);
|
|
}
|
|
|
|
template <class _Fp, class _A0, class _A1>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>()))
|
|
__invoke(_Fp& __f, _A0& __a0, _A1& __a1)
|
|
{
|
|
return __f(__a0, __a1);
|
|
}
|
|
|
|
template <class _Fp, class _A0, class _A1, class _A2>
|
|
inline _LIBCPP_INLINE_VISIBILITY
|
|
decltype(_VSTD::declval<_Fp&>()(_VSTD::declval<_A0&>(), _VSTD::declval<_A1&>(), _VSTD::declval<_A2&>()))
|
|
__invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
|
|
{
|
|
return __f(__a0, __a1, __a2);
|
|
}
|
|
|
|
template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
|
|
struct __invoke_return
|
|
{
|
|
typedef typename __weak_result_type<_Fp>::result_type type;
|
|
};
|
|
|
|
template <class _Fp>
|
|
struct __invoke_return<_Fp, false>
|
|
{
|
|
typedef decltype(__invoke(_VSTD::declval<_Fp&>())) type;
|
|
};
|
|
|
|
template <class _Tp, class _A0>
|
|
struct __invoke_return0
|
|
{
|
|
typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>())) type;
|
|
};
|
|
|
|
template <class _Rp, class _Tp, class _A0>
|
|
struct __invoke_return0<_Rp _Tp::*, _A0>
|
|
{
|
|
typedef typename __enable_invoke<_Rp _Tp::*, _A0>::type type;
|
|
};
|
|
|
|
template <class _Tp, class _A0, class _A1>
|
|
struct __invoke_return1
|
|
{
|
|
typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
|
|
_VSTD::declval<_A1&>())) type;
|
|
};
|
|
|
|
template <class _Rp, class _Class, class _A0, class _A1>
|
|
struct __invoke_return1<_Rp _Class::*, _A0, _A1> {
|
|
typedef typename __enable_invoke<_Rp _Class::*, _A0>::type type;
|
|
};
|
|
|
|
template <class _Tp, class _A0, class _A1, class _A2>
|
|
struct __invoke_return2
|
|
{
|
|
typedef decltype(__invoke(_VSTD::declval<_Tp&>(), _VSTD::declval<_A0&>(),
|
|
_VSTD::declval<_A1&>(),
|
|
_VSTD::declval<_A2&>())) type;
|
|
};
|
|
|
|
template <class _Ret, class _Class, class _A0, class _A1, class _A2>
|
|
struct __invoke_return2<_Ret _Class::*, _A0, _A1, _A2> {
|
|
typedef typename __enable_invoke<_Ret _Class::*, _A0>::type type;
|
|
};
|
|
#endif // _LIBCPP_FUNCTIONAL_BASE_03
|