123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #pragma once
- #include "typetraits.h"
- #include "typelist.h"
- #include <functional>
- namespace NPrivate {
- template <class F>
- struct TRemoveClassImpl {
- using TSignature = F;
- };
- #define Y_EMPTY_REF_QUALIFIER
- #define Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(XX) \
- XX(Y_EMPTY_REF_QUALIFIER) \
- XX(&) \
- XX(&&) \
- XX(const) \
- XX(const&) \
- XX(const&&)
- #define Y_DECLARE_REMOVE_CLASS_IMPL(qualifiers) \
- template <typename C, typename R, typename... Args> \
- struct TRemoveClassImpl<R (C::*)(Args...) qualifiers> { \
- typedef R TSignature(Args...); \
- };
- Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(Y_DECLARE_REMOVE_CLASS_IMPL)
- #undef Y_DECLARE_REMOVE_CLASS_IMPL
- template <class T>
- struct TRemoveNoExceptImpl {
- using Type = T;
- };
- template <typename R, typename... Args>
- struct TRemoveNoExceptImpl<R(Args...) noexcept> {
- using Type = R(Args...);
- };
- #define Y_DECLARE_REMOVE_NOEXCEPT_IMPL(qualifiers) \
- template <typename R, typename C, typename... Args> \
- struct TRemoveNoExceptImpl<R (C::*)(Args...) qualifiers noexcept> { \
- using Type = R (C::*)(Args...); \
- };
- Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(Y_DECLARE_REMOVE_NOEXCEPT_IMPL)
- #undef Y_DECLARE_REMOVE_NOEXCEPT_IMPL
- #undef Y_FOR_EACH_REF_QUALIFIERS_COMBINATION
- #undef Y_EMPTY_REF_QUALIFIER
- template <class T>
- using TRemoveNoExcept = typename TRemoveNoExceptImpl<T>::Type;
- template <class F>
- using TRemoveClass = typename TRemoveClassImpl<TRemoveNoExcept<F>>::TSignature;
- template <class C>
- struct TFuncInfo {
- using TSignature = TRemoveClass<decltype(&C::operator())>;
- };
- template <class R, typename... Args>
- struct TFuncInfo<R(Args...)> {
- using TResult = R;
- typedef R TSignature(Args...);
- };
- }
- template <class C>
- using TFunctionSignature = typename ::NPrivate::TFuncInfo<::NPrivate::TRemoveClass<std::remove_reference_t<std::remove_pointer_t<C>>>>::TSignature;
- template <typename F>
- struct TCallableTraits: public TCallableTraits<TFunctionSignature<F>> {
- };
- template <typename R, typename... Args>
- struct TCallableTraits<R(Args...)> {
- using TResult = R;
- using TArgs = TTypeList<Args...>;
- typedef R TSignature(Args...);
- };
- template <typename C>
- using TFunctionResult = typename TCallableTraits<C>::TResult;
- template <typename C>
- using TFunctionArgs = typename TCallableTraits<C>::TArgs;
- template <typename C, size_t N>
- struct TFunctionArgImpl {
- using TArgs = TFunctionArgs<C>;
- using TResult = typename TArgs::template TGet<N>;
- };
- template <typename C, size_t N>
- using TFunctionArg = typename TFunctionArgImpl<C, N>::TResult;
- // temporary before std::apply appearance
- template <typename F, typename Tuple, size_t... I>
- auto ApplyImpl(F&& f, Tuple&& t, std::index_sequence<I...>) {
- return f(std::get<I>(std::forward<Tuple>(t))...);
- }
- // change to std::apply after c++ 17
- template <typename F, typename Tuple>
- auto Apply(F&& f, Tuple&& t) {
- return ApplyImpl(f, t, std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{});
- }
- // change to std::apply after c++ 17
- template <typename F>
- auto Apply(F&& f, std::tuple<>) {
- return f();
- }
|