[{"id":33956,"web_url":"https://patchwork.libcamera.org/comment/33956/","msgid":"<174490374762.2882969.10059450937562042083@ping.linuxembedded.co.uk>","date":"2025-04-17T15:29:07","subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-04-17 12:35:38)\n> Implement a move constructor and move assignment operator for `ControlValue`.\n> The `ControlValue` type already has an \"empty\" state that it used when\n> creating a default constructed `ControlValue`, so have the moved-from\n> instance return to that state after move construction/assignment.\n> \n> This is useful, for example, for `std::vector` as most implementations will\n> use the copy constructor when reallocating if no nothrow move constructor\n> is available. Having a nothrow move constructor avoids the extra copies.\n> It is also useful when using temporaries of `ControlValue` with other\n> containers such as `std::optional`, and it also makes `ControlInfo`\n> \"cheaply\" move constructible/assignable.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  include/libcamera/controls.h | 28 ++++++++++++++++++++++++++++\n>  src/libcamera/controls.cpp   | 17 +++++++++++++++++\n>  2 files changed, 45 insertions(+)\n> \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index 1dc6ccffa..86245e7a9 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -14,6 +14,7 @@\n>  #include <stdint.h>\n>  #include <string>\n>  #include <unordered_map>\n> +#include <utility>\n>  #include <vector>\n>  \n>  #include <libcamera/base/class.h>\n> @@ -165,6 +166,33 @@ public:\n>         ControlValue(const ControlValue &other);\n>         ControlValue &operator=(const ControlValue &other);\n>  \n> +       ControlValue(ControlValue &&other) noexcept\n> +               : type_(other.type_),\n> +                 isArray_(std::exchange(other.isArray_, false)),\n> +                 numElements_(other.numElements_),\n> +                 storage_(std::exchange(other.storage_, {}))\n> +       {\n> +               other.type_ = ControlTypeNone;\n> +               other.numElements_ = 0;\n> +       }\n> +\n> +       ControlValue &operator=(ControlValue &&other) noexcept\n> +       {\n> +               if (this != &other) {\n> +                       release();\n> +\n\nIf we invert this we can lower the indent:\n\t\tif (this == &other)\n\t\t\treturn *this;\n\n\t\trelease();\n\t\ttype_ = other.type_;\n\t\t...\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> +                       type_ = other.type_;\n> +                       isArray_ = std::exchange(other.isArray_, false);\n> +                       numElements_ = other.numElements_;\n> +                       storage_ = std::exchange(other.storage_, {});\n> +\n> +                       other.type_ = ControlTypeNone;\n> +                       other.numElements_ = 0;\n> +               }\n> +\n> +               return *this;\n> +       }\n> +\n>         ControlType type() const { return type_; }\n>         bool isNone() const { return type_ == ControlTypeNone; }\n>         bool isArray() const { return isArray_; }\n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index d384e1ef7..885287e71 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -155,6 +155,23 @@ ControlValue &ControlValue::operator=(const ControlValue &other)\n>         return *this;\n>  }\n>  \n> +/**\n> + * \\fn ControlValue::ControlValue(ControlValue &&other) noexcept\n> + * \\brief Move constructor for ControlValue\n> + * \\param[in] other The ControlValue object to move from\n> + *\n> + * Move constructs a ControlValue instance from \\a other. After this opreation\n> + * \\a other will be in the same state as a default constructed ControlValue instance.\n> + */\n> +\n> +/**\n> + * \\fn ControlValue &ControlValue::operator=(ControlValue &&other) noexcept\n> + * \\brief Move assignment operator for ControlValue\n> + * \\param[in] other The ControlValue object to move from\n> + *\n> + * \\sa ControlValue::ControlValue(ControlValue &&other)\n> + */\n> +\n>  /**\n>   * \\fn ControlValue::type()\n>   * \\brief Retrieve the data type of the value\n> -- \n> 2.49.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 16EABC327D\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 17 Apr 2025 15:29:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 17AED68AC7;\n\tThu, 17 Apr 2025 17:29:12 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 72FC468AC0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 17 Apr 2025 17:29:10 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 975FF415;\n\tThu, 17 Apr 2025 17:27:06 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"rdrRaKES\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1744903626;\n\tbh=hNuot5Am8GUjVybim3A4i48CR16mwJTMZV1/qcmLmHs=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=rdrRaKESbjSRYuwClSnTX6px7xjovPo0INcBXCjvkS8TPlPQFV7mDdpJ+vuNkkZk6\n\trAV1X5Ti9cpf2axfANCcFEaYJK9MhsNsVxObanL1wyjxzCucIFAQpFrsfyymtZCc5p\n\tiLKz0hASaWumBcTZizRy2MR1lFylQWS9qb+s5Pa0=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250417113539.1137936-2-barnabas.pocze@ideasonboard.com>","References":"<20250417113539.1137936-1-barnabas.pocze@ideasonboard.com>\n\t<20250417113539.1137936-2-barnabas.pocze@ideasonboard.com>","Subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 17 Apr 2025 16:29:07 +0100","Message-ID":"<174490374762.2882969.10059450937562042083@ping.linuxembedded.co.uk>","User-Agent":"alot/0.10","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33966,"web_url":"https://patchwork.libcamera.org/comment/33966/","msgid":"<lvlovei2z6daytcfb6lrcurnozswpukx6m5bgk2gnztsapm5d7@jbakwajee5aw>","date":"2025-04-18T10:33:41","subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","submitter":{"id":143,"url":"https://patchwork.libcamera.org/api/people/143/","name":"Jacopo Mondi","email":"jacopo.mondi@ideasonboard.com"},"content":"Hi Barnabás\n\nOn Thu, Apr 17, 2025 at 01:35:38PM +0200, Barnabás Pőcze wrote:\n> Implement a move constructor and move assignment operator for `ControlValue`.\n> The `ControlValue` type already has an \"empty\" state that it used when\n\ns/it used/is used/\n\n> creating a default constructed `ControlValue`, so have the moved-from\n> instance return to that state after move construction/assignment.\n>\n> This is useful, for example, for `std::vector` as most implementations will\n> use the copy constructor when reallocating if no nothrow move constructor\n> is available. Having a nothrow move constructor avoids the extra copies.\n> It is also useful when using temporaries of `ControlValue` with other\n> containers such as `std::optional`, and it also makes `ControlInfo`\n> \"cheaply\" move constructible/assignable.\n>\n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  include/libcamera/controls.h | 28 ++++++++++++++++++++++++++++\n>  src/libcamera/controls.cpp   | 17 +++++++++++++++++\n>  2 files changed, 45 insertions(+)\n>\n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index 1dc6ccffa..86245e7a9 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -14,6 +14,7 @@\n>  #include <stdint.h>\n>  #include <string>\n>  #include <unordered_map>\n> +#include <utility>\n>  #include <vector>\n>\n>  #include <libcamera/base/class.h>\n> @@ -165,6 +166,33 @@ public:\n>  \tControlValue(const ControlValue &other);\n>  \tControlValue &operator=(const ControlValue &other);\n>\n> +\tControlValue(ControlValue &&other) noexcept\n> +\t\t: type_(other.type_),\n> +\t\t  isArray_(std::exchange(other.isArray_, false)),\n> +\t\t  numElements_(other.numElements_),\n> +\t\t  storage_(std::exchange(other.storage_, {}))\n\nSo here, compared to the copy connstructor that does a memcpy on the\n(now renamed) storage_.external, while here we're only copying the\npointer to the allocated memory, right ?\n\nSeems sane, I wonder if there's a reason why this hadn't been done\nalready.\n\n> +\t{\n> +\t\tother.type_ = ControlTypeNone;\n> +\t\tother.numElements_ = 0;\n\nI presume there's a reason why you haven't defined this using the\nnewly introduced operator=(&&) (the same as it is done for the copy\nconstructor)\n\n> +\t}\n> +\n> +\tControlValue &operator=(ControlValue &&other) noexcept\n> +\t{\n> +\t\tif (this != &other) {\n> +\t\t\trelease();\n> +\n> +\t\t\ttype_ = other.type_;\n> +\t\t\tisArray_ = std::exchange(other.isArray_, false);\n> +\t\t\tnumElements_ = other.numElements_;\n> +\t\t\tstorage_ = std::exchange(other.storage_, {});\n> +\n> +\t\t\tother.type_ = ControlTypeNone;\n> +\t\t\tother.numElements_ = 0;\n> +\t\t}\n> +\n> +\t\treturn *this;\n> +\t}\n> +\n>  \tControlType type() const { return type_; }\n>  \tbool isNone() const { return type_ == ControlTypeNone; }\n>  \tbool isArray() const { return isArray_; }\n> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n> index d384e1ef7..885287e71 100644\n> --- a/src/libcamera/controls.cpp\n> +++ b/src/libcamera/controls.cpp\n> @@ -155,6 +155,23 @@ ControlValue &ControlValue::operator=(const ControlValue &other)\n>  \treturn *this;\n>  }\n>\n> +/**\n> + * \\fn ControlValue::ControlValue(ControlValue &&other) noexcept\n> + * \\brief Move constructor for ControlValue\n> + * \\param[in] other The ControlValue object to move from\n> + *\n> + * Move constructs a ControlValue instance from \\a other. After this opreation\n\ns/opreation/operation\n\n> + * \\a other will be in the same state as a default constructed ControlValue instance.\n\nCan easily fit in 80 cols\n\nWith minors fixed, and unless there are reasons I'm missing why we\ndidn't add it some time ago:\n\nReviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n> + */\n> +\n> +/**\n> + * \\fn ControlValue &ControlValue::operator=(ControlValue &&other) noexcept\n> + * \\brief Move assignment operator for ControlValue\n> + * \\param[in] other The ControlValue object to move from\n> + *\n> + * \\sa ControlValue::ControlValue(ControlValue &&other)\n> + */\n> +\n>  /**\n>   * \\fn ControlValue::type()\n>   * \\brief Retrieve the data type of the value\n> --\n> 2.49.0\n>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id AF428C3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 18 Apr 2025 10:33:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 36991617E8;\n\tFri, 18 Apr 2025 12:33:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9DA37617E7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 18 Apr 2025 12:33:44 +0200 (CEST)","from ideasonboard.com (93-61-96-190.ip145.fastwebnet.it\n\t[93.61.96.190])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 1AA50F6;\n\tFri, 18 Apr 2025 12:31:40 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"E+1xowGF\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1744972300;\n\tbh=/HoRTEA42hWUstR6vkQAGje1rIzUMQmBy2dqmZuSI7c=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=E+1xowGFlns69hlIMc8aXwA1K8ppKRi1kN3kvE9y/XOovIJ4u0704of/vvXbCEuhT\n\t0KWclEcInN4qAILW1t8tJnEt2/QA7Oxstll6wiGv+uEflqMoerWY7rpCu3g+EeYP3x\n\tXLtmL0MhLs9TIb2h8H9pvWHr+oiZOwyA4s1yD24g=","Date":"Fri, 18 Apr 2025 12:33:41 +0200","From":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","Message-ID":"<lvlovei2z6daytcfb6lrcurnozswpukx6m5bgk2gnztsapm5d7@jbakwajee5aw>","References":"<20250417113539.1137936-1-barnabas.pocze@ideasonboard.com>\n\t<20250417113539.1137936-2-barnabas.pocze@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20250417113539.1137936-2-barnabas.pocze@ideasonboard.com>","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":33968,"web_url":"https://patchwork.libcamera.org/comment/33968/","msgid":"<e69cb56b-c66f-434a-b6be-a3c78b90e8ae@ideasonboard.com>","date":"2025-04-18T12:18:50","subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"Hi\n\n\n2025. 04. 18. 12:33 keltezéssel, Jacopo Mondi írta:\n> Hi Barnabás\n> \n> On Thu, Apr 17, 2025 at 01:35:38PM +0200, Barnabás Pőcze wrote:\n>> Implement a move constructor and move assignment operator for `ControlValue`.\n>> The `ControlValue` type already has an \"empty\" state that it used when\n> \n> s/it used/is used/\n> \n>> creating a default constructed `ControlValue`, so have the moved-from\n>> instance return to that state after move construction/assignment.\n>>\n>> This is useful, for example, for `std::vector` as most implementations will\n>> use the copy constructor when reallocating if no nothrow move constructor\n>> is available. Having a nothrow move constructor avoids the extra copies.\n>> It is also useful when using temporaries of `ControlValue` with other\n>> containers such as `std::optional`, and it also makes `ControlInfo`\n>> \"cheaply\" move constructible/assignable.\n>>\n>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n>> ---\n>>   include/libcamera/controls.h | 28 ++++++++++++++++++++++++++++\n>>   src/libcamera/controls.cpp   | 17 +++++++++++++++++\n>>   2 files changed, 45 insertions(+)\n>>\n>> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n>> index 1dc6ccffa..86245e7a9 100644\n>> --- a/include/libcamera/controls.h\n>> +++ b/include/libcamera/controls.h\n>> @@ -14,6 +14,7 @@\n>>   #include <stdint.h>\n>>   #include <string>\n>>   #include <unordered_map>\n>> +#include <utility>\n>>   #include <vector>\n>>\n>>   #include <libcamera/base/class.h>\n>> @@ -165,6 +166,33 @@ public:\n>>   \tControlValue(const ControlValue &other);\n>>   \tControlValue &operator=(const ControlValue &other);\n>>\n>> +\tControlValue(ControlValue &&other) noexcept\n>> +\t\t: type_(other.type_),\n>> +\t\t  isArray_(std::exchange(other.isArray_, false)),\n>> +\t\t  numElements_(other.numElements_),\n>> +\t\t  storage_(std::exchange(other.storage_, {}))\n> \n> So here, compared to the copy connstructor that does a memcpy on the\n> (now renamed) storage_.external, while here we're only copying the\n> pointer to the allocated memory, right ?\n\nYes, the pointer (or inline value) is copied (the ownership of the\nallocated memory is transferred to the `this` instance), and the other\nis left in an \"empty\" state.\n\n\n> \n> Seems sane, I wonder if there's a reason why this hadn't been done\n> already.\n> \n>> +\t{\n>> +\t\tother.type_ = ControlTypeNone;\n>> +\t\tother.numElements_ = 0;\n> \n> I presume there's a reason why you haven't defined this using the\n> newly introduced operator=(&&) (the same as it is done for the copy\n> constructor)\n\nThat can lead to suboptimal code in my experience (especially here since\n`release()` cannot be inlined), if we wanted to avoid the repetition,\nthen I would replace `operator=` with the following:\n\n   ControlValue(std::move(other)).swap(*this);\n   return *this;\n\n\nRegards,\nBarnabás Pőcze\n\n> \n>> +\t}\n>> +\n>> +\tControlValue &operator=(ControlValue &&other) noexcept\n>> +\t{\n>> +\t\tif (this != &other) {\n>> +\t\t\trelease();\n>> +\n>> +\t\t\ttype_ = other.type_;\n>> +\t\t\tisArray_ = std::exchange(other.isArray_, false);\n>> +\t\t\tnumElements_ = other.numElements_;\n>> +\t\t\tstorage_ = std::exchange(other.storage_, {});\n>> +\n>> +\t\t\tother.type_ = ControlTypeNone;\n>> +\t\t\tother.numElements_ = 0;\n>> +\t\t}\n>> +\n>> +\t\treturn *this;\n>> +\t}\n>> +\n>>   \tControlType type() const { return type_; }\n>>   \tbool isNone() const { return type_ == ControlTypeNone; }\n>>   \tbool isArray() const { return isArray_; }\n>> diff --git a/src/libcamera/controls.cpp b/src/libcamera/controls.cpp\n>> index d384e1ef7..885287e71 100644\n>> --- a/src/libcamera/controls.cpp\n>> +++ b/src/libcamera/controls.cpp\n>> @@ -155,6 +155,23 @@ ControlValue &ControlValue::operator=(const ControlValue &other)\n>>   \treturn *this;\n>>   }\n>>\n>> +/**\n>> + * \\fn ControlValue::ControlValue(ControlValue &&other) noexcept\n>> + * \\brief Move constructor for ControlValue\n>> + * \\param[in] other The ControlValue object to move from\n>> + *\n>> + * Move constructs a ControlValue instance from \\a other. After this opreation\n> \n> s/opreation/operation\n> \n>> + * \\a other will be in the same state as a default constructed ControlValue instance.\n> \n> Can easily fit in 80 cols\n> \n> With minors fixed, and unless there are reasons I'm missing why we\n> didn't add it some time ago:\n> \n> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>\n>> + */\n>> +\n>> +/**\n>> + * \\fn ControlValue &ControlValue::operator=(ControlValue &&other) noexcept\n>> + * \\brief Move assignment operator for ControlValue\n>> + * \\param[in] other The ControlValue object to move from\n>> + *\n>> + * \\sa ControlValue::ControlValue(ControlValue &&other)\n>> + */\n>> +\n>>   /**\n>>    * \\fn ControlValue::type()\n>>    * \\brief Retrieve the data type of the value\n>> --\n>> 2.49.0\n>>","headers":{"Return-Path":"<libcamera-devel-bounces@lists.libcamera.org>","X-Original-To":"parsemail@patchwork.libcamera.org","Delivered-To":"parsemail@patchwork.libcamera.org","Received":["from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 0AC90C3213\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 18 Apr 2025 12:18:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BC73C68AC3;\n\tFri, 18 Apr 2025 14:18:56 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B1817617E7\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 18 Apr 2025 14:18:54 +0200 (CEST)","from [192.168.33.12] (185.221.143.16.nat.pool.zt.hu\n\t[185.221.143.16])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id F18FB3A4;\n\tFri, 18 Apr 2025 14:16:49 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"o58Rxyi/\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1744978610;\n\tbh=L2euxCj9J/vFXYmaib3litzM5Qd6Mi55aIxGI1+z/U4=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=o58Rxyi/hwoJCmAtxFvcc+fEdfY+IZQm/K+OJ1CVy5Bkzv8rYm38IO9PDa8OKDWkp\n\tI9tsWIXhpCCqeafM8oMdqFNpNrU+YnUncJpMykl/xB6jT+nPNG90g66UPHWxwH3IwZ\n\tMDPDImTcguEXguVPA3mqsbaOto7nLlX6R1iWfi5A=","Message-ID":"<e69cb56b-c66f-434a-b6be-a3c78b90e8ae@ideasonboard.com>","Date":"Fri, 18 Apr 2025 14:18:50 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v1 2/3] libcamera: controls: Implement move\n\tctor/assignment","To":"Jacopo Mondi <jacopo.mondi@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250417113539.1137936-1-barnabas.pocze@ideasonboard.com>\n\t<20250417113539.1137936-2-barnabas.pocze@ideasonboard.com>\n\t<lvlovei2z6daytcfb6lrcurnozswpukx6m5bgk2gnztsapm5d7@jbakwajee5aw>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<lvlovei2z6daytcfb6lrcurnozswpukx6m5bgk2gnztsapm5d7@jbakwajee5aw>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]