[PATCH v1] libcamera: base: bound_method: Forward arguments when possible
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Tue Mar 4 00:04:45 CET 2025
Hi Barnabás,
Thank you for the patch.
On Mon, Mar 03, 2025 at 04:14:38PM +0100, Barnabás Pőcze wrote:
> Use `std::{forward,move}` to forward the arguments, this enables the
> use of move constructors, likely leading to less code and better runtime.
> For example, move constructing a libstdc++ `std::shared_ptr` is noticeably
> less code than copy constructing one.
>
> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> ---
> include/libcamera/base/bound_method.h | 26 ++++++++++++++------------
> 1 file changed, 14 insertions(+), 12 deletions(-)
>
> diff --git a/include/libcamera/base/bound_method.h b/include/libcamera/base/bound_method.h
> index dd3488eeb..47e0a2475 100644
> --- a/include/libcamera/base/bound_method.h
> +++ b/include/libcamera/base/bound_method.h
> @@ -33,8 +33,9 @@ template<typename R, typename... Args>
> class BoundMethodPack : public BoundMethodPackBase
> {
> public:
> - BoundMethodPack(const Args &... args)
> - : args_(args...)
> + template<typename... Ts>
> + BoundMethodPack(Ts &&...args)
Why is a Ts template parameter needed here, what happens if you use
BoundMethodPack(const Args &... args)
: args_(std::forward<Args>(args)...)
?
Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
> + : args_(std::forward<Ts>(args)...)
> {
> }
>
> @@ -51,8 +52,9 @@ template<typename... Args>
> class BoundMethodPack<void, Args...> : public BoundMethodPackBase
> {
> public:
> - BoundMethodPack(const Args &... args)
> - : args_(args...)
> + template<typename... Ts>
> + BoundMethodPack(Ts &&...args)
> + : args_(std::forward<Ts>(args)...)
> {
> }
>
> @@ -136,23 +138,23 @@ public:
>
> BoundMethodFunctor(T *obj, Object *object, Func func,
> ConnectionType type = ConnectionTypeAuto)
> - : BoundMethodArgs<R, Args...>(obj, object, type), func_(func)
> + : BoundMethodArgs<R, Args...>(obj, object, type), func_(std::move(func))
> {
> }
>
> R activate(Args... args, bool deleteMethod = false) override
> {
> if (!this->object_)
> - return func_(args...);
> + return func_(std::forward<Args>(args)...);
>
> - auto pack = std::make_shared<PackType>(args...);
> + auto pack = std::make_shared<PackType>(std::forward<Args>(args)...);
> bool sync = BoundMethodBase::activatePack(pack, deleteMethod);
> return sync ? pack->returnValue() : R();
> }
>
> R invoke(Args... args) override
> {
> - return func_(args...);
> + return func_(std::forward<Args>(args)...);
> }
>
> private:
> @@ -177,10 +179,10 @@ public:
> {
> if (!this->object_) {
> T *obj = static_cast<T *>(this->obj_);
> - return (obj->*func_)(args...);
> + return (obj->*func_)(std::forward<Args>(args)...);
> }
>
> - auto pack = std::make_shared<PackType>(args...);
> + auto pack = std::make_shared<PackType>(std::forward<Args>(args)...);
> bool sync = BoundMethodBase::activatePack(pack, deleteMethod);
> return sync ? pack->returnValue() : R();
> }
> @@ -188,7 +190,7 @@ public:
> R invoke(Args... args) override
> {
> T *obj = static_cast<T *>(this->obj_);
> - return (obj->*func_)(args...);
> + return (obj->*func_)(std::forward<Args>(args)...);
> }
>
> private:
> @@ -209,7 +211,7 @@ public:
>
> R activate(Args... args, [[maybe_unused]] bool deleteMethod = false) override
> {
> - return (*func_)(args...);
> + return (*func_)(std::forward<Args>(args)...);
> }
>
> R invoke(Args...) override
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list