[{"id":22551,"web_url":"https://patchwork.libcamera.org/comment/22551/","msgid":"<20220401134053.r5ym7b27g3avokmb@uno.localdomain>","date":"2022-04-01T13:40:53","subject":"Re: [libcamera-devel] [PATCH 2/5] generate fixed- and\n\tvariable-sized Span Controls","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Christian\n\nOn Fri, Apr 01, 2022 at 01:06:13AM +0100, Christian Rauch via libcamera-devel wrote:\n> This defines Controls with a 'size' as either variable-sized Span<T> or as\n> fixed-sized Span<T,N>.\n>\n> Signed-off-by: Christian Rauch <Rauch.Christian@gmx.de>\n> ---\n>  utils/gen-controls.py | 33 +++++++++++++++++++++++----------\n>  1 file changed, 23 insertions(+), 10 deletions(-)\n>\n> diff --git a/utils/gen-controls.py b/utils/gen-controls.py\n> index 3f99b5e2..694d761a 100755\n> --- a/utils/gen-controls.py\n> +++ b/utils/gen-controls.py\n> @@ -10,6 +10,7 @@ import argparse\n>  import string\n>  import sys\n>  import yaml\n> +from math import prod\n\nnit: keep the inclusion directives sorted please\n\n>\n>\n>  def snake_case(s):\n> @@ -22,6 +23,26 @@ def format_description(description):\n>      return '\\n'.join([(line and ' * ' or ' *') + line for line in description])\n>\n>\n> +def get_ctrl_type_format(ctrl):\n> +    ctrl_type = ctrl['type']\n> +    ctrl_size_arr = ctrl.get('size')\n> +    ctrl_is_span = ctrl_size_arr is not None\n> +    if ctrl_is_span:\n> +        ctrl_span_size = prod(ctrl_size_arr) if len(ctrl_size_arr)>0 else None\n\nnit: unless some python coding style requirements prescribes\ndifferently, \"if len(ctrl_size_arr) > 0\" (ie space between operators)\nreads better\n\n> +\n> +    if ctrl_type == 'string':\n> +        ctrl_type = 'std::string'\n> +    elif ctrl_is_span:\n> +        if ctrl_span_size:\n> +            # fixed-sized Span\n> +            ctrl_type = 'Span<const {}, {}>'.format(ctrl_type, span_size)\n> +        else:\n> +            # variable-sized Span\n> +            ctrl_type = 'Span<const {}>'.format(ctrl_type)\n\nThis now reads\n\n        ctrl_is_span = ...\n        if ctrl_is_span:\n                ...\n\n        if ctrl_type == \"string\":\n                ....\n        elif ctrl_is_span:\n                ...\n\n        return ctrl_type\n\nShould this just be\n\n        ctrl_type = ctrl['type']\n\n        if ctrl_type == 'string':\n                return 'std::string'\n\n        ctrl_size = ctrl.get('size')\n        if ctrl_size is not None:\n                if len(ctrl_size) > 0:\n                        span_size = prod(ctrl_size)\n                        return 'Span<const {}, {}>'.format(ctrl_type, span_size)\n                else\n                        return 'Span<const {}>'.format(ctrl_type)\n\n       return ctrl_type\n\n(not-compiled pseudo-code from someone who barely knows python, take\nthis just as a suggestion)\n\nAs a non-native Python speaker I aslo wonder what the difference\nbetween the existing\n\n        'Span<const %s>' % ctrl_type\n\nand\n        'Span<const {}>'.format(ctrl_type)\n\nis. Are those equivalent ? I would assume so...\n\nThe patch is good though!\n\n> +\n> +    return ctrl_type\n> +\n> +\n>  def generate_cpp(controls):\n>      enum_doc_start_template = string.Template('''/**\n>   * \\\\enum ${name}Enum\n> @@ -50,11 +71,7 @@ ${description}\n>          name, ctrl = ctrl.popitem()\n>          id_name = snake_case(name).upper()\n>\n> -        ctrl_type = ctrl['type']\n> -        if ctrl_type == 'string':\n> -            ctrl_type = 'std::string'\n> -        elif ctrl.get('size'):\n> -            ctrl_type = 'Span<const %s>' % ctrl_type\n> +        ctrl_type = get_ctrl_type_format(ctrl)\n>\n>          info = {\n>              'name': name,\n> @@ -135,11 +152,7 @@ def generate_h(controls):\n>\n>          ids.append('\\t' + id_name + ' = ' + str(id_value) + ',')\n>\n> -        ctrl_type = ctrl['type']\n> -        if ctrl_type == 'string':\n> -            ctrl_type = 'std::string'\n> -        elif ctrl.get('size'):\n> -            ctrl_type = 'Span<const %s>' % ctrl_type\n> +        ctrl_type = get_ctrl_type_format(ctrl)\n>\n>          info = {\n>              'name': name,\n> --\n> 2.25.1\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 13F6CC0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  1 Apr 2022 13:40:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0CED7633A6;\n\tFri,  1 Apr 2022 15:40:57 +0200 (CEST)","from relay12.mail.gandi.net (relay12.mail.gandi.net\n\t[IPv6:2001:4b98:dc4:8::232])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EFC7C633A6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  1 Apr 2022 15:40:55 +0200 (CEST)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 5E440200004;\n\tFri,  1 Apr 2022 13:40:55 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1648820457;\n\tbh=Cvcyw1AetQRnbXkh/wTnkfwkMR4B454othrCLFQTumA=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=ru78V3a5CA0Rt8+0O/8jL2jveiM48wdIHSZXgIdDwtSuXgfFf1/6q+eqemkySF3Wz\n\tfQfymcRmj3GSdG8Vr9MqAnphKLW0p8+0l8BzHSdbd6smHN12VVUu0NIbJ84VOCl6pf\n\tJ+3y9xePoAQTiFvQ90X7ynRrLPCEdRUPz2u+z7j8BWd2Y5DoEOY64TBKT16Ec2Cinc\n\tDN0QGkJSIINjGXQmRWoeOn9cunKh8DArqzpBJMYEv3NDpMpzSzul2iNyam0gaM+NEP\n\tGhao00jb2TiGB0Eh6ipoIAy/txeVEPI3/lfWxY3UL6OJXJ/BWCEakcQgXsRIOEKz3T\n\tXSLxKcXzhWSRQ==","Date":"Fri, 1 Apr 2022 15:40:53 +0200","To":"Christian Rauch <Rauch.Christian@gmx.de>","Message-ID":"<20220401134053.r5ym7b27g3avokmb@uno.localdomain>","References":"<20220401000616.12976-1-Rauch.Christian@gmx.de>\n\t<20220401000616.12976-3-Rauch.Christian@gmx.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220401000616.12976-3-Rauch.Christian@gmx.de>","Subject":"Re: [libcamera-devel] [PATCH 2/5] generate fixed- and\n\tvariable-sized Span Controls","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]