libstdc++: Implement std::emit_on_flush etc.
authorJonathan Wakely <jwakely@redhat.com>
Wed, 11 Nov 2020 00:19:40 +0000 (00:19 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 11 Nov 2020 00:19:40 +0000 (00:19 +0000)
commitecba8547dd398ad4b627756013dbd22be417d4da
tree65a7f03392ebd8f552b663b03889f30f6b491a60
parentbb6226419f566bb9f68d9f2dc7d3aca501efaa98
libstdc++: Implement std::emit_on_flush etc.

This adds the manipulators for use with basic_osyncstream. In order to
detect when an arbitrary basic_ostream<C,T> is the base class of a
basic_syncbuf<C,T,A> object, introduce a new intermediate base class
that stores the data members. The new base class stores a pointer and
two bools, which wastes (sizeof(void*) - 2) bytes of padding. It would
be possible to use the two least significant bits of the pointer for the
two bools, at least for targets where alignof(basic_streambuf) > 2, but
that's left as a possible change for a future date.

Also define basic_syncbuf::overflow to override the virtual function in
the base class, so that single characters can be inserted into the
stream buffer. Previously the default basic_streambuf::overflow
implementation was used, which drops the character on the floor.

libstdc++-v3/ChangeLog:

* include/std/ostream (__syncbuf_base): New class template.
(emit_on_flush, noemit_on_flush, flush_emit): New manipulators.
* include/std/syncstream (basic_syncbuf): Derive from
__syncbuf_base instead of basic_streambuf.
(basic_syncbuf::operator=): Remove self-assignment check.
(basic_syncbuf::swap): Remove self-swap check.
(basic_syncbuf::emit): Do not skip pubsync() call if sequence
is empty.
(basic_syncbuf::sync): Remove no-op pubsync on stringbuf.
(basic_syncbuf::overflow): Define override.
* testsuite/27_io/basic_syncstream/basic_ops/1.cc: Test
basic_osyncstream::put(char_type).
* testsuite/27_io/basic_ostream/emit/1.cc: New test.
libstdc++-v3/include/std/ostream
libstdc++-v3/include/std/syncstream
libstdc++-v3/testsuite/27_io/basic_ostream/emit/1.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/basic_syncstream/basic_ops/1.cc