21#include "pw_assert/assert.h"
22#include "pw_bytes/span.h"
23#include "pw_result/result.h"
24#include "pw_span/span.h"
25#include "pw_status/status.h"
26#include "pw_status/status_with_size.h"
27#include "pw_toolchain/internal/sibling_cast.h"
66 static constexpr size_t kUnlimited = std::numeric_limits<size_t>::max();
75 constexpr bool readable()
const {
return readable_; }
79 constexpr bool writable()
const {
return writable_; }
83 constexpr bool seekable()
const {
return seekability_ != Seekability::kNone; }
87 return (
static_cast<uint8_t
>(seekability_) & origin) != 0u;
123 PW_DASSERT(dest.empty() || dest.data() !=
nullptr);
127 return dest.first(result.
size());
129 return result.status();
133 return Read(
span(
static_cast<std::byte*
>(dest), size_bytes));
144 while (!dest.empty()) {
145 auto result =
Read(dest);
147 return result.status();
149 const size_t bytes_read = result->size();
150 PW_DASSERT(bytes_read != 0);
151 dest = dest.subspan(bytes_read);
193 PW_DASSERT(data.empty() || data.data() !=
nullptr);
198 return Write(
span(
static_cast<const std::byte*
>(data), size_bytes));
223 return DoSeek(offset, origin);
260 enum class LimitType :
bool { kRead, kWrite };
266 friend class RelativeSeekableReader;
267 friend class SeekableReader;
268 friend class NonSeekableReader;
271 friend class RelativeSeekableWriter;
272 friend class SeekableWriter;
273 friend class NonSeekableWriter;
275 friend class ReaderWriter;
276 friend class RelativeSeekableReaderWriter;
277 friend class SeekableReaderWriter;
278 friend class NonSeekableReaderWriter;
284 enum class Seekability : uint8_t {
322 if (limit_type == LimitType::kRead) {
330 Seekability seekability_;
356 constexpr Reader(Seekability seekability)
357 :
Stream(
true,
false, seekability) {}
445 constexpr Writer(Seekability seekability)
446 :
Stream(
false,
true, seekability) {}
451 return StatusWithSize::Unimplemented();
535 Reader& as_reader() {
return internal::SiblingCast<Reader&, Stream>(*
this); }
536 const Reader& as_reader()
const {
537 return internal::SiblingCast<const Reader&, Stream>(*
this);
540 operator Reader&() {
return as_reader(); }
541 operator const Reader&()
const {
return as_reader(); }
544 Writer& as_writer() {
return internal::SiblingCast<Writer&, Stream>(*
this); }
545 const Writer& as_writer()
const {
546 return internal::SiblingCast<const Writer&, Stream>(*
this);
549 operator Writer&() {
return as_writer(); }
550 operator const Writer&()
const {
return as_writer(); }
557 :
Stream(
true,
true, seekability) {}
580 return internal::SiblingCast<RelativeSeekableReader&, Stream>(*
this);
583 return internal::SiblingCast<const RelativeSeekableReader&, Stream>(*
this);
586 return internal::SiblingCast<RelativeSeekableWriter&, Stream>(*
this);
589 return internal::SiblingCast<const RelativeSeekableWriter&, Stream>(*
this);
616 return internal::SiblingCast<SeekableReader&, Stream>(*
this);
619 return internal::SiblingCast<const SeekableReader&, Stream>(*
this);
623 operator const SeekableReader&()
const {
return as_seekable_reader(); }
627 return internal::SiblingCast<SeekableWriter&, Stream>(*
this);
630 return internal::SiblingCast<const SeekableWriter&, Stream>(*
this);
634 operator const SeekableWriter&()
const {
return as_seekable_writer(); }
656 return internal::SiblingCast<NonSeekableReader&, Stream>(*
this);
659 return internal::SiblingCast<const NonSeekableReader&, Stream>(*
this);
662 return internal::SiblingCast<NonSeekableWriter&, Stream>(*
this);
665 return internal::SiblingCast<const NonSeekableWriter&, Stream>(*
this);
Definition: status_with_size.h:49
constexpr bool ok() const
True if status() == OkStatus().
Definition: status_with_size.h:152
constexpr size_t size() const
Definition: status_with_size.h:146
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:420
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:674
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:511
Status DoWrite(ConstByteSpan) final
Virtual Write() function implemented by derived classes.
Definition: stream.h:361
virtual Status DoWrite(ConstByteSpan data)=0
Virtual Write() function implemented by derived classes.
Whence
Positions from which to seek.
Definition: stream.h:48
@ kCurrent
Definition: stream.h:58
@ kBeginning
Definition: stream.h:51
@ kEnd
Definition: stream.h:62
virtual StatusWithSize DoRead(ByteSpan destination)=0
Virtual Read() function implemented by derived classes.
Status Seek(ptrdiff_t offset, Whence origin=kBeginning)
Definition: stream.h:222
static constexpr size_t kUnlimited
Value returned from read/write limit if unlimited.
Definition: stream.h:66
constexpr bool seekable() const
Definition: stream.h:83
constexpr bool seekable(Whence origin) const
True if the stream supports seeking from the specified origin.
Definition: stream.h:86
virtual size_t ConservativeLimit(LimitType limit_type) const
Definition: stream.h:321
virtual Status DoSeek(ptrdiff_t offset, Whence origin)=0
Virtual Seek() function implemented by derived classes.
Status Write(ConstByteSpan data)
Definition: stream.h:192
constexpr bool readable() const
Definition: stream.h:75
size_t Tell()
Definition: stream.h:232
static constexpr size_t kUnknownPosition
Returned by Tell() if getting the position is not supported.
Definition: stream.h:69
size_t ConservativeWriteLimit() const
Definition: stream.h:254
Result< ByteSpan > ReadExact(ByteSpan const buffer)
Definition: stream.h:142
Result< ByteSpan > Read(void *dest, size_t size_bytes)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: stream.h:132
size_t ConservativeReadLimit() const
Definition: stream.h:242
virtual size_t DoTell()
Definition: stream.h:314
Result< ByteSpan > Read(ByteSpan dest)
Definition: stream.h:122
Status Write(const std::byte b)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: stream.h:201
constexpr bool writable() const
Definition: stream.h:79
Status Write(const void *data, size_t size_bytes)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: stream.h:197
StatusWithSize DoRead(ByteSpan) final
Virtual Read() function implemented by derived classes.
Definition: stream.h:450