[{"id":22735,"web_url":"https://patchwork.libcamera.org/comment/22735/","msgid":"<Yl6z+Arud212FJQ1@pendragon.ideasonboard.com>","date":"2022-04-19T13:07:04","subject":"Re: [libcamera-devel] [PATCH v3 1/2] libcamera: Add operator<< for\n\tclasses in geometry","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Han-Lin,\n\nThank you for the patch.\n\nOn Tue, Apr 19, 2022 at 08:42:19PM +0800, Han-Lin Chen wrote:\n> Add operator<< for geometry classes for easier logging.\n> \n> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/geometry.h |  8 +++++\n>  src/libcamera/geometry.cpp   | 65 +++++++++++++++++++++++++++++++-----\n>  2 files changed, 65 insertions(+), 8 deletions(-)\n> \n> diff --git a/include/libcamera/geometry.h b/include/libcamera/geometry.h\n> index 7838b679..d4a144bc 100644\n> --- a/include/libcamera/geometry.h\n> +++ b/include/libcamera/geometry.h\n> @@ -46,6 +46,8 @@ static inline bool operator!=(const Point &lhs, const Point &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Point &p);\n> +\n>  class Size\n>  {\n>  public:\n> @@ -192,6 +194,8 @@ static inline bool operator>=(const Size &lhs, const Size &rhs)\n>  \treturn !(lhs < rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Size &s);\n> +\n>  class SizeRange\n>  {\n>  public:\n> @@ -232,6 +236,8 @@ static inline bool operator!=(const SizeRange &lhs, const SizeRange &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const SizeRange &sr);\n> +\n>  class Rectangle\n>  {\n>  public:\n> @@ -291,4 +297,6 @@ static inline bool operator!=(const Rectangle &lhs, const Rectangle &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Rectangle &r);\n> +\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp\n> index cb3c2de1..da08045e 100644\n> --- a/src/libcamera/geometry.cpp\n> +++ b/src/libcamera/geometry.cpp\n> @@ -56,8 +56,7 @@ namespace libcamera {\n>  const std::string Point::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << x << \",\" << y << \")\";\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -83,6 +82,18 @@ bool operator==(const Point &lhs, const Point &rhs)\n>   * \\return True if the two points are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Point into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] p The point\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Point &p)\n> +{\n> +\tout << \"(\" << p.x << \", \" << p.y << \")\";\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct Size\n>   * \\brief Describe a two-dimensional size\n> @@ -124,7 +135,10 @@ bool operator==(const Point &lhs, const Point &rhs)\n>   */\n>  const std::string Size::toString() const\n>  {\n> -\treturn std::to_string(width) + \"x\" + std::to_string(height);\n> +\tstd::stringstream ss;\n> +\tss << *this;\n> +\n> +\treturn ss.str();\n>  }\n>  \n>  /**\n> @@ -428,6 +442,18 @@ bool operator<(const Size &lhs, const Size &rhs)\n>   * \\sa bool operator<(const Size &lhs, const Size &rhs)\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Size into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] sr The size\n\ns/sr/s/\n\nI'll fix this when applying.\n\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Size &s)\n> +{\n> +\tout << s.width << \"x\" << s.height;\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct SizeRange\n>   * \\brief Describe a range of sizes\n> @@ -528,9 +554,7 @@ bool SizeRange::contains(const Size &size) const\n>  std::string SizeRange::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << min.toString() << \")-(\" << max.toString() << \")/(+\"\n> -\t   << hStep << \",+\" << vStep << \")\";\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -550,6 +574,20 @@ bool operator==(const SizeRange &lhs, const SizeRange &rhs)\n>   * \\return True if the two size ranges are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a SizeRange into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] sr The size range\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const SizeRange &sr)\n> +{\n> +\tout << \"(\" << sr.min << \")-(\" << sr.max << \")/(+\"\n> +\t    << sr.hStep << \",+\" << sr.vStep << \")\";\n> +\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct Rectangle\n>   * \\brief Describe a rectangle's position and dimensions\n> @@ -624,8 +662,7 @@ bool operator==(const SizeRange &lhs, const SizeRange &rhs)\n>  const std::string Rectangle::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << x << \"x\" << y << \")/\" << width << \"x\" << height;\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -796,4 +833,16 @@ bool operator==(const Rectangle &lhs, const Rectangle &rhs)\n>   * \\return True if the two rectangles are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Rectangle into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] r The rectangle\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Rectangle &r)\n> +{\n> +\tout << \"(\" << r.x << \"x\" << r.y << \")/\" << r.width << \"x\" << r.height;\n> +\treturn out;\n> +}\n> +\n>  } /* namespace libcamera */","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 08809C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 19 Apr 2022 13:07:05 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 577B665644;\n\tTue, 19 Apr 2022 15:07:04 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2576C6563C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 19 Apr 2022 15:07:03 +0200 (CEST)","from pendragon.ideasonboard.com (smb-adp01.hotspot.hub-one.net\n\t[94.199.126.50])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 9F85525B;\n\tTue, 19 Apr 2022 15:07:02 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1650373624;\n\tbh=WWm/Z4lyjlVphAsP4uruwlLbTCx2D/+4f6rKDN4NxIE=;\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=A2nWk3klbwkJ0z8OTEUgoaoYvGvAgh8X+HoIRhY4PBBLu3xET/8cHXCLnpl6jSGPx\n\tCmmgxg1ykPytIKYfWGzNY5jvMWSh00daZjTux2lHuz0Lw/lDDmvbNrOEANyEWtMPcx\n\tBBZnF/Ts2Sf5PlqptktY4/J2pEFQ/CEL7Zj8dvBbdnMGBr1fJdw00Mx7p0U40LTpZl\n\t+by71Rf/lEOEUj9s9mfoCHeCjHwYBxHwa0zBIaQi4y7UbLDF9XL9J1v84Fxz7QjSNs\n\tvJYLL98yN9iG6RqqWmvZa0hHKIQJqsiAxjo8WKYu5XINJLVCN7rokY3ETRqMzLJGyJ\n\tl6n8HBRVLbYLw==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1650373622;\n\tbh=WWm/Z4lyjlVphAsP4uruwlLbTCx2D/+4f6rKDN4NxIE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GoNHz3ecdNfMJ4VwJb6jZSANGLdJOvWg9uV2rg5fJI6MjFNbxlBwPCgRUz+WrgfsO\n\tJ9SheGiHAtQ/SEYwfnhp/SLwxfMTKXVxiiNOq2eSt+z1x/DavJANm2Bdg+GNTe9lkk\n\t9Gv0jZpOOW0qr+wKtbODP8l5JKPWk69WF6jjVpWM="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"GoNHz3ec\"; dkim-atps=neutral","Date":"Tue, 19 Apr 2022 16:07:04 +0300","To":"Han-Lin Chen <hanlinchen@chromium.org>","Message-ID":"<Yl6z+Arud212FJQ1@pendragon.ideasonboard.com>","References":"<20220419124220.1877877-1-hanlinchen@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20220419124220.1877877-1-hanlinchen@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v3 1/2] libcamera: Add operator<< for\n\tclasses in geometry","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":"Laurent Pinchart via libcamera-devel\n\t<libcamera-devel@lists.libcamera.org>","Reply-To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":22755,"web_url":"https://patchwork.libcamera.org/comment/22755/","msgid":"<20220420061149.GA3237525@pyrite.rasen.tech>","date":"2022-04-20T06:11:49","subject":"Re: [libcamera-devel] [PATCH v3 1/2] libcamera: Add operator<< for\n\tclasses in geometry","submitter":{"id":97,"url":"https://patchwork.libcamera.org/api/people/97/","name":"Nicolas Dufresne via libcamera-devel","email":"libcamera-devel@lists.libcamera.org"},"content":"Hi Han-Lin,\n\nThanks for the patch.\n\nOn Tue, Apr 19, 2022 at 08:42:19PM +0800, Han-Lin Chen via libcamera-devel wrote:\n> Add operator<< for geometry classes for easier logging.\n> \n> Signed-off-by: Han-Lin Chen <hanlinchen@chromium.org>\n> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/geometry.h |  8 +++++\n>  src/libcamera/geometry.cpp   | 65 +++++++++++++++++++++++++++++++-----\n>  2 files changed, 65 insertions(+), 8 deletions(-)\n> \n> diff --git a/include/libcamera/geometry.h b/include/libcamera/geometry.h\n> index 7838b679..d4a144bc 100644\n> --- a/include/libcamera/geometry.h\n> +++ b/include/libcamera/geometry.h\n> @@ -46,6 +46,8 @@ static inline bool operator!=(const Point &lhs, const Point &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Point &p);\n> +\n>  class Size\n>  {\n>  public:\n> @@ -192,6 +194,8 @@ static inline bool operator>=(const Size &lhs, const Size &rhs)\n>  \treturn !(lhs < rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Size &s);\n> +\n>  class SizeRange\n>  {\n>  public:\n> @@ -232,6 +236,8 @@ static inline bool operator!=(const SizeRange &lhs, const SizeRange &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const SizeRange &sr);\n> +\n>  class Rectangle\n>  {\n>  public:\n> @@ -291,4 +297,6 @@ static inline bool operator!=(const Rectangle &lhs, const Rectangle &rhs)\n>  \treturn !(lhs == rhs);\n>  }\n>  \n> +std::ostream &operator<<(std::ostream &out, const Rectangle &r);\n> +\n>  } /* namespace libcamera */\n> diff --git a/src/libcamera/geometry.cpp b/src/libcamera/geometry.cpp\n> index cb3c2de1..da08045e 100644\n> --- a/src/libcamera/geometry.cpp\n> +++ b/src/libcamera/geometry.cpp\n> @@ -56,8 +56,7 @@ namespace libcamera {\n>  const std::string Point::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << x << \",\" << y << \")\";\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -83,6 +82,18 @@ bool operator==(const Point &lhs, const Point &rhs)\n>   * \\return True if the two points are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Point into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] p The point\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Point &p)\n> +{\n> +\tout << \"(\" << p.x << \", \" << p.y << \")\";\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct Size\n>   * \\brief Describe a two-dimensional size\n> @@ -124,7 +135,10 @@ bool operator==(const Point &lhs, const Point &rhs)\n>   */\n>  const std::string Size::toString() const\n>  {\n> -\treturn std::to_string(width) + \"x\" + std::to_string(height);\n> +\tstd::stringstream ss;\n> +\tss << *this;\n> +\n> +\treturn ss.str();\n>  }\n>  \n>  /**\n> @@ -428,6 +442,18 @@ bool operator<(const Size &lhs, const Size &rhs)\n>   * \\sa bool operator<(const Size &lhs, const Size &rhs)\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Size into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] sr The size\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Size &s)\n> +{\n> +\tout << s.width << \"x\" << s.height;\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct SizeRange\n>   * \\brief Describe a range of sizes\n> @@ -528,9 +554,7 @@ bool SizeRange::contains(const Size &size) const\n>  std::string SizeRange::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << min.toString() << \")-(\" << max.toString() << \")/(+\"\n> -\t   << hStep << \",+\" << vStep << \")\";\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -550,6 +574,20 @@ bool operator==(const SizeRange &lhs, const SizeRange &rhs)\n>   * \\return True if the two size ranges are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a SizeRange into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] sr The size range\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const SizeRange &sr)\n> +{\n> +\tout << \"(\" << sr.min << \")-(\" << sr.max << \")/(+\"\n> +\t    << sr.hStep << \",+\" << sr.vStep << \")\";\n> +\n> +\treturn out;\n> +}\n> +\n>  /**\n>   * \\struct Rectangle\n>   * \\brief Describe a rectangle's position and dimensions\n> @@ -624,8 +662,7 @@ bool operator==(const SizeRange &lhs, const SizeRange &rhs)\n>  const std::string Rectangle::toString() const\n>  {\n>  \tstd::stringstream ss;\n> -\n> -\tss << \"(\" << x << \"x\" << y << \")/\" << width << \"x\" << height;\n> +\tss << *this;\n>  \n>  \treturn ss.str();\n>  }\n> @@ -796,4 +833,16 @@ bool operator==(const Rectangle &lhs, const Rectangle &rhs)\n>   * \\return True if the two rectangles are not equal, false otherwise\n>   */\n>  \n> +/**\n> + * \\brief Insert a text representation of a Rectangle into an output stream\n> + * \\param[in] out The output stream\n> + * \\param[in] r The rectangle\n> + * \\return The output stream \\a out\n> + */\n> +std::ostream &operator<<(std::ostream &out, const Rectangle &r)\n> +{\n> +\tout << \"(\" << r.x << \"x\" << r.y << \")/\" << r.width << \"x\" << r.height;\n> +\treturn out;\n> +}\n> +\n>  } /* namespace libcamera */\n> -- \n> 2.36.0.rc0.470.gd361397f0d-goog\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 44A32C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed, 20 Apr 2022 06:12:00 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5D8C265645;\n\tWed, 20 Apr 2022 08:11:59 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E82B6563F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 20 Apr 2022 08:11:58 +0200 (CEST)","from pyrite.rasen.tech (softbank114048062035.bbtec.net\n\t[114.48.62.35])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A0A7825B;\n\tWed, 20 Apr 2022 08:11:56 +0200 (CEST)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1650435119;\n\tbh=QB4qdm37egiMBhNZ5HelPi0OArXkLqrEaeflUuVa5sw=;\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=vg21XsvB3VG9kkZuDZsZ778Or7wzzK8cn9LEHNoQ8KaUpzVxZ7chbxsRXXkQzODGk\n\teLrA5tNIufQmEzKl251kLAMq4QM92MiCvsjsSqm7ZHbdkiD6gWNXNy1z7zqYY2gygZ\n\ty3M1vuxBk4bv4BOy1SpwRHyUsr72mzRJkGOPpZH8tM4blui3Sujnz9ERo+IbzpJ3On\n\tFLhiPZ6zMupAi2D6F+iPsffIirs9ZLRFB4skox1rXOW+3XmlC+yYmIM+xLJMgtKN1g\n\tVqB8kShiGDBtZAhlYRljEE6h5D/8Z0Yq7gboUqt9Dhmg3OhAW2Xh21Yv5w0wCUzfE0\n\tmf+PKUcEhRAeg==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1650435117;\n\tbh=QB4qdm37egiMBhNZ5HelPi0OArXkLqrEaeflUuVa5sw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=FL5pMb84mFvk2z9ZevbqnkTQdzDYLuNT7Kfc0SWa5IMcCj3WaQPTRlnPQuPHJjLuC\n\tkl4y2lFA4C+JjCoJTibqL4K0F1mxHQoenoFxsshJ1e3ShAm8nmGtoT8yfylk2S91G9\n\t0IJTsUvUPfc4TQ8meqUpw5S+KKC3CNXdFtfFS304="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"FL5pMb84\"; dkim-atps=neutral","Date":"Wed, 20 Apr 2022 15:11:49 +0900","To":"Han-Lin Chen <hanlinchen@chromium.org>","Message-ID":"<20220420061149.GA3237525@pyrite.rasen.tech>","References":"<20220419124220.1877877-1-hanlinchen@chromium.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20220419124220.1877877-1-hanlinchen@chromium.org>","Subject":"Re: [libcamera-devel] [PATCH v3 1/2] libcamera: Add operator<< for\n\tclasses in geometry","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":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"paul.elder@ideasonboard.com","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]