[{"id":2872,"web_url":"https://patchwork.libcamera.org/comment/2872/","msgid":"<20191013142840.6562nlqb7xnwr5fe@uno.localdomain>","date":"2019-10-13T14:28:40","subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Sat, Oct 12, 2019 at 09:44:05PM +0300, Laurent Pinchart wrote:\n> In preparation for extending V4L2ControlInfoMap with control idmap\n> support, turn it into a real class. Make it inherit from std::map<>\n> instead of wrapping it to keep the API simple.\n>\n> V4L2ControlInfoMap is meant to be constructed with a set of control\n> info, and never modified afterwards. To ensure this, inherit from\n> std::map<> with private access specifier, and explicitly expose the\n> std::map<> methods that do not allow insertion or removal of elements. A\n> custom move assignment operator is implemented to allow efficient\n> construction of the V4L2ControlInfoMap.\n\nThanks for having clarified my design concerns.\n\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  src/libcamera/include/v4l2_controls.h | 16 +++++++++++++++-\n>  src/libcamera/v4l2_controls.cpp       | 17 ++++++++++++++++-\n>  src/libcamera/v4l2_device.cpp         |  9 ++++++---\n>  3 files changed, 37 insertions(+), 5 deletions(-)\n>\n> diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h\n> index 949ca21cb863..8990e755a385 100644\n> --- a/src/libcamera/include/v4l2_controls.h\n> +++ b/src/libcamera/include/v4l2_controls.h\n> @@ -43,7 +43,21 @@ private:\n>  \tControlRange range_;\n>  };\n>\n> -using V4L2ControlInfoMap = std::map<unsigned int, V4L2ControlInfo>;\n> +class V4L2ControlInfoMap : private std::map<unsigned int, V4L2ControlInfo>\n> +{\n> +public:\n> +\tV4L2ControlInfoMap &operator=(std::map<unsigned int, V4L2ControlInfo> &&info);\n> +\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::begin;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::cbegin;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::end;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::cend;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::at;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::empty;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::size;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::count;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::find;\n> +};\n>\n>  class V4L2Control\n>  {\n> diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp\n> index 3f5f3ff10880..438e8d8bdb99 100644\n> --- a/src/libcamera/v4l2_controls.cpp\n> +++ b/src/libcamera/v4l2_controls.cpp\n> @@ -156,10 +156,25 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)\n>   */\n>\n>  /**\n> - * \\typedef V4L2ControlInfoMap\n> + * \\class V4L2ControlInfoMap\n>   * \\brief A map of control ID to V4L2ControlInfo\n>   */\n>\n> +/**\n> + * \\brief Move assignment operator from plain map\n\nMissing parameter documentation\n\n> + *\n> + * Populate the map by replacing its contents with those of \\a info using move\n> + * semantics. This is the only supported\n\nincomplete comment\n\n> + *\n> + * \\return *this\n\nWhat about a more lenght description ?\n        \\return The populated V4L2ControlInfoMap\n\n> + */\n> +V4L2ControlInfoMap &V4L2ControlInfoMap::operator=(std::map<unsigned int, V4L2ControlInfo> &&info)\n> +{\n> +\tstd::map<unsigned int, V4L2ControlInfo>::operator=(std::move(info));\n> +\n> +\treturn *this;\n> +}\n> +\n>  /**\n>   * \\class V4L2Control\n>   * \\brief A V4L2 control value\n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index 8c5998435020..1f755f0f3ef6 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -340,6 +340,7 @@ int V4L2Device::ioctl(unsigned long request, void *argp)\n>   */\n>  void V4L2Device::listControls()\n>  {\n> +\tstd::map<unsigned int, V4L2ControlInfo> ctrls;\n>  \tstruct v4l2_query_ext_ctrl ctrl = {};\n>\n>  \t/* \\todo Add support for menu and compound controls. */\n> @@ -368,10 +369,12 @@ void V4L2Device::listControls()\n>  \t\t\tcontinue;\n>  \t\t}\n>\n> -\t\tcontrols_.emplace(std::piecewise_construct,\n> -\t\t\t\t  std::forward_as_tuple(ctrl.id),\n> -\t\t\t\t  std::forward_as_tuple(ctrl));\n> +\t\tctrls.emplace(std::piecewise_construct,\n> +\t\t\t      std::forward_as_tuple(ctrl.id),\n> +\t\t\t      std::forward_as_tuple(ctrl));\n>  \t}\n> +\n> +\tcontrols_ = std::move(ctrls);\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>  }\n>\n>  /*\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9339361562\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 13 Oct 2019 16:26:57 +0200 (CEST)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id 2286EC0007;\n\tSun, 13 Oct 2019 14:26:56 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Sun, 13 Oct 2019 16:28:40 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191013142840.6562nlqb7xnwr5fe@uno.localdomain>","References":"<20191012184407.31684-1-laurent.pinchart@ideasonboard.com>\n\t<20191012184407.31684-13-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"avzke2zywkvpdad6\"","Content-Disposition":"inline","In-Reply-To":"<20191012184407.31684-13-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","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>","X-List-Received-Date":"Sun, 13 Oct 2019 14:26:57 -0000"}},{"id":2873,"web_url":"https://patchwork.libcamera.org/comment/2873/","msgid":"<20191013143032.GD4886@pendragon.ideasonboard.com>","date":"2019-10-13T14:30:32","subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Sun, Oct 13, 2019 at 04:28:40PM +0200, Jacopo Mondi wrote:\n> On Sat, Oct 12, 2019 at 09:44:05PM +0300, Laurent Pinchart wrote:\n> > In preparation for extending V4L2ControlInfoMap with control idmap\n> > support, turn it into a real class. Make it inherit from std::map<>\n> > instead of wrapping it to keep the API simple.\n> >\n> > V4L2ControlInfoMap is meant to be constructed with a set of control\n> > info, and never modified afterwards. To ensure this, inherit from\n> > std::map<> with private access specifier, and explicitly expose the\n> > std::map<> methods that do not allow insertion or removal of elements. A\n> > custom move assignment operator is implemented to allow efficient\n> > construction of the V4L2ControlInfoMap.\n> \n> Thanks for having clarified my design concerns.\n\nYou're welcome.\n\n> > Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> >  src/libcamera/include/v4l2_controls.h | 16 +++++++++++++++-\n> >  src/libcamera/v4l2_controls.cpp       | 17 ++++++++++++++++-\n> >  src/libcamera/v4l2_device.cpp         |  9 ++++++---\n> >  3 files changed, 37 insertions(+), 5 deletions(-)\n> >\n> > diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h\n> > index 949ca21cb863..8990e755a385 100644\n> > --- a/src/libcamera/include/v4l2_controls.h\n> > +++ b/src/libcamera/include/v4l2_controls.h\n> > @@ -43,7 +43,21 @@ private:\n> >  \tControlRange range_;\n> >  };\n> >\n> > -using V4L2ControlInfoMap = std::map<unsigned int, V4L2ControlInfo>;\n> > +class V4L2ControlInfoMap : private std::map<unsigned int, V4L2ControlInfo>\n> > +{\n> > +public:\n> > +\tV4L2ControlInfoMap &operator=(std::map<unsigned int, V4L2ControlInfo> &&info);\n> > +\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::begin;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::cbegin;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::end;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::cend;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::at;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::empty;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::size;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::count;\n> > +\tusing std::map<unsigned int, V4L2ControlInfo>::find;\n> > +};\n> >\n> >  class V4L2Control\n> >  {\n> > diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp\n> > index 3f5f3ff10880..438e8d8bdb99 100644\n> > --- a/src/libcamera/v4l2_controls.cpp\n> > +++ b/src/libcamera/v4l2_controls.cpp\n> > @@ -156,10 +156,25 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)\n> >   */\n> >\n> >  /**\n> > - * \\typedef V4L2ControlInfoMap\n> > + * \\class V4L2ControlInfoMap\n> >   * \\brief A map of control ID to V4L2ControlInfo\n> >   */\n> >\n> > +/**\n> > + * \\brief Move assignment operator from plain map\n> \n> Missing parameter documentation\n\nWill fix.\n\n> > + *\n> > + * Populate the map by replacing its contents with those of \\a info using move\n> > + * semantics. This is the only supported\n> \n> incomplete comment\n\n\"This is the only supported way to populate a V4L2ControlInfoMap.\"\n\n> > + *\n> > + * \\return *this\n> \n> What about a more lenght description ?\n>         \\return The populated V4L2ControlInfoMap\n\nI modelled the comment based on the C++ STL documentation, but I'll\nchange it.\n\n> > + */\n> > +V4L2ControlInfoMap &V4L2ControlInfoMap::operator=(std::map<unsigned int, V4L2ControlInfo> &&info)\n> > +{\n> > +\tstd::map<unsigned int, V4L2ControlInfo>::operator=(std::move(info));\n> > +\n> > +\treturn *this;\n> > +}\n> > +\n> >  /**\n> >   * \\class V4L2Control\n> >   * \\brief A V4L2 control value\n> > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> > index 8c5998435020..1f755f0f3ef6 100644\n> > --- a/src/libcamera/v4l2_device.cpp\n> > +++ b/src/libcamera/v4l2_device.cpp\n> > @@ -340,6 +340,7 @@ int V4L2Device::ioctl(unsigned long request, void *argp)\n> >   */\n> >  void V4L2Device::listControls()\n> >  {\n> > +\tstd::map<unsigned int, V4L2ControlInfo> ctrls;\n> >  \tstruct v4l2_query_ext_ctrl ctrl = {};\n> >\n> >  \t/* \\todo Add support for menu and compound controls. */\n> > @@ -368,10 +369,12 @@ void V4L2Device::listControls()\n> >  \t\t\tcontinue;\n> >  \t\t}\n> >\n> > -\t\tcontrols_.emplace(std::piecewise_construct,\n> > -\t\t\t\t  std::forward_as_tuple(ctrl.id),\n> > -\t\t\t\t  std::forward_as_tuple(ctrl));\n> > +\t\tctrls.emplace(std::piecewise_construct,\n> > +\t\t\t      std::forward_as_tuple(ctrl.id),\n> > +\t\t\t      std::forward_as_tuple(ctrl));\n> >  \t}\n> > +\n> > +\tcontrols_ = std::move(ctrls);\n> \n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> >  }\n> >\n> >  /*","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id AD86261562\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 13 Oct 2019 16:30:35 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 2512FA46;\n\tSun, 13 Oct 2019 16:30:35 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1570977035;\n\tbh=1ChmPQuMc9+Xq3lWE6Q+6RdeLH2G2V2kG8RhZjBE29Y=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=I5TNxq3R0bv4k1J2uQoGbsDztuvSjBh7FN+i9ekl2yQBOCk3b6KH7CwN6gQcw5uYW\n\tKU8kogG4BQ3I4jDTKCKP2kM7K1KyQy2OuO3G1kFgWGgyOlcICy//JlmFGbovH519+m\n\tuF3gJ1Hau6q1VfuBMP8GA88fkEfwL2yLjkug2Ly0=","Date":"Sun, 13 Oct 2019 17:30:32 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191013143032.GD4886@pendragon.ideasonboard.com>","References":"<20191012184407.31684-1-laurent.pinchart@ideasonboard.com>\n\t<20191012184407.31684-13-laurent.pinchart@ideasonboard.com>\n\t<20191013142840.6562nlqb7xnwr5fe@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20191013142840.6562nlqb7xnwr5fe@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","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>","X-List-Received-Date":"Sun, 13 Oct 2019 14:30:35 -0000"}},{"id":2890,"web_url":"https://patchwork.libcamera.org/comment/2890/","msgid":"<20191013162101.GU23166@bigcity.dyn.berto.se>","date":"2019-10-13T16:21:01","subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your work.\n\nOn 2019-10-12 21:44:05 +0300, Laurent Pinchart wrote:\n> In preparation for extending V4L2ControlInfoMap with control idmap\n> support, turn it into a real class. Make it inherit from std::map<>\n> instead of wrapping it to keep the API simple.\n> \n> V4L2ControlInfoMap is meant to be constructed with a set of control\n> info, and never modified afterwards. To ensure this, inherit from\n> std::map<> with private access specifier, and explicitly expose the\n> std::map<> methods that do not allow insertion or removal of elements. A\n> custom move assignment operator is implemented to allow efficient\n> construction of the V4L2ControlInfoMap.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  src/libcamera/include/v4l2_controls.h | 16 +++++++++++++++-\n>  src/libcamera/v4l2_controls.cpp       | 17 ++++++++++++++++-\n>  src/libcamera/v4l2_device.cpp         |  9 ++++++---\n>  3 files changed, 37 insertions(+), 5 deletions(-)\n> \n> diff --git a/src/libcamera/include/v4l2_controls.h b/src/libcamera/include/v4l2_controls.h\n> index 949ca21cb863..8990e755a385 100644\n> --- a/src/libcamera/include/v4l2_controls.h\n> +++ b/src/libcamera/include/v4l2_controls.h\n> @@ -43,7 +43,21 @@ private:\n>  \tControlRange range_;\n>  };\n>  \n> -using V4L2ControlInfoMap = std::map<unsigned int, V4L2ControlInfo>;\n> +class V4L2ControlInfoMap : private std::map<unsigned int, V4L2ControlInfo>\n> +{\n> +public:\n> +\tV4L2ControlInfoMap &operator=(std::map<unsigned int, V4L2ControlInfo> &&info);\n> +\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::begin;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::cbegin;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::end;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::cend;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::at;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::empty;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::size;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::count;\n> +\tusing std::map<unsigned int, V4L2ControlInfo>::find;\n> +};\n>  \n>  class V4L2Control\n>  {\n> diff --git a/src/libcamera/v4l2_controls.cpp b/src/libcamera/v4l2_controls.cpp\n> index 3f5f3ff10880..438e8d8bdb99 100644\n> --- a/src/libcamera/v4l2_controls.cpp\n> +++ b/src/libcamera/v4l2_controls.cpp\n> @@ -156,10 +156,25 @@ V4L2ControlInfo::V4L2ControlInfo(const struct v4l2_query_ext_ctrl &ctrl)\n>   */\n>  \n>  /**\n> - * \\typedef V4L2ControlInfoMap\n> + * \\class V4L2ControlInfoMap\n>   * \\brief A map of control ID to V4L2ControlInfo\n>   */\n>  \n> +/**\n> + * \\brief Move assignment operator from plain map\n> + *\n> + * Populate the map by replacing its contents with those of \\a info using move\n> + * semantics. This is the only supported\n> + *\n> + * \\return *this\n> + */\n> +V4L2ControlInfoMap &V4L2ControlInfoMap::operator=(std::map<unsigned int, V4L2ControlInfo> &&info)\n> +{\n> +\tstd::map<unsigned int, V4L2ControlInfo>::operator=(std::move(info));\n> +\n> +\treturn *this;\n> +}\n> +\n>  /**\n>   * \\class V4L2Control\n>   * \\brief A V4L2 control value\n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index 8c5998435020..1f755f0f3ef6 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -340,6 +340,7 @@ int V4L2Device::ioctl(unsigned long request, void *argp)\n>   */\n>  void V4L2Device::listControls()\n>  {\n> +\tstd::map<unsigned int, V4L2ControlInfo> ctrls;\n>  \tstruct v4l2_query_ext_ctrl ctrl = {};\n>  \n>  \t/* \\todo Add support for menu and compound controls. */\n> @@ -368,10 +369,12 @@ void V4L2Device::listControls()\n>  \t\t\tcontinue;\n>  \t\t}\n>  \n> -\t\tcontrols_.emplace(std::piecewise_construct,\n> -\t\t\t\t  std::forward_as_tuple(ctrl.id),\n> -\t\t\t\t  std::forward_as_tuple(ctrl));\n> +\t\tctrls.emplace(std::piecewise_construct,\n> +\t\t\t      std::forward_as_tuple(ctrl.id),\n> +\t\t\t      std::forward_as_tuple(ctrl));\n>  \t}\n> +\n> +\tcontrols_ = std::move(ctrls);\n>  }\n>  \n>  /*\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x243.google.com (mail-lj1-x243.google.com\n\t[IPv6:2a00:1450:4864:20::243])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5828261562\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 13 Oct 2019 18:21:03 +0200 (CEST)","by mail-lj1-x243.google.com with SMTP id a22so14284551ljd.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 13 Oct 2019 09:21:03 -0700 (PDT)","from localhost (h-93-159.A463.priv.bahnhof.se. [46.59.93.159])\n\tby smtp.gmail.com with ESMTPSA id\n\tl5sm3442145lfk.17.2019.10.13.09.21.01\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 13 Oct 2019 09:21:01 -0700 (PDT)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=vjcxMOLXGzGyoCeED9ycALt4hWtMpFUE7Mryzc0ajBE=;\n\tb=kGtaCSdPIk+GHunm+gRzK6At2UXTm8AZLqPCxF3fNhuvI3ac7gsGJHxLBp/ssgcQlS\n\tISqyKxmp90W85/j7HupB3wJMrTLxcPVeyvs2rr4F5jIKEQ3iNPiFyxWlPeDuBJteAb5a\n\tB9MvtawyPuYwQKWRXZw5lZODBU34ESAlDP7xv7Tv2e0fsDHh0AYIXUQj6u1Y0xU59F2H\n\tfgyzFHWEhqdKFm91KTqaGsYQu877QZfjHl7QTkuScAOqcIue/+AcHIDcH2O9nNcqpqV5\n\tcCNW6J3k1688oyncJeyrpVFqeKgzhRKz15YGeFN3MIqzKQD7YwDZPV/SdXgqcczGMEaY\n\tI2kw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=vjcxMOLXGzGyoCeED9ycALt4hWtMpFUE7Mryzc0ajBE=;\n\tb=NQ7R83I7VjceTH23r4thEzDq1BiWaWA6jxfWouMGrXldSwwjb3pDjU9hgx9thMXcbG\n\tgmHNBOmvAhm/NuW+v1JS/iuAgROeGq3OTWzDDAUUiGyznONTKzPv/hp6OAICDISymZcd\n\tNjIRUt0oXsxuZHYqeI3rVWY5/u6AGUNLiRGUhgrDdyh0S9tEPjnCTCl9xnza/6GtliF3\n\tJ1Btdym7i/uexh/qQ/7X4rsWxLWLqhjAJfe5ms50/+ZCmsdPLwVAaqH5xWTFv6Pyoupm\n\tcKApK6L8D8AEa5lFAgmTVr7lCXfgvJAoYv9aZhcOEQb3WbVUPfTMbg3+srX7qvyb06ds\n\tgJXA==","X-Gm-Message-State":"APjAAAULwp/pjWg91rgbTmjsPc50cuu3PvLi7rkLmAdsQsflAa1/mMLq\n\tG6bK9ZS8vcvi7tEGjJWW75N6BQ==","X-Google-Smtp-Source":"APXvYqwfyfJwXdxIjYPaxYGweMgiSK1tLH37xcLmAxmRepNPzIHhyz2R1E5luJpsTwgBZDT6O4KB3g==","X-Received":"by 2002:a2e:9848:: with SMTP id\n\te8mr16004502ljj.155.1570983662146; \n\tSun, 13 Oct 2019 09:21:02 -0700 (PDT)","Date":"Sun, 13 Oct 2019 18:21:01 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191013162101.GU23166@bigcity.dyn.berto.se>","References":"<20191012184407.31684-1-laurent.pinchart@ideasonboard.com>\n\t<20191012184407.31684-13-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20191012184407.31684-13-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 12/14] libcamera: v4l2_controls:\n\tTurn V4L2ControlInfoMap into a class","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>","X-List-Received-Date":"Sun, 13 Oct 2019 16:21:03 -0000"}}]