[{"id":13475,"web_url":"https://patchwork.libcamera.org/comment/13475/","msgid":"<20201025080555.GA2940768@oden.dyn.berto.se>","date":"2020-10-25T08:05:55","subject":"Re: [libcamera-devel] [PATCH] libcamera: span: Make constructors\n\texplicit as required by C++20","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-24 20:12:25 +0300, Laurent Pinchart wrote:\n> The C++20 std::span class, after which Span is modelled, specifies four\n> constructors as explicit when extent is not dynamic_extent. Align our\n> implementation with those requirements.\n> \n> A careful reviewer may notice that this change addresses five\n> constructors, not four. The reason is that the two constructors taking\n> Container and const Container parameters are not specified in C++20,\n> which uses a single constructor taking a range parameter instead. As\n> ranges are not available in C++17, the Container constructors are our\n> best effort at providing a similar feature.\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/span.h | 62 ++++++++++++++++++++++++----------------\n>  1 file changed, 37 insertions(+), 25 deletions(-)\n> \n> diff --git a/include/libcamera/span.h b/include/libcamera/span.h\n> index c0e439923933..b0dec77c6b1b 100644\n> --- a/include/libcamera/span.h\n> +++ b/include/libcamera/span.h\n> @@ -113,12 +113,12 @@ public:\n>  \t{\n>  \t}\n>  \n> -\tconstexpr Span(pointer ptr, [[maybe_unused]] size_type count)\n> +\texplicit constexpr Span(pointer ptr, [[maybe_unused]] size_type count)\n>  \t\t: data_(ptr)\n>  \t{\n>  \t}\n>  \n> -\tconstexpr Span(pointer first, [[maybe_unused]] pointer last)\n> +\texplicit constexpr Span(pointer first, [[maybe_unused]] pointer last)\n>  \t\t: data_(first)\n>  \t{\n>  \t}\n> @@ -154,7 +154,7 @@ public:\n>  \t}\n>  \n>  \ttemplate<class Container>\n> -\tconstexpr Span(Container &cont,\n> +\texplicit constexpr 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> @@ -166,23 +166,23 @@ public:\n>  \t}\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\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\tstd::nullptr_t> = nullptr)\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::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont))\n>  \t{\n>  \t\tstatic_assert(utils::size(cont) == Extent, \"Size mismatch\");\n>  \t}\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\t\t\tN == Extent,\n> -\t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\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\t\t\t N == Extent,\n> +\t\t\t\t\t\t std::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(s.data())\n>  \t{\n>  \t}\n> @@ -212,24 +212,24 @@ public:\n>  \tconstexpr Span<element_type, Count> first() const\n>  \t{\n>  \t\tstatic_assert(Count <= Extent, \"Count larger than size\");\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, Count>{ data(), Count };\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent> first(std::size_t Count) const\n>  \t{\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data(), Count };\n>  \t}\n>  \n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> last() const\n>  \t{\n>  \t\tstatic_assert(Count <= Extent, \"Count larger than size\");\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, Count>{ data() + size() - Count, Count };\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent> last(std::size_t Count) const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data() + size() - Count, Count };\n>  \t}\n>  \n>  \ttemplate<std::size_t Offset, std::size_t Count = dynamic_extent>\n> @@ -238,13 +238,19 @@ public:\n>  \t\tstatic_assert(Offset <= Extent, \"Offset larger than size\");\n>  \t\tstatic_assert(Count == dynamic_extent || Count + Offset <= Extent,\n>  \t\t\t      \"Offset + Count larger than size\");\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, Count != dynamic_extent ? Count : Extent - Offset>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent>\n>  \tsubspan(std::size_t Offset, std::size_t Count = dynamic_extent) const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, dynamic_extent>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>  \n>  private:\n> @@ -371,7 +377,7 @@ public:\n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> first() const\n>  \t{\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, Count>{ data(), Count };\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent> first(std::size_t Count) const\n> @@ -382,24 +388,30 @@ public:\n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> last() const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, Count>{ data() + size() - Count, Count };\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent> last(std::size_t Count) const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data() + size() - Count, Count };\n>  \t}\n>  \n>  \ttemplate<std::size_t Offset, std::size_t Count = dynamic_extent>\n>  \tconstexpr Span<element_type, Count> subspan() const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, Count>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>  \n>  \tconstexpr Span<element_type, dynamic_extent>\n>  \tsubspan(std::size_t Offset, std::size_t Count = dynamic_extent) const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, dynamic_extent>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>  \n>  private:\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 8FDD1C3B5C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSun, 25 Oct 2020 08:06:01 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F2D5261DD3;\n\tSun, 25 Oct 2020 09:06:00 +0100 (CET)","from mail-lf1-x143.google.com (mail-lf1-x143.google.com\n\t[IPv6:2a00:1450:4864:20::143])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 987776034E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 25 Oct 2020 09:05:58 +0100 (CET)","by mail-lf1-x143.google.com with SMTP id v6so7733649lfa.13\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 25 Oct 2020 01:05:58 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\tr1sm754186lji.85.2020.10.25.01.05.56\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSun, 25 Oct 2020 01:05:56 -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=\"UX3zq21O\"; 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=xCUU4t5sww4ykIxZOVMygZxHCS6YXEh6glMMauRGv2g=;\n\tb=UX3zq21OdLV673LbvzU3j/yY3mo/fxdo230KOBAbv3w15Z2e48PuclPAgK0Sim1PsR\n\t9c11b8WIQ0NPdXdX6rjJEBTkaQytzAZjfUTRnjDiecZuOIJKSsuLisFDhJ1bAXlP57Y8\n\tj6ZPs0cdTesyitYQFvMHIhiD+iZk4rmjeYaeMKRc+zYXetZfi9+UmqsI7ecbA5KVpLIR\n\t0G6UKwoijGEWCfgtXB04JehIDFekjJ2RLWBWPw94GSB3cYMT/VBM5UXMIlBPbGJwpaa2\n\tT+zH3Jz+swCANuUIIbVtntFIrsfPwBmx+yEuswpyyC4x9zl8A990U6o8f2q2nRBdBszy\n\t7YDw==","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=xCUU4t5sww4ykIxZOVMygZxHCS6YXEh6glMMauRGv2g=;\n\tb=I5b0FFBLJKsBhl8tTKgrQdYHQKKEKPGcK2XKqihRK4AooHwTmiG/SOPFRhDmV7bK1G\n\tsiHKdnGhfI3fGxUlqQBdh6md9uUxuDyoIQm51PoThFrTXVvc7LbVWKfFmsZ1erplxMwT\n\tVgjNT412FrbYu8SDZK9SNrOt7rwmuuMUlM7KiM2MCMb2Jjr/I/+x4hur9tCa88Kucw2H\n\t6BBsEFut9pCoGrhFKb9DN1aBflY2nNChVFG5olh+ZvyOplMjVNzjUpmbOUZGSgJOdcLN\n\tsVvJUjkpEPBcvs6TZjxRimqMEF/XJbqoYUiMVzS07G2c+CwEONiezO/6EKrMifd4iM08\n\thjJQ==","X-Gm-Message-State":"AOAM533ouXaVKRZ243RttUZnjIL5VSFPi+9YEI5Xcc3aGGqg6UQfYPSj\n\t/kDgudRDLI6/E5EIs/xZasaDvzENOY74ZQ==","X-Google-Smtp-Source":"ABdhPJzkuZSmZRf8Lzh4+L151OpBpV8/TpWrOmqiHeAF5/rheRAqL6eRVqbXUnIg24TkYEMcyQlz+Q==","X-Received":"by 2002:a19:c142:: with SMTP id\n\tr63mr2921750lff.234.1603613157715; \n\tSun, 25 Oct 2020 01:05:57 -0700 (PDT)","Date":"Sun, 25 Oct 2020 09:05:55 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20201025080555.GA2940768@oden.dyn.berto.se>","References":"<20201024171225.14483-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201024171225.14483-1-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH] libcamera: span: Make constructors\n\texplicit as required by C++20","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>"}},{"id":13488,"web_url":"https://patchwork.libcamera.org/comment/13488/","msgid":"<20201026172719.mqz3riuova7khtbj@uno.localdomain>","date":"2020-10-26T17:27:19","subject":"Re: [libcamera-devel] [PATCH] libcamera: span: Make constructors\n\texplicit as required by C++20","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 24, 2020 at 08:12:25PM +0300, Laurent Pinchart wrote:\n> The C++20 std::span class, after which Span is modelled, specifies four\n> constructors as explicit when extent is not dynamic_extent. Align our\n> implementation with those requirements.\n>\n> A careful reviewer may notice that this change addresses five\n> constructors, not four. The reason is that the two constructors taking\n> Container and const Container parameters are not specified in C++20,\n> which uses a single constructor taking a range parameter instead. As\n> ranges are not available in C++17, the Container constructors are our\n> best effort at providing a similar feature.\n>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/span.h | 62 ++++++++++++++++++++++++----------------\n>  1 file changed, 37 insertions(+), 25 deletions(-)\n>\n> diff --git a/include/libcamera/span.h b/include/libcamera/span.h\n> index c0e439923933..b0dec77c6b1b 100644\n> --- a/include/libcamera/span.h\n> +++ b/include/libcamera/span.h\n> @@ -113,12 +113,12 @@ public:\n>  \t{\n>  \t}\n>\n> -\tconstexpr Span(pointer ptr, [[maybe_unused]] size_type count)\n> +\texplicit constexpr Span(pointer ptr, [[maybe_unused]] size_type count)\n>  \t\t: data_(ptr)\n>  \t{\n>  \t}\n>\n> -\tconstexpr Span(pointer first, [[maybe_unused]] pointer last)\n> +\texplicit constexpr Span(pointer first, [[maybe_unused]] pointer last)\n>  \t\t: data_(first)\n>  \t{\n>  \t}\n> @@ -154,7 +154,7 @@ public:\n>  \t}\n>\n>  \ttemplate<class Container>\n> -\tconstexpr Span(Container &cont,\n> +\texplicit constexpr Span(Container &cont,\n>  \t\t       std::enable_if_t<!details::is_span<Container>::value &&\n\nDoes indentation need to be adjusted ?\n\n>  \t\t\t\t\t!details::is_array<Container>::value &&\n>  \t\t\t\t\t!std::is_array<Container>::value &&\n> @@ -166,23 +166,23 @@ public:\n>  \t}\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\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\tstd::nullptr_t> = nullptr)\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::nullptr_t> = nullptr)\n>  \t\t: data_(utils::data(cont))\n>  \t{\n>  \t\tstatic_assert(utils::size(cont) == Extent, \"Size mismatch\");\n>  \t}\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\t\t\tN == Extent,\n> -\t\t\t\t\tstd::nullptr_t> = nullptr) noexcept\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\t\t\t N == Extent,\n> +\t\t\t\t\t\t std::nullptr_t> = nullptr) noexcept\n>  \t\t: data_(s.data())\n>  \t{\n>  \t}\n> @@ -212,24 +212,24 @@ public:\n>  \tconstexpr Span<element_type, Count> first() const\n>  \t{\n>  \t\tstatic_assert(Count <= Extent, \"Count larger than size\");\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, Count>{ data(), Count };\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent> first(std::size_t Count) const\n>  \t{\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data(), Count };\n>  \t}\n>\n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> last() const\n>  \t{\n>  \t\tstatic_assert(Count <= Extent, \"Count larger than size\");\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, Count>{ data() + size() - Count, Count };\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent> last(std::size_t Count) const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data() + size() - Count, Count };\n>  \t}\n>\n>  \ttemplate<std::size_t Offset, std::size_t Count = dynamic_extent>\n> @@ -238,13 +238,19 @@ public:\n>  \t\tstatic_assert(Offset <= Extent, \"Offset larger than size\");\n>  \t\tstatic_assert(Count == dynamic_extent || Count + Offset <= Extent,\n>  \t\t\t      \"Offset + Count larger than size\");\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, Count != dynamic_extent ? Count : Extent - Offset>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n\nTemplates arguments specified with ternary operator.. C++ is amazing\n\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent>\n>  \tsubspan(std::size_t Offset, std::size_t Count = dynamic_extent) const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, dynamic_extent>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>\n>  private:\n> @@ -371,7 +377,7 @@ public:\n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> first() const\n>  \t{\n> -\t\treturn { data(), Count };\n> +\t\treturn Span<element_type, Count>{ data(), Count };\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent> first(std::size_t Count) const\n> @@ -382,24 +388,30 @@ public:\n>  \ttemplate<std::size_t Count>\n>  \tconstexpr Span<element_type, Count> last() const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, Count>{ data() + size() - Count, Count };\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent> last(std::size_t Count) const\n>  \t{\n> -\t\treturn { data() + size() - Count, Count };\n> +\t\treturn Span<element_type, dynamic_extent>{ data() + size() - Count, Count };\n>  \t}\n>\n>  \ttemplate<std::size_t Offset, std::size_t Count = dynamic_extent>\n>  \tconstexpr Span<element_type, Count> subspan() const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, Count>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n>  \t}\n>\n>  \tconstexpr Span<element_type, dynamic_extent>\n>  \tsubspan(std::size_t Offset, std::size_t Count = dynamic_extent) const\n>  \t{\n> -\t\treturn { data() + Offset, Count == dynamic_extent ? size() - Offset : Count };\n> +\t\treturn Span<element_type, dynamic_extent>{\n> +\t\t\tdata() + Offset,\n> +\t\t\tCount == dynamic_extent ? size() - Offset : Count\n> +\t\t};\n\nLooks good!\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n>  \t}\n>\n>  private:\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 AF312C3B5C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 26 Oct 2020 17:27:23 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 12C3962038;\n\tMon, 26 Oct 2020 18:27:23 +0100 (CET)","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 612A760361\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 26 Oct 2020 18:27:21 +0100 (CET)","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 D886BC0005;\n\tMon, 26 Oct 2020 17:27:20 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Mon, 26 Oct 2020 18:27:19 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Message-ID":"<20201026172719.mqz3riuova7khtbj@uno.localdomain>","References":"<20201024171225.14483-1-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201024171225.14483-1-laurent.pinchart@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH] libcamera: span: Make constructors\n\texplicit as required by C++20","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=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]