[PATCH v1 2/3] libcamera: controls: Implement move ctor/assignment
Jacopo Mondi
jacopo.mondi at ideasonboard.com
Fri Apr 18 12:33:41 CEST 2025
Hi Barnabás
On Thu, Apr 17, 2025 at 01:35:38PM +0200, Barnabás Pőcze wrote:
> Implement a move constructor and move assignment operator for `ControlValue`.
> The `ControlValue` type already has an "empty" state that it used when
s/it used/is used/
> creating a default constructed `ControlValue`, so have the moved-from
> instance return to that state after move construction/assignment.
>
> This is useful, for example, for `std::vector` as most implementations will
> use the copy constructor when reallocating if no nothrow move constructor
> is available. Having a nothrow move constructor avoids the extra copies.
> It is also useful when using temporaries of `ControlValue` with other
> containers such as `std::optional`, and it also makes `ControlInfo`
> "cheaply" move constructible/assignable.
>
> Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
> ---
> include/libcamera/controls.h | 28 ++++++++++++++++++++++++++++
> src/libcamera/controls.cpp | 17 +++++++++++++++++
> 2 files changed, 45 insertions(+)
>
> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h
> index 1dc6ccffa..86245e7a9 100644
> --- a/include/libcamera/controls.h
> +++ b/include/libcamera/controls.h
> @@ -14,6 +14,7 @@
> #include <stdint.h>
> #include <string>
> #include <unordered_map>
> +#include <utility>
> #include <vector>
>
> #include <libcamera/base/class.h>
> @@ -165,6 +166,33 @@ public:
> ControlValue(const ControlValue &other);
> ControlValue &operator=(const ControlValue &other);
>
> + ControlValue(ControlValue &&other) noexcept
> + : type_(other.type_),
> + isArray_(std::exchange(other.isArray_, false)),
> + numElements_(other.numElements_),
> + storage_(std::exchange(other.storage_, {}))
So here, compared to the copy connstructor that does a memcpy on the
(now renamed) storage_.external, while here we're only copying the
pointer to the allocated memory, right ?
Seems sane, I wonder if there's a reason why this hadn't been done
already.
> + {
> + other.type_ = ControlTypeNone;
> + other.numElements_ = 0;
I presume there's a reason why you haven't defined this using the
newly introduced operator=(&&) (the same as it is done for the copy
constructor)
> + }
> +
> + ControlValue &operator=(ControlValue &&other) noexcept
> + {
> + if (this != &other) {
> + release();
> +
> + type_ = other.type_;
> + isArray_ = std::exchange(other.isArray_, false);
> + numElements_ = other.numElements_;
> + storage_ = std::exchange(other.storage_, {});
> +
> + other.type_ = ControlTypeNone;
> + other.numElements_ = 0;
> + }
> +
> + return *this;
> + }
> +
> ControlType type() const { return type_; }
> bool isNone() const { return type_ == ControlTypeNone; }
> bool isArray() const { return isArray_; }
> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp
> index d384e1ef7..885287e71 100644
> --- a/src/libcamera/controls.cpp
> +++ b/src/libcamera/controls.cpp
> @@ -155,6 +155,23 @@ ControlValue &ControlValue::operator=(const ControlValue &other)
> return *this;
> }
>
> +/**
> + * \fn ControlValue::ControlValue(ControlValue &&other) noexcept
> + * \brief Move constructor for ControlValue
> + * \param[in] other The ControlValue object to move from
> + *
> + * Move constructs a ControlValue instance from \a other. After this opreation
s/opreation/operation
> + * \a other will be in the same state as a default constructed ControlValue instance.
Can easily fit in 80 cols
With minors fixed, and unless there are reasons I'm missing why we
didn't add it some time ago:
Reviewed-by: Jacopo Mondi <jacopo.mondi at ideasonboard.com>
> + */
> +
> +/**
> + * \fn ControlValue &ControlValue::operator=(ControlValue &&other) noexcept
> + * \brief Move assignment operator for ControlValue
> + * \param[in] other The ControlValue object to move from
> + *
> + * \sa ControlValue::ControlValue(ControlValue &&other)
> + */
> +
> /**
> * \fn ControlValue::type()
> * \brief Retrieve the data type of the value
> --
> 2.49.0
>
More information about the libcamera-devel
mailing list