pw_stream: Add a ReaderWriter base class
Add a `class ReaderWriter` base class that combines interfaces of
pw::stream::Reader/Writer.
Change-Id: I20a8d506523483bb9c61f3990ffea2b79a1c1a3c
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/48462
Commit-Queue: Yecheng Zhao <zyecheng@google.com>
Reviewed-by: David Rogers <davidrogers@google.com>
Reviewed-by: Ali Zhang <alizhang@google.com>
diff --git a/pw_stream/docs.rst b/pw_stream/docs.rst
index 2fcd644..749cdcd 100644
--- a/pw_stream/docs.rst
+++ b/pw_stream/docs.rst
@@ -52,6 +52,10 @@
implementation. Note that ``Read()`` itself is **not** virtual, and should not
be overridden.
+pw::stream::ReaderWriter
+-------------------------
+The class simply combines the interfaces of pw::stream::Reader/Writer.
+
pw::stream::MemoryWriter
------------------------
The ``MemoryWriter`` class implements the ``Writer`` interface by backing the
@@ -69,6 +73,10 @@
The ``NullWriter`` class implements the ``Writer`` interface by dropping all
requested data writes, similar to ``/dev/null``.
+pw::stream::NullReaderWriter
+-----------------------------
+The class simply combines pw::stream::NullReader/NullWriter.
+
Why use pw_stream?
==================
diff --git a/pw_stream/public/pw_stream/null_stream.h b/pw_stream/public/pw_stream/null_stream.h
index b3db9c5..51ce2f5 100644
--- a/pw_stream/public/pw_stream/null_stream.h
+++ b/pw_stream/public/pw_stream/null_stream.h
@@ -36,4 +36,21 @@
StatusWithSize DoRead(ByteSpan) final { return StatusWithSize::OutOfRange(); }
};
+// Stream reader/writer that combines NullWriter and NullReader.
+class NullReaderWriter final : public ReaderWriter {
+ private:
+ NullWriter null_writer_;
+ NullReader null_reader_;
+
+ Status DoWrite(ConstByteSpan data) final { return null_writer_.Write(data); }
+
+ StatusWithSize DoRead(ByteSpan dest) final {
+ auto res = null_reader_.Read(dest);
+ if (!res.ok()) {
+ return StatusWithSize(res.status(), 0);
+ }
+ return StatusWithSize(res.value().size());
+ }
+};
+
} // namespace pw::stream
diff --git a/pw_stream/public/pw_stream/socket_stream.h b/pw_stream/public/pw_stream/socket_stream.h
index 1ab1161..7759d6e 100644
--- a/pw_stream/public/pw_stream/socket_stream.h
+++ b/pw_stream/public/pw_stream/socket_stream.h
@@ -31,7 +31,7 @@
static constexpr int kExitCode = -1;
static constexpr int kInvalidFd = -1;
-class SocketStream : public Writer, public Reader {
+class SocketStream : public ReaderWriter {
public:
explicit SocketStream() {}
~SocketStream();
diff --git a/pw_stream/public/pw_stream/stream.h b/pw_stream/public/pw_stream/stream.h
index 7014203..97fe069 100644
--- a/pw_stream/public/pw_stream/stream.h
+++ b/pw_stream/public/pw_stream/stream.h
@@ -144,4 +144,8 @@
virtual StatusWithSize DoRead(ByteSpan dest) = 0;
};
+// A general-purpose ReaderWriter class that combines interfaces of Reader and
+// Writer.
+class ReaderWriter : public Writer, public Reader {};
+
} // namespace pw::stream
diff --git a/pw_stream/stream_test.cc b/pw_stream/stream_test.cc
index fad335a..97f6e1d 100644
--- a/pw_stream/stream_test.cc
+++ b/pw_stream/stream_test.cc
@@ -33,5 +33,12 @@
EXPECT_EQ(stream.ConservativeReadLimit(), std::numeric_limits<size_t>::max());
}
+TEST(Stream, DefaultConservativeReadWriteLimit) {
+ NullReaderWriter stream;
+ EXPECT_EQ(stream.ConservativeWriteLimit(),
+ std::numeric_limits<size_t>::max());
+ EXPECT_EQ(stream.ConservativeReadLimit(), std::numeric_limits<size_t>::max());
+}
+
} // namespace
} // namespace pw::stream