C++ Logo

sg16

Advanced search

Re: [isocpp-lib-ext] LEWG(I) Weekly review - P2549R0: Should the output of std::print to a terminal be synchronized with the underlying stream?

From: Jens Maurer <Jens.Maurer_at_[hidden]>
Date: Tue, 29 Mar 2022 09:11:44 +0200
On 28/03/2022 23.18, Tim Song via Lib-Ext wrote:
> As the paper mentioned, I brought this up during the LWG review, so it should be unsurprising that I think this should be synchronized at least for ostreams.

> In one of our codebases, where formatting started with iostreams and gradually shifted to {fmt}, there are lots of code of the form:
>
> struct A {
> int a; int b;
> friend std::ostream& operator<<(std::ostream& os, A const& a) {
> fmt::print(os, "{{a={}, b={}}}", a.a, a.b);
> return os;
> }
> };

If using an explicit std::ostream argument, the output to that stream
should certainly be synchronized with the other uses of that same stream.

Jens


> This seems like a perfectly valid way to implement operator<< to me - except that it doesn't work if fmt::print (and now std::print) can sometimes bypass things in os's buffer. With iostreams in particular, << naturally encourages writing partial lines:
>
> A a{2, 4};
> std::cout << "A is " << a << '\n'; // might print "{a=2, b=4}A is "
>
> And having this only happen when writing to a terminal means that it's going to be hard to catch in tests - normally those tests would format something into a buffer and compare with the expected output, which won't engage the reordering case.
>
>
> On Mon, Mar 28, 2022 at 12:11 PM Inbal Levi via Lib-Ext <lib-ext_at_[hidden] <mailto:lib-ext_at_[hidden]>> wrote:
>
> * Correction to the title - paper is *P2539*
>
> On Mon, 28 Mar 2022 at 20:09, Inbal Levi <sinbal2l_at_[hidden] <mailto:sinbal2l_at_[hidden]>> wrote:
>
> Hello all,
> Today we have a paper in a bit of a different format (😉) -
> this is an *Info* paper, which the fmt library author wrote to notify LEWG of the current behaviour.
> Currently there's *no action* suggested in the paper, but we would like* *the author to *get an indication on the amount of support for the status quo, as well as **whether a change is needed.*
>
> P2539R0: Should the output of std::print to a terminal be synchronized with the underlying stream? (wg21.link/P2539 <http://wg21.link/P2539>)
> by: Victor Zverovich
>
> *** *
> From the Discussion:*
> To prevent mojibake |std::print| may use a native Unicode API when writing to a terminal bypassing the stream buffer. During the review of [P2093] <http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2022/p2539r0.html#biblio-p2093> "Formatted output" Tim Song suggested that synchronizing |std::print| with the underlying stream may be beneficial for gradual adoption.
> *
> *
> *Some meta data:*
>
> * *Bottom Line: *Neither {fmt} ([FMT]) nor Rust ([RUST-STDIO]) do such synchronization in their implementations of |print|.
> * To indicate your opinion on whether a change is needed (reasoning is, of course, welcome):
> o If you support the status quo (no change): please response with *"No Change"*
> o If you think a change is needed (synchronize the output with the underlying steam): please response* "+1"*
>
> ***
> *
> Weekly reviews improve quality!*
> Running weekly reviews allows more iterations on each proposal, which hopefully, in turn, will result in more accurate and subtle fixes.
>
> Thank you for taking the time to review the proposal,
> and have a great week!
>
> Inbal Levi
>
> _______________________________________________
> Lib-Ext mailing list
> Lib-Ext_at_[hidden] <mailto:Lib-Ext_at_[hidden]>
> Subscription: https://lists.isocpp.org/mailman/listinfo.cgi/lib-ext <https://lists.isocpp.org/mailman/listinfo.cgi/lib-ext>
> Link to this post: http://lists.isocpp.org/lib-ext/2022/03/22839.php <http://lists.isocpp.org/lib-ext/2022/03/22839.php>
>
>
> _______________________________________________
> Lib-Ext mailing list
> Lib-Ext_at_[hidden]
> Subscription: https://lists.isocpp.org/mailman/listinfo.cgi/lib-ext
> Link to this post: http://lists.isocpp.org/lib-ext/2022/03/22841.php

Received on 2022-03-29 07:11:49