summaryrefslogtreecommitdiff
path: root/include/libcamera/bound_method.h
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-19 20:28:39 +0200
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2020-01-22 17:26:05 +0200
commit7216c6a9bb815ca9d0b4247f8e04d87e4ac85fa2 (patch)
treeb7629ccd4b76177a7b15a28fd3c5a796923f5720 /include/libcamera/bound_method.h
parent8034af7423e0b9f00c84eaa00cd095dbcf44f4a5 (diff)
libcamera: bound_method: Use std::index_sequence
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. The template parameter S that denotes a sequence is replaced with I to align with the usage examples of cppreference.com. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Diffstat (limited to 'include/libcamera/bound_method.h')
-rw-r--r--include/libcamera/bound_method.h38
1 files changed, 10 insertions, 28 deletions
diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h
index ca501493..7ffd2e42 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;