[libcamera-devel] [PATCH 06/19] libcamera: bound_method: Use std::index_sequence
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Mon Jan 20 12:50:47 CET 2020
On Mon, Jan 20, 2020 at 12:48:29PM +0100, Jacopo Mondi wrote:
> Hi Laurent
>
> On Mon, Jan 20, 2020 at 02:24:24AM +0200, Laurent Pinchart wrote:
> > 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>
>
> Why the template parameter name change ? :D
To align to the usage in the cppreference.com examples.
> Anyway, that's good!
> Reviewed-by: Jacopo Mondi <jacopo at jmondi.org>
Thank you.
> > ---
> > 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