mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-27 02:01:42 +00:00
raw_istream: Add std::istream style in_avail(). (#135)
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#ifndef WPIUTIL_SUPPORT_RAW_ISTREAM_H_
|
||||
#define WPIUTIL_SUPPORT_RAW_ISTREAM_H_
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
|
||||
namespace wpi {
|
||||
@@ -37,7 +38,15 @@ class raw_istream {
|
||||
return *this;
|
||||
}
|
||||
|
||||
std::size_t readsome(void* data, std::size_t len) {
|
||||
std::size_t readlen = std::min(in_avail(), len);
|
||||
if (readlen == 0) return 0;
|
||||
read_impl(data, readlen);
|
||||
return readlen;
|
||||
};
|
||||
|
||||
virtual void close() = 0;
|
||||
virtual std::size_t in_avail() const = 0;
|
||||
|
||||
bool has_error() const { return m_error; }
|
||||
void clear_error() { m_error = false; }
|
||||
@@ -58,6 +67,7 @@ class raw_mem_istream : public raw_istream {
|
||||
public:
|
||||
raw_mem_istream(const char* mem, std::size_t len) : m_cur(mem), m_left(len) {}
|
||||
void close() override;
|
||||
std::size_t in_avail() const override;
|
||||
|
||||
private:
|
||||
void read_impl(void* data, std::size_t len) override;
|
||||
@@ -71,6 +81,7 @@ class raw_fd_istream : public raw_istream {
|
||||
raw_fd_istream(int fd, bool shouldClose, std::size_t bufSize = 4096);
|
||||
~raw_fd_istream() override;
|
||||
void close() override;
|
||||
std::size_t in_avail() const override;
|
||||
|
||||
private:
|
||||
void read_impl(void* data, std::size_t len) override;
|
||||
|
||||
@@ -20,6 +20,7 @@ class raw_socket_istream : public raw_istream {
|
||||
: m_stream(stream), m_timeout(timeout) {}
|
||||
|
||||
void close() override;
|
||||
std::size_t in_avail() const override;
|
||||
|
||||
private:
|
||||
void read_impl(void* data, std::size_t len) override;
|
||||
|
||||
@@ -20,6 +20,8 @@ using namespace wpi;
|
||||
|
||||
void raw_mem_istream::close() {}
|
||||
|
||||
std::size_t raw_mem_istream::in_avail() const { return m_left; }
|
||||
|
||||
void raw_mem_istream::read_impl(void* data, std::size_t len) {
|
||||
if (len > m_left) {
|
||||
error_detected();
|
||||
@@ -47,6 +49,8 @@ void raw_fd_istream::close() {
|
||||
}
|
||||
}
|
||||
|
||||
std::size_t raw_fd_istream::in_avail() const { return m_end - m_cur; }
|
||||
|
||||
void raw_fd_istream::read_impl(void* data, std::size_t len) {
|
||||
std::size_t left = m_end - m_cur;
|
||||
if (left < len) {
|
||||
|
||||
@@ -27,3 +27,5 @@ void raw_socket_istream::read_impl(void* data, std::size_t len) {
|
||||
}
|
||||
|
||||
void raw_socket_istream::close() { m_stream.close(); }
|
||||
|
||||
std::size_t raw_socket_istream::in_avail() const { return 0; }
|
||||
|
||||
Reference in New Issue
Block a user