[PATCH v1] libcamera: base: bound_method: Simplify `invokePack()`

Kieran Bingham kieran.bingham at ideasonboard.com
Mon Mar 31 20:13:54 CEST 2025


Quoting Kieran Bingham (2025-03-31 17:58:31)
> Quoting Laurent Pinchart (2025-03-31 17:21:58)
> > Hi Barnabás,
> > 
> > Thank you for the patch.
> > 
> > On Mon, Mar 31, 2025 at 06:03:01PM +0200, Barnabás Pőcze wrote:
> > > Use `if constexpr` instead of SFINAE to handle return values of type `void`.
> > > 
> > > Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> > > ---
> > >  include/libcamera/base/bound_method.h | 17 ++++++-----------
> > >  1 file changed, 6 insertions(+), 11 deletions(-)
> > > 
> > > diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h
> > > index dd3488eeb..aad75c02a 100644
> > > --- a/include/libcamera/base/bound_method.h
> > > +++ b/include/libcamera/base/bound_method.h
> > > @@ -98,21 +98,16 @@ public:
> > >       using PackType = BoundMethodPack<R, Args...>;
> > >  
> > >  private:
> > > -     template<std::size_t... I, typename T = R>
> > > -     std::enable_if_t<!std::is_void<T>::value, void>
> > > +     template<std::size_t... I>
> > > +     void
> > >       invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
> > 
> > You can write
> > 
> >         template<std::size_t... I>
> >         void invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
> > 
> > >       {
> > >               PackType *args = static_cast<PackType *>(pack);
> > > -             args->ret_ = invoke(std::get<I>(args->args_)...);
> > > -     }
> > >  
> > > -     template<std::size_t... I, typename T = R>
> > > -     std::enable_if_t<std::is_void<T>::value, void>
> > > -     invokePack(BoundMethodPackBase *pack, std::index_sequence<I...>)
> > > -     {
> > > -             /* args is effectively unused when the sequence I is empty. */
> > > -             PackType *args [[gnu::unused]] = static_cast<PackType *>(pack);
> > > -             invoke(std::get<I>(args->args_)...);
> > > +             if constexpr (!std::is_void_v<R>)
> > > +                     args->ret_ = invoke(std::get<I>(args->args_)...);
> > > +             else
> > > +                     invoke(std::get<I>(args->args_)...);
> > 
> > I'm surprised that this works. I didn't know that within a templated
> > entity the discarded statement is not instantiated. It's interesting.
> > 
> > Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> 
> No chance of me putting a reviewed by tag on template magic - it would
> be a lie ;-)
> 
> But if Laurent's happy with this - and the CI passes, I'm fine to merge
> it...

Unfortunately, it didn't pass :

https://gitlab.freedesktop.org/camera/libcamera/-/jobs/73682114

> 
> Acked-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> > 
> > >       }
> > >  
> > >  public:
> > 
> > -- 
> > Regards,
> > 
> > Laurent Pinchart


More information about the libcamera-devel mailing list