diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-01-19 20:28:39 +0200 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2020-01-22 17:26:05 +0200 |
commit | 7216c6a9bb815ca9d0b4247f8e04d87e4ac85fa2 (patch) | |
tree | b7629ccd4b76177a7b15a28fd3c5a796923f5720 | |
parent | 8034af7423e0b9f00c84eaa00cd095dbcf44f4a5 (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>
-rw-r--r-- | include/libcamera/bound_method.h | 38 |
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; |