common: Provide helper for getting member function traits
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 17 Sep 2018 21:39:37 +0000 (23:39 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 18 Nov 2018 10:06:43 +0000 (11:06 +0100)
Add a new header funchelpers.h that contains helpers for dealing
with member function traits. MemberFunction<Callable> provides
the class, return and argument types of the given Callable, as well
as a compatible std::function type.

src/common/CMakeLists.txt
src/common/funchelpers.h [new file with mode: 0644]

index 1683d26..90f64e9 100644 (file)
@@ -18,6 +18,7 @@ target_sources(${TARGET} PRIVATE
     eventmanager.cpp
     expressionmatch.cpp
     # expressionmatchtests.cpp
+    funchelpers.h
     highlightrulemanager.cpp
     identity.cpp
     ignorelistmanager.cpp
diff --git a/src/common/funchelpers.h b/src/common/funchelpers.h
new file mode 100644 (file)
index 0000000..6c7aeb6
--- /dev/null
@@ -0,0 +1,55 @@
+/***************************************************************************
+ *   Copyright (C) 2005-2018 by the Quassel Project                        *
+ *   devel@quassel-irc.org                                                 *
+ *                                                                         *
+ *   This program is free software; you can redistribute it and/or modify  *
+ *   it under the terms of the GNU General Public License as published by  *
+ *   the Free Software Foundation; either version 2 of the License, or     *
+ *   (at your option) version 3.                                           *
+ *                                                                         *
+ *   This program is distributed in the hope that it will be useful,       *
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
+ *   GNU General Public License for more details.                          *
+ *                                                                         *
+ *   You should have received a copy of the GNU General Public License     *
+ *   along with this program; if not, write to the                         *
+ *   Free Software Foundation, Inc.,                                       *
+ *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
+ ***************************************************************************/
+
+#pragma once
+
+#include <functional>
+#include <tuple>
+
+namespace detail {
+
+/// @cond DOXYGEN_CANNOT_PARSE_THIS
+
+// Primary template
+template<typename Func>
+struct FuncHelper : public FuncHelper<decltype(&Func::operator())> {};
+
+// Overload for member function with const call operator
+template<typename C, typename R, typename ...Args>
+struct FuncHelper<R(C::*)(Args...) const> : public FuncHelper<R(C::*)(Args...)> {};
+
+// Overload for member function with non-const call operator
+template<typename C, typename R, typename ...Args>
+struct FuncHelper<R(C::*)(Args...)> {
+    using ClassType = C;
+    using FunctionType = std::function<R(Args...)>;
+    using ReturnType = R;
+    using ArgsTuple = std::tuple<Args...>;
+};
+
+/// @endcond
+
+}  // detail
+
+/**
+ * Provides traits for the given callable.
+ */
+template<typename Callable>
+using MemberFunction = detail::FuncHelper<Callable>;