stream: reuse converter R/W methods

Where we need to read from/write to m_source and immediately apply its
state to our converter, we already have methods for this.

Signed-off-by: Simon Rozman <simon@rozman.si>
This commit is contained in:
Simon Rozman 2023-10-09 09:55:52 +02:00
parent 47e63b1f32
commit 00b05092af

View File

@ -1013,7 +1013,9 @@ namespace stdex
}; };
/// ///
/// Modifies data on the fly when reading from/writing to a source stream /// Modifies data on the fly when reading from/writing to a source stream.
/// Could also be used to modify read/write boundaries like FIFO queues, async read/write,
/// buffering etc.
/// ///
class converter : public basic class converter : public basic
{ {
@ -1456,8 +1458,7 @@ namespace stdex
flush_write(); flush_write();
if (!ok()) _Unlikely_ if (!ok()) _Unlikely_
return 0; return 0;
m_source->write(nullptr, 0); converter::write(nullptr, 0);
m_state = m_source->state();
return 0; return 0;
} }
@ -1477,8 +1478,7 @@ namespace stdex
} }
size_t buffer_size = m_write_buffer.tail - m_write_buffer.head; size_t buffer_size = m_write_buffer.tail - m_write_buffer.head;
if (buffer_size) { if (buffer_size) {
m_write_buffer.head += m_source->write(m_write_buffer.data + m_write_buffer.head, buffer_size); m_write_buffer.head += converter::write(m_write_buffer.data + m_write_buffer.head, buffer_size);
m_state = m_source->state();
if (m_write_buffer.head == m_write_buffer.tail) if (m_write_buffer.head == m_write_buffer.tail)
m_write_buffer.head = m_write_buffer.tail = 0; m_write_buffer.head = m_write_buffer.tail = 0;
else else
@ -1486,8 +1486,7 @@ namespace stdex
} }
if (to_write > m_write_buffer.capacity) { if (to_write > m_write_buffer.capacity) {
// When needing to write more data than buffer capacity, bypass the buffer. // When needing to write more data than buffer capacity, bypass the buffer.
to_write -= m_source->write(data, to_write); to_write -= converter::write(data, to_write);
m_state = m_source->state();
return length - to_write; return length - to_write;
} }
} }
@ -1553,13 +1552,10 @@ namespace stdex
_Out_writes_bytes_to_opt_(length, return) void* data, _In_ size_t length) _Out_writes_bytes_to_opt_(length, return) void* data, _In_ size_t length)
{ {
size_t num_read; size_t num_read;
if (read_limit == fsize_max) { if (read_limit == fsize_max)
num_read = m_source->read(data, length); num_read = converter::read(data, length);
m_state = m_source->state();
}
else if (length <= read_limit) { else if (length <= read_limit) {
num_read = m_source->read(data, length); num_read = converter::read(data, length);
m_state = m_source->state();
read_limit -= num_read; read_limit -= num_read;
} }
else if (length && !read_limit) { else if (length && !read_limit) {
@ -1567,8 +1563,7 @@ namespace stdex
m_state = state_t::eof; m_state = state_t::eof;
} }
else { else {
num_read = m_source->read(data, static_cast<size_t>(read_limit)); num_read = converter::read(data, static_cast<size_t>(read_limit));
m_state = m_source->state();
read_limit -= num_read; read_limit -= num_read;
} }
return num_read; return num_read;
@ -1578,13 +1573,10 @@ namespace stdex
_In_reads_bytes_opt_(length) const void* data, _In_ size_t length) _In_reads_bytes_opt_(length) const void* data, _In_ size_t length)
{ {
size_t num_written; size_t num_written;
if (write_limit == fsize_max) { if (write_limit == fsize_max)
num_written = m_source->write(data, length); num_written = converter::write(data, length);
m_state = m_source->state();
}
else if (length <= write_limit) { else if (length <= write_limit) {
num_written = m_source->write(data, length); num_written = converter::write(data, length);
m_state = m_source->state();
write_limit -= num_written; write_limit -= num_written;
} }
else if (length && !write_limit) { else if (length && !write_limit) {
@ -1592,8 +1584,7 @@ namespace stdex
m_state = state_t::fail; m_state = state_t::fail;
} }
else { else {
num_written = m_source->write(data, static_cast<size_t>(write_limit)); num_written = converter::write(data, static_cast<size_t>(write_limit));
m_state = m_source->state();
write_limit -= num_written; write_limit -= num_written;
} }
return num_written; return num_written;
@ -1628,13 +1619,10 @@ namespace stdex
read_offset = 0; read_offset = 0;
} }
size_t num_read; size_t num_read;
if (read_limit == fsize_max) { if (read_limit == fsize_max)
num_read = m_source->read(data, length); num_read = converter::read(data, length);
m_state = m_source->state();
}
else if (length <= read_limit) { else if (length <= read_limit) {
num_read = m_source->read(data, length); num_read = converter::read(data, length);
m_state = m_source->state();
read_limit -= num_read; read_limit -= num_read;
} }
else if (length && !read_limit) { else if (length && !read_limit) {
@ -1643,8 +1631,7 @@ namespace stdex
m_state = state_t::eof; m_state = state_t::eof;
} }
else { else {
num_read = m_source->read(data, static_cast<size_t>(read_limit)); num_read = converter::read(data, static_cast<size_t>(read_limit));
m_state = m_source->state();
read_limit -= num_read; read_limit -= num_read;
} }
return num_read; return num_read;
@ -1667,13 +1654,10 @@ namespace stdex
} }
else else
num_skipped = 0; num_skipped = 0;
if (write_limit == fsize_max) { if (write_limit == fsize_max)
num_written = m_source->write(data, length); num_written = converter::write(data, length);
m_state = m_source->state();
}
else if (length <= write_limit) { else if (length <= write_limit) {
num_written = m_source->write(data, length); num_written = converter::write(data, length);
m_state = m_source->state();
write_limit -= num_written; write_limit -= num_written;
} }
else if (length && !write_limit) { else if (length && !write_limit) {
@ -1683,8 +1667,7 @@ namespace stdex
} }
else { else {
num_skipped += length - static_cast<size_t>(write_limit); num_skipped += length - static_cast<size_t>(write_limit);
num_written = m_source->write(data, static_cast<size_t>(write_limit)); num_written = converter::write(data, static_cast<size_t>(write_limit));
m_state = m_source->state();
write_limit -= num_written; write_limit -= num_written;
} }
return num_skipped + num_written; return num_skipped + num_written;