[libcamera-devel] [PATCH 06/19] libcamera: bound_method: Use std::index_sequence

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Jan 20 01:24:24 CET 2020


Now that we're using C++-14, replace the manual implementation of
std::integer_sequence with std::index_sequence, a specialization of
std::integer_sequence with the integer type equal to std::size_t.

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

diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
index ca501493bce2..7ffd2e426e18 100644
--- a/include/libcamera/bound_method.h
+++ b/include/libcamera/bound_method.h
@@ -10,6 +10,7 @@
 #include <memory>
 #include <tuple>
 #include <type_traits>
+#include <utility>
 
 namespace libcamera {
 
@@ -71,25 +72,6 @@ public:
 	virtual void invokePack(BoundMethodPackBase *pack) = 0;
 
 protected:
-#ifndef __DOXYGEN__
-	/*
-	 * This is a cheap partial implementation of std::integer_sequence<>
-	 * from C++14.
-	 */
-	template<int...>
-	struct sequence {
-	};
-
-	template<int N, int... S>
-	struct generator : generator<N-1, N-1, S...> {
-	};
-
-	template<int... S>
-	struct generator<0, S...> {
-		typedef sequence<S...> type;
-	};
-#endif
-
 	bool activatePack(std::shared_ptr<BoundMethodPackBase> pack,
 			  bool deleteMethod);
 
@@ -107,11 +89,11 @@ public:
 	using PackType = BoundMethodPack<R, Args...>;
 
 private:
-	template<int... S>
-	void invokePack(BoundMethodPackBase *pack, BoundMethodBase::sequence<S...>)
+	template<std::size_t... I>
+	void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
 	{
 		PackType *args = static_cast<PackType *>(pack);
-		args->ret_ = invoke(std::get<S>(args->args_)...);
+		args->ret_ = invoke(std::get<I>(args->args_)...);
 	}
 
 public:
@@ -120,7 +102,7 @@ public:
 
 	void invokePack(BoundMethodPackBase *pack) override
 	{
-		invokePack(pack, typename BoundMethodBase::generator<sizeof...(Args)>::type());
+		invokePack(pack, std::make_index_sequence<sizeof...(Args)>{});
 	}
 
 	virtual R activate(Args... args, bool deleteMethod = false) = 0;
@@ -134,12 +116,12 @@ public:
 	using PackType = BoundMethodPack<void, Args...>;
 
 private:
-	template<int... S>
-	void invokePack(BoundMethodPackBase *pack, BoundMethodBase::sequence<S...>)
+	template<std::size_t... I>
+	void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
 	{
-		/* args is effectively unused when the sequence S is empty. */
+		/* args is effectively unused when the sequence I is empty. */
 		PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);
-		invoke(std::get<S>(args->args_)...);
+		invoke(std::get<I>(args->args_)...);
 	}
 
 public:
@@ -148,7 +130,7 @@ public:
 
 	void invokePack(BoundMethodPackBase *pack) override
 	{
-		invokePack(pack, typename BoundMethodBase::generator<sizeof...(Args)>::type());
+		invokePack(pack, std::make_index_sequence<sizeof...(Args)>{});
 	}
 
 	virtual void activate(Args... args, bool deleteMethod = false) = 0;
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list