aboutsummaryrefslogtreecommitdiffstats
path: root/util/generic/function.h
diff options
context:
space:
mode:
authorsskvor <sskvor@yandex-team.com>2022-08-24 11:41:27 +0300
committersskvor <sskvor@yandex-team.com>2022-08-24 11:41:27 +0300
commit30a75ad702329a4178784acc5bad610931c32382 (patch)
treed490edde5fe1700104ceecbcc8d443a33eb6168c /util/generic/function.h
parent26dcb3705729c807903c7c1d5757cb950e703c1a (diff)
downloadydb-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.h35
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;