mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-24 00:55:07 +03:00
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>
This commit is contained in:
parent
8034af7423
commit
7216c6a9bb
1 changed files with 10 additions and 28 deletions
|
@ -10,6 +10,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace libcamera {
|
namespace libcamera {
|
||||||
|
|
||||||
|
@ -71,25 +72,6 @@ public:
|
||||||
virtual void invokePack(BoundMethodPackBase *pack) = 0;
|
virtual void invokePack(BoundMethodPackBase *pack) = 0;
|
||||||
|
|
||||||
protected:
|
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 activatePack(std::shared_ptr<BoundMethodPackBase> pack,
|
||||||
bool deleteMethod);
|
bool deleteMethod);
|
||||||
|
|
||||||
|
@ -107,11 +89,11 @@ public:
|
||||||
using PackType = BoundMethodPack<R, Args...>;
|
using PackType = BoundMethodPack<R, Args...>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<int... S>
|
template<std::size_t... I>
|
||||||
void invokePack(BoundMethodPackBase *pack, BoundMethodBase::sequence<S...>)
|
void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
|
||||||
{
|
{
|
||||||
PackType *args = static_cast<PackType *>(pack);
|
PackType *args = static_cast<PackType *>(pack);
|
||||||
args->ret_ = invoke(std::get<S>(args->args_)...);
|
args->ret_ = invoke(std::get<I>(args->args_)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -120,7 +102,7 @@ public:
|
||||||
|
|
||||||
void invokePack(BoundMethodPackBase *pack) override
|
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;
|
virtual R activate(Args... args, bool deleteMethod = false) = 0;
|
||||||
|
@ -134,12 +116,12 @@ public:
|
||||||
using PackType = BoundMethodPack<void, Args...>;
|
using PackType = BoundMethodPack<void, Args...>;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<int... S>
|
template<std::size_t... I>
|
||||||
void invokePack(BoundMethodPackBase *pack, BoundMethodBase::sequence<S...>)
|
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);
|
PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);
|
||||||
invoke(std::get<S>(args->args_)...);
|
invoke(std::get<I>(args->args_)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -148,7 +130,7 @@ public:
|
||||||
|
|
||||||
void invokePack(BoundMethodPackBase *pack) override
|
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;
|
virtual void activate(Args... args, bool deleteMethod = false) = 0;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue