raw_istream: Add std::istream style in_avail(). (#135)

This commit is contained in:
Peter Johnson
2016-10-21 22:50:38 -07:00
committed by GitHub
parent 1d336996be
commit d81840d6c6
4 changed files with 18 additions and 0 deletions

View File

@@ -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;

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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; }