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;
114 PW_DASSERT(dest.empty() || dest.data() !=
nullptr);
118 return dest.first(result.
size());
120 return result.status();
124 return Read(
span(
static_cast<std::byte*
>(dest), size_bytes));
135 while (!dest.empty()) {
136 auto result =
Read(dest);
138 return result.status();
140 const size_t bytes_read = result->size();
141 PW_DASSERT(bytes_read != 0);
142 dest = dest.subspan(bytes_read);
175 PW_DASSERT(data.empty() || data.data() !=
nullptr);
180 return Write(
span(
static_cast<const std::byte*
>(data), size_bytes));
198 return DoSeek(offset, origin);
235 enum class LimitType :
bool { kRead, kWrite };
241 friend class RelativeSeekableReader;
242 friend class SeekableReader;
243 friend class NonSeekableReader;
246 friend class RelativeSeekableWriter;
247 friend class SeekableWriter;
248 friend class NonSeekableWriter;
250 friend class ReaderWriter;
251 friend class RelativeSeekableReaderWriter;
252 friend class SeekableReaderWriter;
253 friend class NonSeekableReaderWriter;
259 enum class Seekability : uint8_t {
297 if (limit_type == LimitType::kRead) {
305 Seekability seekability_;
331 constexpr Reader(Seekability seekability)
332 :
Stream(
true,
false, seekability) {}
420 constexpr Writer(Seekability seekability)
421 :
Stream(
false,
true, seekability) {}
426 return StatusWithSize::Unimplemented();
510 Reader& as_reader() {
return internal::SiblingCast<Reader&, Stream>(*
this); }
511 const Reader& as_reader()
const {
512 return internal::SiblingCast<const Reader&, Stream>(*
this);
515 operator Reader&() {
return as_reader(); }
516 operator const Reader&()
const {
return as_reader(); }
519 Writer& as_writer() {
return internal::SiblingCast<Writer&, Stream>(*
this); }
520 const Writer& as_writer()
const {
521 return internal::SiblingCast<const Writer&, Stream>(*
this);
524 operator Writer&() {
return as_writer(); }
525 operator const Writer&()
const {
return as_writer(); }
532 :
Stream(
true,
true, seekability) {}
555 return internal::SiblingCast<RelativeSeekableReader&, Stream>(*
this);
558 return internal::SiblingCast<const RelativeSeekableReader&, Stream>(*
this);
561 return internal::SiblingCast<RelativeSeekableWriter&, Stream>(*
this);
564 return internal::SiblingCast<const RelativeSeekableWriter&, Stream>(*
this);
591 return internal::SiblingCast<SeekableReader&, Stream>(*
this);
594 return internal::SiblingCast<const SeekableReader&, Stream>(*
this);
598 operator const SeekableReader&()
const {
return as_seekable_reader(); }
602 return internal::SiblingCast<SeekableWriter&, Stream>(*
this);
605 return internal::SiblingCast<const SeekableWriter&, Stream>(*
this);
609 operator const SeekableWriter&()
const {
return as_seekable_writer(); }
631 return internal::SiblingCast<NonSeekableReader&, Stream>(*
this);
634 return internal::SiblingCast<const NonSeekableReader&, Stream>(*
this);
637 return internal::SiblingCast<NonSeekableWriter&, Stream>(*
this);
640 return internal::SiblingCast<const NonSeekableWriter&, Stream>(*
this);
static constexpr Status Unimplemented()
Definition: status.h:280
Definition: status_with_size.h:51
constexpr bool ok() const
True if status() == OkStatus().
Definition: status_with_size.h:154
constexpr size_t size() const
Definition: status_with_size.h:148
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:395
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:649
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:486
Status DoWrite(ConstByteSpan) final
Virtual Write() function implemented by derived classes.
Definition: stream.h:336
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:197
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:296
virtual Status DoSeek(ptrdiff_t offset, Whence origin)=0
Virtual Seek() function implemented by derived classes.
Status Write(ConstByteSpan data)
Definition: stream.h:174
constexpr bool readable() const
Definition: stream.h:75
size_t Tell()
Definition: stream.h:207
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:229
Result< ByteSpan > ReadExact(ByteSpan const buffer)
Definition: stream.h:133
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:123
size_t ConservativeReadLimit() const
Definition: stream.h:217
virtual size_t DoTell()
Definition: stream.h:289
Result< ByteSpan > Read(ByteSpan dest)
Definition: stream.h:113
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:183
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:179
StatusWithSize DoRead(ByteSpan) final
Virtual Read() function implemented by derived classes.
Definition: stream.h:425