On Fri, 15 Dec 2023 at 14:49, Tim Song <t.canens....@gmail.com> wrote: > > > > On Fri, Dec 15, 2023 at 4:43 AM Jonathan Wakely <jwak...@redhat.com> wrote: >> >> On Fri, 15 Dec 2023 at 01:17, Tim Song wrote: >> > >> > On Thu, Dec 14, 2023 at 6:05 PM Jonathan Wakely <jwak...@redhat.com> wrote: >> >> + inline void >> >> + vprint_unicode(ostream& __os, string_view __fmt, format_args __args) >> >> + { >> >> + ostream::sentry __cerb(__os); >> >> + if (__cerb) >> >> + { >> >> + >> >> + const streamsize __w = __os.width(); >> >> + const bool __left >> >> + = (__os.flags() & ios_base::adjustfield) == ios_base::left; >> > >> > >> > I'm pretty sure - when I wrote this wording anyway - that the intent was >> > that it was just an unformatted write at the end. The wording in >> > [ostream.formatted.print] doesn't use the "determines padding" words of >> > power that would invoke [ostream.formatted.reqmts]/3. >> >> Ah, OK. I misunderstood "formatted output function" as implying >> padding, failing to notice that we need those words of power to be >> present. My thinking was that if the stream has padding set in its >> format flags, it could be surprising if they're ignored by a formatted >> output function. And padding in the format string applies to >> individual replacement fields, not the whole string, and it's hard to >> use the stream's fill character and alignment. > > > But we would get none of the Unicode-aware padding logic we > do in format, which puts it in a very weird place. > > And for cases where Unicode is not a problem, it's easy to get padding > with just os << std::format(...);
Yes, good point. >> >> You can do this to use the ostream's width: >> >> std::print("{0:{1}}", std::format(...), os.width()); >> >> But to reuse its fill char and adjustfield you need to do something >> awful like I did in the committed code: >> >> std::string_view align; >> if (os.flags() & ios::adjustfield) == ios::right) >> align = ">" >> auto fs = std::format("{{:{}{}{}}}", os.fill(), align, os.width()); >> std::vprint_nonunicode(os, fs, std::make_args(std::format(...))); >> >> >> And now you have to hardcode a choice between vprint_unicode and >> vprint_nonunicode, instead of letting std::print decide it. Let's hope >> nobody ever needs to do any of that ;-) > > > At least the upcoming runtime_format alleviates that :) Right, that's on my list to implement "soon"! >> >> >> I'll remove the code for padding the padding, thanks for checking the patch. >>