From d81840d6c69ff906bd7116baa1bf08a32dc2ba5c Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Fri, 21 Oct 2016 22:50:38 -0700 Subject: [PATCH] raw_istream: Add std::istream style in_avail(). (#135) --- wpiutil/include/support/raw_istream.h | 11 +++++++++++ wpiutil/include/support/raw_socket_istream.h | 1 + wpiutil/src/support/raw_istream.cpp | 4 ++++ wpiutil/src/support/raw_socket_istream.cpp | 2 ++ 4 files changed, 18 insertions(+) diff --git a/wpiutil/include/support/raw_istream.h b/wpiutil/include/support/raw_istream.h index 3c440df0b5..d9a9b9cd98 100644 --- a/wpiutil/include/support/raw_istream.h +++ b/wpiutil/include/support/raw_istream.h @@ -8,6 +8,7 @@ #ifndef WPIUTIL_SUPPORT_RAW_ISTREAM_H_ #define WPIUTIL_SUPPORT_RAW_ISTREAM_H_ +#include #include 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; diff --git a/wpiutil/include/support/raw_socket_istream.h b/wpiutil/include/support/raw_socket_istream.h index 1c1b01f5cb..475d3d041d 100644 --- a/wpiutil/include/support/raw_socket_istream.h +++ b/wpiutil/include/support/raw_socket_istream.h @@ -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; diff --git a/wpiutil/src/support/raw_istream.cpp b/wpiutil/src/support/raw_istream.cpp index e5155cac90..2863a61d60 100644 --- a/wpiutil/src/support/raw_istream.cpp +++ b/wpiutil/src/support/raw_istream.cpp @@ -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) { diff --git a/wpiutil/src/support/raw_socket_istream.cpp b/wpiutil/src/support/raw_socket_istream.cpp index 4d311b25b5..4f27dfb141 100644 --- a/wpiutil/src/support/raw_socket_istream.cpp +++ b/wpiutil/src/support/raw_socket_istream.cpp @@ -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; }