[libcamera-devel] [PATCH v1 3/6] libcamera: base: bound_method: Remove BoundMethodArgs specialization

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Aug 27 04:38:26 CEST 2021


The BoundMethodArgs specialization for the void return type is only
needed to avoid accessing the ret_ member variable that is lacking from
the corresponding BoundMethodPack specialization. As the member variable
is only accessed in a single function, instead of specializing the whole
class we can use SFINAE to select between two different implementations
of the function.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 include/libcamera/base/bound_method.h | 34 +++++++--------------------
 1 file changed, 8 insertions(+), 26 deletions(-)

diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h
index 9c212f1ecc3a..76ce8017e721 100644
--- a/include/libcamera/base/bound_method.h
+++ b/include/libcamera/base/bound_method.h
@@ -98,35 +98,17 @@ public:
 	using PackType = BoundMethodPack<R, Args...>;
 
 private:
-	template<std::size_t... I>
-	void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
+	template<std::size_t... I, typename T = R>
+	std::enable_if_t<!std::is_void<T>::value, void>
+	invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
 	{
 		PackType *args = static_cast<PackType *>(pack);
 		args->ret_ = invoke(std::get<I>(args->args_)...);
 	}
 
-public:
-	BoundMethodArgs(void *obj, Object *object, ConnectionType type)
-		: BoundMethodBase(obj, object, type) {}
-
-	void invokePack(BoundMethodPackBase *pack) override
-	{
-		invokePack(pack, std::make_index_sequence<sizeof...(Args)>{});
-	}
-
-	virtual R activate(Args... args, bool deleteMethod = false) = 0;
-	virtual R invoke(Args... args) = 0;
-};
-
-template<typename... Args>
-class BoundMethodArgs<void, Args...> : public BoundMethodBase
-{
-public:
-	using PackType = BoundMethodPack<void, Args...>;
-
-private:
-	template<std::size_t... I>
-	void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
+	template<std::size_t... I, typename T = R>
+	std::enable_if_t<std::is_void<T>::value, void>
+	invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
 	{
 		/* args is effectively unused when the sequence I is empty. */
 		PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);
@@ -142,8 +124,8 @@ public:
 		invokePack(pack, std::make_index_sequence<sizeof...(Args)>{});
 	}
 
-	virtual void activate(Args... args, bool deleteMethod = false) = 0;
-	virtual void invoke(Args... args) = 0;
+	virtual R activate(Args... args, bool deleteMethod = false) = 0;
+	virtual R invoke(Args... args) = 0;
 };
 
 template<typename T, typename R, typename... Args>
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list