diff options
author | sskvor <sskvor@yandex-team.com> | 2022-08-24 11:41:27 +0300 |
---|---|---|
committer | sskvor <sskvor@yandex-team.com> | 2022-08-24 11:41:27 +0300 |
commit | 30a75ad702329a4178784acc5bad610931c32382 (patch) | |
tree | d490edde5fe1700104ceecbcc8d443a33eb6168c /util/generic/function.h | |
parent | 26dcb3705729c807903c7c1d5757cb950e703c1a (diff) | |
download | ydb-30a75ad702329a4178784acc5bad610931c32382.tar.gz |
[util] Add specializations for const / ref qualified member functions
Diffstat (limited to 'util/generic/function.h')
-rw-r--r-- | util/generic/function.h | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/util/generic/function.h b/util/generic/function.h index 62fa84e0cb3..859cc3f8493 100644 --- a/util/generic/function.h +++ b/util/generic/function.h @@ -11,15 +11,23 @@ namespace NPrivate { using TSignature = F; }; - template <typename C, typename R, typename... Args> - struct TRemoveClassImpl<R (C::*)(Args...)> { - typedef R TSignature(Args...); +#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...); \ }; - template <typename C, typename R, typename... Args> - struct TRemoveClassImpl<R (C::*)(Args...) const> { - 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 { @@ -31,11 +39,18 @@ namespace NPrivate { using Type = R(Args...); }; - template <typename R, typename C, typename... Args> - struct TRemoveNoExceptImpl<R (C::*)(Args...) noexcept> { - using Type = R (C::*)(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; |