function.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #pragma once
  2. #include "typelist.h"
  3. #include <functional>
  4. namespace NPrivate {
  5. template <class F>
  6. struct TRemoveClassImpl {
  7. using TSignature = F;
  8. };
  9. #define Y_EMPTY_REF_QUALIFIER
  10. #define Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(XX) \
  11. XX(Y_EMPTY_REF_QUALIFIER) \
  12. XX(&) \
  13. XX(&&) \
  14. XX(const) \
  15. XX(const&) \
  16. XX(const&&)
  17. #define Y_DECLARE_REMOVE_CLASS_IMPL(qualifiers) \
  18. template <typename C, typename R, typename... Args> \
  19. struct TRemoveClassImpl<R (C::*)(Args...) qualifiers> { \
  20. typedef R TSignature(Args...); \
  21. };
  22. Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(Y_DECLARE_REMOVE_CLASS_IMPL)
  23. #undef Y_DECLARE_REMOVE_CLASS_IMPL
  24. template <class T>
  25. struct TRemoveNoExceptImpl {
  26. using Type = T;
  27. };
  28. template <typename R, typename... Args>
  29. struct TRemoveNoExceptImpl<R(Args...) noexcept> {
  30. using Type = R(Args...);
  31. };
  32. #define Y_DECLARE_REMOVE_NOEXCEPT_IMPL(qualifiers) \
  33. template <typename R, typename C, typename... Args> \
  34. struct TRemoveNoExceptImpl<R (C::*)(Args...) qualifiers noexcept> { \
  35. using Type = R (C::*)(Args...); \
  36. };
  37. Y_FOR_EACH_REF_QUALIFIERS_COMBINATION(Y_DECLARE_REMOVE_NOEXCEPT_IMPL)
  38. #undef Y_DECLARE_REMOVE_NOEXCEPT_IMPL
  39. #undef Y_FOR_EACH_REF_QUALIFIERS_COMBINATION
  40. #undef Y_EMPTY_REF_QUALIFIER
  41. template <class T>
  42. using TRemoveNoExcept = typename TRemoveNoExceptImpl<T>::Type;
  43. template <class F>
  44. using TRemoveClass = typename TRemoveClassImpl<TRemoveNoExcept<F>>::TSignature;
  45. template <class C>
  46. struct TFuncInfo {
  47. using TSignature = TRemoveClass<decltype(&C::operator())>;
  48. };
  49. template <class R, typename... Args>
  50. struct TFuncInfo<R(Args...)> {
  51. typedef R TSignature(Args...);
  52. };
  53. } // namespace NPrivate
  54. template <class C>
  55. using TFunctionSignature = typename ::NPrivate::TFuncInfo<::NPrivate::TRemoveClass<std::remove_reference_t<std::remove_pointer_t<C>>>>::TSignature;
  56. template <typename F>
  57. struct TCallableTraits: public TCallableTraits<TFunctionSignature<F>> {
  58. };
  59. template <typename R, typename... Args>
  60. struct TCallableTraits<R(Args...)> {
  61. using TResult = R;
  62. using TArgs = TTypeList<Args...>;
  63. typedef R TSignature(Args...);
  64. };
  65. template <typename C>
  66. using TFunctionResult = typename TCallableTraits<C>::TResult;
  67. template <typename C>
  68. using TFunctionArgs = typename TCallableTraits<C>::TArgs;
  69. template <typename C, size_t N>
  70. struct TFunctionArgImpl {
  71. using TArgs = TFunctionArgs<C>;
  72. using TResult = typename TArgs::template TGet<N>;
  73. };
  74. template <typename C, size_t N>
  75. using TFunctionArg = typename TFunctionArgImpl<C, N>::TResult;