[{"id":13520,"web_url":"https://patchwork.libcamera.org/comment/13520/","msgid":"<20201027215354.GD3955072@oden.dyn.berto.se>","date":"2020-10-27T21:53:54","subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: span: Provide and use\n\thelper variable templates for type traits","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 2020-10-26 21:52:09 +0200, Laurent Pinchart wrote:\n> Following the C++17 practice, provide is_array_v<T> and is_span_v<T>\n> helper variable templates as shorter versions of is_array<T>::value and\n> is_span<T>::value, and use them through the code.\n> \n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  include/libcamera/controls.h | 12 ++++++------\n>  include/libcamera/span.h     | 22 ++++++++++++++--------\n>  2 files changed, 20 insertions(+), 14 deletions(-)\n> \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index dc549a92f975..3634dc431618 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -96,7 +96,7 @@ public:\n>  \tControlValue();\n>  \n>  #ifndef __DOXYGEN__\n> -\ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n> +\ttemplate<typename T, typename std::enable_if_t<!details::is_span_v<T> &&\n>  \t\t\t\t\t\t       details::control_type<T>::value &&\n>  \t\t\t\t\t\t       !std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n> @@ -107,7 +107,7 @@ public:\n>  \t\t    &value, 1, sizeof(T));\n>  \t}\n>  \n> -\ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> +\ttemplate<typename T, typename std::enable_if_t<details::is_span_v<T> ||\n>  \t\t\t\t\t\t       std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n>  #else\n> @@ -141,7 +141,7 @@ public:\n>  \t}\n>  \n>  #ifndef __DOXYGEN__\n> -\ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n> +\ttemplate<typename T, typename std::enable_if_t<!details::is_span_v<T> &&\n>  \t\t\t\t\t\t       !std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n>  \tT get() const\n> @@ -152,7 +152,7 @@ public:\n>  \t\treturn *reinterpret_cast<const T *>(data().data());\n>  \t}\n>  \n> -\ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> +\ttemplate<typename T, typename std::enable_if_t<details::is_span_v<T> ||\n>  \t\t\t\t\t\t       std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n>  #else\n> @@ -169,7 +169,7 @@ public:\n>  \t}\n>  \n>  #ifndef __DOXYGEN__\n> -\ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n> +\ttemplate<typename T, typename std::enable_if_t<!details::is_span_v<T> &&\n>  \t\t\t\t\t\t       !std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n>  \tvoid set(const T &value)\n> @@ -178,7 +178,7 @@ public:\n>  \t\t    reinterpret_cast<const void *>(&value), 1, sizeof(T));\n>  \t}\n>  \n> -\ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> +\ttemplate<typename T, typename std::enable_if_t<details::is_span_v<T> ||\n>  \t\t\t\t\t\t       std::is_same_v<std::string, std::remove_cv_t<T>>,\n>  \t\t\t\t\t\t       std::nullptr_t> = nullptr>\n>  #else\n> diff --git a/include/libcamera/span.h b/include/libcamera/span.h\n> index d720adb81f89..e7ffef1255d4 100644\n> --- a/include/libcamera/span.h\n> +++ b/include/libcamera/span.h\n> @@ -31,6 +31,9 @@ template<typename U, std::size_t N>\n>  struct is_array<std::array<U, N>> : public std::true_type {\n>  };\n>  \n> +template<typename T>\n> +inline constexpr bool is_array_v = is_array<T>::value;\n> +\n>  template<typename U>\n>  struct is_span : public std::false_type {\n>  };\n> @@ -39,6 +42,9 @@ template<typename U, std::size_t Extent>\n>  struct is_span<Span<U, Extent>> : public std::true_type {\n>  };\n>  \n> +template<typename T>\n> +inline constexpr bool is_span_v = is_span<T>::value;\n> +\n>  } /* namespace details */\n>  \n>  namespace utils {\n> @@ -155,8 +161,8 @@ public:\n>  \n>  \ttemplate<class Container>\n>  \texplicit constexpr Span(Container &cont,\n> -\t\t\t\tstd::enable_if_t<!details::is_span<Container>::value &&\n> -\t\t\t\t\t\t !details::is_array<Container>::value &&\n> +\t\t\t\tstd::enable_if_t<!details::is_span_v<Container> &&\n> +\t\t\t\t\t\t !details::is_array_v<Container> &&\n>  \t\t\t\t\t\t !std::is_array_v<Container> &&\n>  \t\t\t\t\t\t std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n>  \t\t\t\t\t\t\t\t       element_type (*)[]>,\n> @@ -167,8 +173,8 @@ public:\n>  \n>  \ttemplate<class Container>\n>  \texplicit constexpr Span(const Container &cont,\n> -\t\t\t\tstd::enable_if_t<!details::is_span<Container>::value &&\n> -\t\t\t\t\t\t !details::is_array<Container>::value &&\n> +\t\t\t\tstd::enable_if_t<!details::is_span_v<Container> &&\n> +\t\t\t\t\t\t !details::is_array_v<Container> &&\n>  \t\t\t\t\t\t !std::is_array_v<Container> &&\n>  \t\t\t\t\t\t std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n>  \t\t\t\t\t\t\t\t       element_type (*)[]>,\n> @@ -317,8 +323,8 @@ public:\n>  \n>  \ttemplate<class Container>\n>  \tconstexpr Span(Container &cont,\n> -\t\t       std::enable_if_t<!details::is_span<Container>::value &&\n> -\t\t\t\t\t!details::is_array<Container>::value &&\n> +\t\t       std::enable_if_t<!details::is_span_v<Container> &&\n> +\t\t\t\t\t!details::is_array_v<Container> &&\n>  \t\t\t\t\t!std::is_array_v<Container> &&\n>  \t\t\t\t\tstd::is_convertible_v<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n>  \t\t\t\t\t\t\t      element_type (*)[]>,\n> @@ -329,8 +335,8 @@ public:\n>  \n>  \ttemplate<class Container>\n>  \tconstexpr Span(const Container &cont,\n> -\t\t       std::enable_if_t<!details::is_span<Container>::value &&\n> -\t\t\t\t\t!details::is_array<Container>::value &&\n> +\t\t       std::enable_if_t<!details::is_span_v<Container> &&\n> +\t\t\t\t\t!details::is_array_v<Container> &&\n>  \t\t\t\t\t!std::is_array_v<Container> &&\n>  \t\t\t\t\tstd::is_convertible_v<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n>  \t\t\t\t\t\t\t      element_type (*)[]>,\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":"<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 72A96BDB1E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 27 Oct 2020 21:53:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 423BA62221;\n\tTue, 27 Oct 2020 22:53:57 +0100 (CET)","from mail-lf1-x141.google.com (mail-lf1-x141.google.com\n\t[IPv6:2a00:1450:4864:20::141])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7CB67620BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Oct 2020 22:53:56 +0100 (CET)","by mail-lf1-x141.google.com with SMTP id l2so4342973lfk.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Oct 2020 14:53:56 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tl8sm279116lfc.50.2020.10.27.14.53.55\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 27 Oct 2020 14:53:55 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"nF8qVKIZ\"; dkim-atps=neutral","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\tbh=hBb9Y7/wZsOygz6JVVuf+TxECKgdM3i7JEO4OUGj6dQ=;\n\tb=nF8qVKIZdKM127UJEVBDpaSJBPswcaIJkfzyiB11lxTn803s4hbM10foRaros60wEN\n\tj7Co4TEz4QAWYHUCrvnhi8TTgwyxJUjDahBnKmjsVFZPcpPWe8Fzzt4QEzjIKpckpcz4\n\tJNfeeuI2L714PAB8cBLCKnVPh04sL/TMWfehrTtdCKXv9V3T6GWbFVoQPmU2XPMzj3JE\n\tc5pL+VATKF23ZUOIVTUe/FNY2h2hpRs3eP1iZhmFvi/iRp6gp9zqrx/f/mPMZnOXUB6E\n\tuaaJZTTjOB+oVJeFtFw2FZs4FwacIP8DdHOw1umD0dgU6Ja8YER5Wr7EBPBkEkGW9vCK\n\tRpQA==","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;\n\tbh=hBb9Y7/wZsOygz6JVVuf+TxECKgdM3i7JEO4OUGj6dQ=;\n\tb=U89Ymu3f9u8HrsHBieotMMKr9xSxkrFgRMH8Px8LanNthyubi/F4ygQycAqPmNjaQJ\n\taSiAUxaKQ0ypC1TllmOe8rawd8d1XJOjwtHVDQQbMpywxC5SM2stZ/T5eF60bfJhZET6\n\toMPh5uXN24sJG/nQOkB9wPJoBQHVmDmkKwZ/08QKcJyDe+NTE9639LmfAOObmdtmgaxX\n\tz3D+FQBx7aThEkknHZU6Ot2E31OMJMtVoXAAAuCHgimQcBHWT4s/uDw+bMonsHnyyWAj\n\te2j8t3PFRHZrt6a5DVBnRDDZv+nZUIhRtJwbBTH3COlSA3Tm81h/7Raaw1MXeJjqZaTR\n\thmUA==","X-Gm-Message-State":"AOAM5314RexOiY4JHYVlfS8P+9QtXPcWOzxagnRLHYGU8iibW4zRbORB\n\tXCZDcCrkS50gQU3zPzFvSS+s5z8pN/XXqQ==","X-Google-Smtp-Source":"ABdhPJz3Oa1P2Eim0A5ah6yjb/n0K/RNrIIe7Rr42JsdN5deAFsB/vBJnPYC3kosc9/+UTQMvgJuPQ==","X-Received":"by 2002:ac2:592d:: with SMTP id\n\tv13mr1450390lfi.355.1603835635802; \n\tTue, 27 Oct 2020 14:53:55 -0700 (PDT)","Date":"Tue, 27 Oct 2020 22:53:54 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20201027215354.GD3955072@oden.dyn.berto.se>","References":"<20201026195209.16748-1-laurent.pinchart@ideasonboard.com>\n\t<20201026195209.16748-2-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201026195209.16748-2-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 2/2] libcamera: span: Provide and use\n\thelper variable templates for type traits","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]