io/Reader: use std::span
This commit is contained in:
@@ -26,7 +26,7 @@ BufferedReader::Fill(bool need_more)
|
||||
assert(!w.empty());
|
||||
}
|
||||
|
||||
std::size_t nbytes = reader.Read(w.data(), w.size());
|
||||
std::size_t nbytes = reader.Read(w);
|
||||
if (nbytes == 0) {
|
||||
eof = true;
|
||||
return !need_more;
|
||||
@@ -95,9 +95,9 @@ BufferedReader::ReadLine()
|
||||
}
|
||||
|
||||
/* terminate the last line */
|
||||
w[0] = 0;
|
||||
w[0] = {};
|
||||
|
||||
char *line = buffer.Read().data();
|
||||
char *line = reinterpret_cast<char *>(buffer.Read().data());
|
||||
buffer.Clear();
|
||||
++line_number;
|
||||
return line;
|
||||
|
@@ -15,7 +15,7 @@ class BufferedReader {
|
||||
|
||||
Reader &reader;
|
||||
|
||||
DynamicFifoBuffer<char> buffer;
|
||||
DynamicFifoBuffer<std::byte> buffer;
|
||||
|
||||
bool eof = false;
|
||||
|
||||
|
@@ -30,12 +30,12 @@ FileReader::GetFileInfo() const
|
||||
}
|
||||
|
||||
std::size_t
|
||||
FileReader::Read(void *data, std::size_t size)
|
||||
FileReader::Read(std::span<std::byte> dest)
|
||||
{
|
||||
assert(IsDefined());
|
||||
|
||||
DWORD nbytes;
|
||||
if (!ReadFile(handle, data, size, &nbytes, nullptr))
|
||||
if (!ReadFile(handle, dest.data(), dest.size(), &nbytes, nullptr))
|
||||
throw FmtLastError("Failed to read from {}", path);
|
||||
|
||||
return nbytes;
|
||||
@@ -82,11 +82,11 @@ FileReader::GetFileInfo() const
|
||||
}
|
||||
|
||||
std::size_t
|
||||
FileReader::Read(void *data, std::size_t size)
|
||||
FileReader::Read(std::span<std::byte> dest)
|
||||
{
|
||||
assert(IsDefined());
|
||||
|
||||
ssize_t nbytes = fd.Read(data, size);
|
||||
ssize_t nbytes = fd.Read(dest);
|
||||
if (nbytes < 0)
|
||||
throw FmtErrno("Failed to read from {}", path);
|
||||
|
||||
|
@@ -100,5 +100,5 @@ public:
|
||||
void Skip(off_t offset);
|
||||
|
||||
/* virtual methods from class Reader */
|
||||
std::size_t Read(void *data, std::size_t size) override;
|
||||
std::size_t Read(std::span<std::byte> dest) override;
|
||||
};
|
||||
|
@@ -17,8 +17,7 @@ PeekReader::Peek(size_t size)
|
||||
assert(buffer_position == 0);
|
||||
|
||||
do {
|
||||
size_t nbytes = next.Read(buffer + buffer_size,
|
||||
size - buffer_size);
|
||||
size_t nbytes = next.Read(std::span{buffer}.first(buffer_size).subspan(size));
|
||||
if (nbytes == 0)
|
||||
return nullptr;
|
||||
|
||||
@@ -29,15 +28,17 @@ PeekReader::Peek(size_t size)
|
||||
}
|
||||
|
||||
size_t
|
||||
PeekReader::Read(void *data, size_t size)
|
||||
PeekReader::Read(std::span<std::byte> dest)
|
||||
{
|
||||
size_t buffer_remaining = buffer_size - buffer_position;
|
||||
if (buffer_remaining > 0) {
|
||||
size_t nbytes = std::min(buffer_remaining, size);
|
||||
memcpy(data, buffer + buffer_position, nbytes);
|
||||
buffer_position += nbytes;
|
||||
return nbytes;
|
||||
auto src = std::span{buffer}.first(buffer_size).subspan(buffer_position);
|
||||
if (!src.empty()) {
|
||||
if (dest.size() < src.size())
|
||||
src = src.first(dest.size());
|
||||
|
||||
std::copy(src.begin(), src.end(), dest.begin());
|
||||
buffer_position += src.size();
|
||||
return src.size();
|
||||
}
|
||||
|
||||
return next.Read(data, size);
|
||||
return next.Read(dest);
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ class PeekReader final : public Reader {
|
||||
|
||||
size_t buffer_size = 0, buffer_position = 0;
|
||||
|
||||
uint8_t buffer[64];
|
||||
std::byte buffer[64];
|
||||
|
||||
public:
|
||||
explicit PeekReader(Reader &_next)
|
||||
@@ -27,7 +27,7 @@ public:
|
||||
const void *Peek(size_t size);
|
||||
|
||||
/* virtual methods from class Reader */
|
||||
size_t Read(void *data, size_t size) override;
|
||||
size_t Read(std::span<std::byte> dest) override;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -5,6 +5,7 @@
|
||||
#define READER_HXX
|
||||
|
||||
#include <cstddef>
|
||||
#include <span>
|
||||
#include <type_traits>
|
||||
|
||||
/**
|
||||
@@ -25,14 +26,13 @@ public:
|
||||
* @return the number of bytes read into the given buffer or 0
|
||||
* on end-of-stream
|
||||
*/
|
||||
[[gnu::nonnull]]
|
||||
virtual std::size_t Read(void *data, std::size_t size) = 0;
|
||||
virtual std::size_t Read(std::span<std::byte> dest) = 0;
|
||||
|
||||
template<typename T>
|
||||
requires std::is_standard_layout_v<T> && std::is_trivially_copyable_v<T>
|
||||
void ReadT(T &dest) {
|
||||
// TODO check return value
|
||||
Read(&dest, sizeof(dest));
|
||||
Read(std::as_writable_bytes(std::span{&dest, 1}));
|
||||
}
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user