[{"id":13519,"web_url":"https://patchwork.libcamera.org/comment/13519/","msgid":"<20201027215331.GC3955072@oden.dyn.berto.se>","date":"2020-10-27T21:53:31","subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: Use helper variable\n\ttemplate 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:08 +0200, Laurent Pinchart wrote:\n> C++17 introduces helper variable templates for type traits, allowing\n> shortening std::is_foo<T>::value to std::is_foo_v<T>. Use them through\n> the code base.\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/bound_method.h |  2 +-\n>  include/libcamera/controls.h     | 12 ++++----\n>  include/libcamera/object.h       |  2 +-\n>  include/libcamera/signal.h       |  4 +--\n>  include/libcamera/span.h         | 48 ++++++++++++++++----------------\n>  5 files changed, 34 insertions(+), 34 deletions(-)\n> \n> diff --git a/include/libcamera/bound_method.h b/include/libcamera/bound_method.h\n> index 95a956530877..feac51dac527 100644\n> --- a/include/libcamera/bound_method.h\n> +++ b/include/libcamera/bound_method.h\n> @@ -63,7 +63,7 @@ public:\n>  \t}\n>  \tvirtual ~BoundMethodBase() = default;\n>  \n> -\ttemplate<typename T, typename std::enable_if_t<!std::is_same<Object, T>::value> * = nullptr>\n> +\ttemplate<typename T, typename std::enable_if_t<!std::is_same_v<Object, T>> * = nullptr>\n>  \tbool match(T *obj) { return obj == obj_; }\n>  \tbool match(Object *object) { return object == object_; }\n>  \n> diff --git a/include/libcamera/controls.h b/include/libcamera/controls.h\n> index 3b7f3347761e..dc549a92f975 100644\n> --- a/include/libcamera/controls.h\n> +++ b/include/libcamera/controls.h\n> @@ -98,7 +98,7 @@ public:\n>  #ifndef __DOXYGEN__\n>  \ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n>  \t\t\t\t\t\t       details::control_type<T>::value &&\n> -\t\t\t\t\t\t       !std::is_same<std::string, std::remove_cv_t<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>  \tControlValue(const T &value)\n>  \t\t: type_(ControlTypeNone), numElements_(0)\n> @@ -108,7 +108,7 @@ public:\n>  \t}\n>  \n>  \ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> -\t\t\t\t\t\t       std::is_same<std::string, std::remove_cv_t<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>  #else\n>  \ttemplate<typename T>\n> @@ -142,7 +142,7 @@ public:\n>  \n>  #ifndef __DOXYGEN__\n>  \ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n> -\t\t\t\t\t\t       !std::is_same<std::string, std::remove_cv_t<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>  \tT get() const\n>  \t{\n> @@ -153,7 +153,7 @@ public:\n>  \t}\n>  \n>  \ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> -\t\t\t\t\t\t       std::is_same<std::string, std::remove_cv_t<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>  #else\n>  \ttemplate<typename T>\n> @@ -170,7 +170,7 @@ public:\n>  \n>  #ifndef __DOXYGEN__\n>  \ttemplate<typename T, typename std::enable_if_t<!details::is_span<T>::value &&\n> -\t\t\t\t\t\t       !std::is_same<std::string, std::remove_cv_t<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>  \tvoid set(const T &value)\n>  \t{\n> @@ -179,7 +179,7 @@ public:\n>  \t}\n>  \n>  \ttemplate<typename T, typename std::enable_if_t<details::is_span<T>::value ||\n> -\t\t\t\t\t\t       std::is_same<std::string, std::remove_cv_t<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>  #else\n>  \ttemplate<typename T>\n> diff --git a/include/libcamera/object.h b/include/libcamera/object.h\n> index a1882f05fb77..423208db24bd 100644\n> --- a/include/libcamera/object.h\n> +++ b/include/libcamera/object.h\n> @@ -32,7 +32,7 @@ public:\n>  \tvoid postMessage(std::unique_ptr<Message> msg);\n>  \n>  \ttemplate<typename T, typename R, typename... FuncArgs, typename... Args,\n> -\t\t typename std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr>\n> +\t\t typename std::enable_if_t<std::is_base_of_v<Object, T>> * = nullptr>\n>  \tR invokeMethod(R (T::*func)(FuncArgs...), ConnectionType type,\n>  \t\t       Args... args)\n>  \t{\n> diff --git a/include/libcamera/signal.h b/include/libcamera/signal.h\n> index 5bcd7a77c5f1..46d917d5f582 100644\n> --- a/include/libcamera/signal.h\n> +++ b/include/libcamera/signal.h\n> @@ -44,7 +44,7 @@ public:\n>  \t}\n>  \n>  #ifndef __DOXYGEN__\n> -\ttemplate<typename T, typename R, typename std::enable_if_t<std::is_base_of<Object, T>::value> * = nullptr>\n> +\ttemplate<typename T, typename R, typename std::enable_if_t<std::is_base_of_v<Object, T>> * = nullptr>\n>  \tvoid connect(T *obj, R (T::*func)(Args...),\n>  \t\t     ConnectionType type = ConnectionTypeAuto)\n>  \t{\n> @@ -52,7 +52,7 @@ public:\n>  \t\tSignalBase::connect(new BoundMethodMember<T, void, Args...>(obj, object, func, type));\n>  \t}\n>  \n> -\ttemplate<typename T, typename R, typename std::enable_if_t<!std::is_base_of<Object, T>::value> * = nullptr>\n> +\ttemplate<typename T, typename R, typename std::enable_if_t<!std::is_base_of_v<Object, T>> * = nullptr>\n>  #else\n>  \ttemplate<typename T, typename R>\n>  #endif\n> diff --git a/include/libcamera/span.h b/include/libcamera/span.h\n> index 91e9f974cc58..d720adb81f89 100644\n> --- a/include/libcamera/span.h\n> +++ b/include/libcamera/span.h\n> @@ -125,8 +125,8 @@ public:\n>  \n>  \ttemplate<std::size_t N>\n>  \tconstexpr Span(element_type (&arr)[N],\n> -\t\t       std::enable_if_t<std::is_convertible<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value &&\n> +\t\t       std::enable_if_t<std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> +\t\t\t\t\t\t\t      element_type (*)[]> &&\n>  \t\t\t\t\tN == Extent,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(arr)\n> @@ -135,8 +135,8 @@ public:\n>  \n>  \ttemplate<std::size_t N>\n>  \tconstexpr Span(std::array<value_type, N> &arr,\n> -\t\t       std::enable_if_t<std::is_convertible<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value &&\n> +\t\t       std::enable_if_t<std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> +\t\t\t\t\t\t\t      element_type (*)[]> &&\n>  \t\t\t\t\tN == Extent,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(arr.data())\n> @@ -145,8 +145,8 @@ public:\n>  \n>  \ttemplate<std::size_t N>\n>  \tconstexpr Span(const std::array<value_type, N> &arr,\n> -\t\t       std::enable_if_t<std::is_convertible<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value &&\n> +\t\t       std::enable_if_t<std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> +\t\t\t\t\t\t\t      element_type (*)[]> &&\n>  \t\t\t\t\tN == Extent,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(arr.data())\n> @@ -157,9 +157,9 @@ public:\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\t\t\t !std::is_array<Container>::value &&\n> -\t\t\t\t\t\t std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n> -\t\t\t\t\t\t\t\t     element_type (*)[]>::value,\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>  \t\t\t\t\t\t std::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont))\n>  \t{\n> @@ -169,9 +169,9 @@ public:\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\t\t\t !std::is_array<Container>::value &&\n> -\t\t\t\t\t\t std::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n> -\t\t\t\t\t\t\t\t     element_type (*)[]>::value,\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>  \t\t\t\t\t\t std::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont))\n>  \t{\n> @@ -180,7 +180,7 @@ public:\n>  \n>  \ttemplate<class U, std::size_t N>\n>  \texplicit constexpr Span(const Span<U, N> &s,\n> -\t\t\t\tstd::enable_if_t<std::is_convertible<U (*)[], element_type (*)[]>::value &&\n> +\t\t\t\tstd::enable_if_t<std::is_convertible_v<U (*)[], element_type (*)[]> &&\n>  \t\t\t\t\t\t N == Extent,\n>  \t\t\t\t\t\t std::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(s.data())\n> @@ -293,8 +293,8 @@ public:\n>  \n>  \ttemplate<std::size_t N>\n>  \tconstexpr Span(element_type (&arr)[N],\n> -\t\t       std::enable_if_t<std::is_convertible<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value,\n> +\t\t       std::enable_if_t<std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> +\t\t\t\t\t\t\t      element_type (*)[]>,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(arr), size_(N)\n>  \t{\n> @@ -302,8 +302,8 @@ public:\n>  \n>  \ttemplate<std::size_t N>\n>  \tconstexpr Span(std::array<value_type, N> &arr,\n> -\t\t       std::enable_if_t<std::is_convertible<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value,\n> +\t\t       std::enable_if_t<std::is_convertible_v<std::remove_pointer_t<decltype(utils::data(arr))> (*)[],\n> +\t\t\t\t\t\t\t      element_type (*)[]>,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(utils::data(arr)), size_(N)\n>  \t{\n> @@ -319,9 +319,9 @@ public:\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\t\t\t!std::is_array<Container>::value &&\n> -\t\t\t\t\tstd::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value,\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>  \t\t\t\t\tstd::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont)), size_(utils::size(cont))\n>  \t{\n> @@ -331,9 +331,9 @@ public:\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\t\t\t!std::is_array<Container>::value &&\n> -\t\t\t\t\tstd::is_convertible<std::remove_pointer_t<decltype(utils::data(cont))> (*)[],\n> -\t\t\t\t\t\t\t    element_type (*)[]>::value,\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>  \t\t\t\t\tstd::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont)), size_(utils::size(cont))\n>  \t{\n> @@ -341,7 +341,7 @@ public:\n>  \n>  \ttemplate<class U, std::size_t N>\n>  \tconstexpr Span(const Span<U, N> &s,\n> -\t\t       std::enable_if_t<std::is_convertible<U (*)[], element_type (*)[]>::value,\n> +\t\t       std::enable_if_t<std::is_convertible_v<U (*)[], element_type (*)[]>,\n>  \t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(s.data()), size_(s.size())\n>  \t{\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 59F84BDB1E\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 27 Oct 2020 21:53:36 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DF65A6216C;\n\tTue, 27 Oct 2020 22:53:35 +0100 (CET)","from mail-lj1-x242.google.com (mail-lj1-x242.google.com\n\t[IPv6:2a00:1450:4864:20::242])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 42CE4620BE\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Oct 2020 22:53:34 +0100 (CET)","by mail-lj1-x242.google.com with SMTP id h20so3504200lji.9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 27 Oct 2020 14:53:34 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tv20sm326662ljj.50.2020.10.27.14.53.32\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tTue, 27 Oct 2020 14:53:32 -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=\"XY36O9Cl\"; 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=3Djof4x/G0Wd+6lME+hBL5WQ9gg5SSUAl+VAPk1D+5g=;\n\tb=XY36O9ClqFoxXgeL0ypGGoHjX8U72NnQCbPVSd6d0wRvL3RcJb83Xhx7dsnEJZMlhD\n\tUC4DRL1Qz6WsQ97K+CnoFGePKd8Fdwb3fOPnVQsWu7rsFb1Q0XmnVeyeEYTFNVZObV4h\n\t+wI/Q38UY7e90Yikxj+oZEGdVwlyz94NlT4EWswGcoTz80fLiN+COETDrtj3j8VvMT1A\n\tyCs975WQmQVN70DR090zBt0ErA6WfdAT3W710qB5b/DW7MYBCUOwDXBAgRm/wkMTSm/o\n\tSD68wpk+GlL2kKH2iqucey6ul4dn47dq5G2ywKeFN1s3O89kox5MI8Lg2S5Hw3JJK5RK\n\t4rKg==","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=3Djof4x/G0Wd+6lME+hBL5WQ9gg5SSUAl+VAPk1D+5g=;\n\tb=I2gtUYK4DRwyQ9kmXNMEoeaukkEFpGE8lQjlKg+RIJ/966ntx8Z1SS6Js2t2CYh77O\n\tvjvZCxXpolvVbEGyYOATyqHl4sCBEKJJDRHmaT3Cv5aPm/68odrrsO/eRjUbrCV5rZVe\n\tJNfGnbLf01ZRaO7UWGREA12BP9ujrXwazEmvCUJg/x2cbxAe9/pGewPHls0HLj91kfFV\n\tmGOqKa46mCUTttR0yazo/TfrVe8s8qQioDswWyK9mSd3xFslFUlMghIf17mOS+/P4ege\n\tOS0F75aw0ZZx6gJ+PgycLrsoDl14bSUHZ1uRezeHG2uOey+WYvXqsp8f+tUzKV6hT/j7\n\tt3Cw==","X-Gm-Message-State":"AOAM532YNsEWE7F9tu4WbdsBPRycdtiymkOfX5NvY7SKqHheJx23gjTX\n\tNOBscQd5wia/V0oPnp3xkVwUSK1x7w3vnA==","X-Google-Smtp-Source":"ABdhPJyVAV0LFxYr+I6EZLCXfPMPEdr5WQ+5w4hKuVguK/k+9ZjxgOTSnzaM+vEEs9oYwCn7KEbmBA==","X-Received":"by 2002:a2e:9b8e:: with SMTP id z14mr1810722lji.26.1603835613320;\n\tTue, 27 Oct 2020 14:53:33 -0700 (PDT)","Date":"Tue, 27 Oct 2020 22:53:31 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20201027215331.GC3955072@oden.dyn.berto.se>","References":"<20201026195209.16748-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201026195209.16748-1-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH 1/2] libcamera: Use helper variable\n\ttemplate 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>"}}]