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"
64 static constexpr size_t kUnlimited = std::numeric_limits<size_t>::max();
73 constexpr bool readable()
const {
return readable_; }
77 constexpr bool writable()
const {
return writable_; }
81 constexpr bool seekable()
const {
return seekability_ != Seekability::kNone; }
85 return (
static_cast<uint8_t
>(seekability_) & origin) != 0u;
120 Result<ByteSpan>
Read(ByteSpan dest) {
121 PW_DASSERT(dest.empty() || dest.data() !=
nullptr);
125 return dest.first(result.
size());
127 return result.status();
130 Result<ByteSpan>
Read(
void* dest,
size_t size_bytes) {
131 return Read(span(
static_cast<std::byte*
>(dest), size_bytes));
141 ByteSpan dest = buffer;
142 while (!dest.empty()) {
143 auto result =
Read(dest);
145 return result.status();
147 const size_t bytes_read = result->size();
148 PW_DASSERT(bytes_read != 0);
149 dest = dest.subspan(bytes_read);
191 PW_DASSERT(data.empty() || data.data() !=
nullptr);
196 return Write(span(
static_cast<const std::byte*
>(data), size_bytes));
221 return DoSeek(offset, origin);
258 enum class LimitType :
bool { kRead, kWrite };
264 friend class RelativeSeekableReader;
265 friend class SeekableReader;
266 friend class NonSeekableReader;
269 friend class RelativeSeekableWriter;
270 friend class SeekableWriter;
271 friend class NonSeekableWriter;
273 friend class ReaderWriter;
274 friend class RelativeSeekableReaderWriter;
275 friend class SeekableReaderWriter;
276 friend class NonSeekableReaderWriter;
282 enum class Seekability : uint8_t {
320 if (limit_type == LimitType::kRead) {
328 Seekability seekability_;
350 constexpr Reader(Seekability seekability)
351 :
Stream(
true,
false, seekability) {}
435 constexpr Writer(Seekability seekability)
436 :
Stream(
false,
true, seekability) {}
441 return StatusWithSize::Unimplemented();
521 Reader& as_reader() {
return internal::SiblingCast<Reader&, Stream>(*
this); }
522 const Reader& as_reader()
const {
523 return internal::SiblingCast<const Reader&, Stream>(*
this);
526 operator Reader&() {
return as_reader(); }
527 operator const Reader&()
const {
return as_reader(); }
530 Writer& as_writer() {
return internal::SiblingCast<Writer&, Stream>(*
this); }
531 const Writer& as_writer()
const {
532 return internal::SiblingCast<const Writer&, Stream>(*
this);
535 operator Writer&() {
return as_writer(); }
536 operator const Writer&()
const {
return as_writer(); }
543 :
Stream(
true,
true, seekability) {}
566 return internal::SiblingCast<RelativeSeekableReader&, Stream>(*
this);
569 return internal::SiblingCast<const RelativeSeekableReader&, Stream>(*
this);
572 return internal::SiblingCast<RelativeSeekableWriter&, Stream>(*
this);
575 return internal::SiblingCast<const RelativeSeekableWriter&, Stream>(*
this);
602 return internal::SiblingCast<SeekableReader&, Stream>(*
this);
605 return internal::SiblingCast<const SeekableReader&, Stream>(*
this);
609 operator const SeekableReader&()
const {
return as_seekable_reader(); }
613 return internal::SiblingCast<SeekableWriter&, Stream>(*
this);
616 return internal::SiblingCast<const SeekableWriter&, Stream>(*
this);
620 operator const SeekableWriter&()
const {
return as_seekable_writer(); }
642 return internal::SiblingCast<NonSeekableReader&, Stream>(*
this);
645 return internal::SiblingCast<const NonSeekableReader&, Stream>(*
this);
648 return internal::SiblingCast<NonSeekableWriter&, Stream>(*
this);
651 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:414
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:660
Status DoSeek(ptrdiff_t, Whence) final
Virtual Seek() function implemented by derived classes.
Definition: stream.h:501
Status DoWrite(ConstByteSpan) final
Virtual Write() function implemented by derived classes.
Definition: stream.h:355
virtual Status DoWrite(ConstByteSpan data)=0
Virtual Write() function implemented by derived classes.
Whence
Positions from which to seek.
Definition: stream.h:46
@ kCurrent
Definition: stream.h:56
@ kBeginning
Definition: stream.h:49
@ kEnd
Definition: stream.h:60
virtual StatusWithSize DoRead(ByteSpan destination)=0
Virtual Read() function implemented by derived classes.
Status Seek(ptrdiff_t offset, Whence origin=kBeginning)
Definition: stream.h:220
static constexpr size_t kUnlimited
Value returned from read/write limit if unlimited.
Definition: stream.h:64
constexpr bool seekable() const
Definition: stream.h:81
constexpr bool seekable(Whence origin) const
True if the stream supports seeking from the specified origin.
Definition: stream.h:84
virtual size_t ConservativeLimit(LimitType limit_type) const
Definition: stream.h:319
virtual Status DoSeek(ptrdiff_t offset, Whence origin)=0
Virtual Seek() function implemented by derived classes.
Status Write(ConstByteSpan data)
Definition: stream.h:190
constexpr bool readable() const
Definition: stream.h:73
size_t Tell()
Definition: stream.h:230
static constexpr size_t kUnknownPosition
Returned by Tell() if getting the position is not supported.
Definition: stream.h:67
size_t ConservativeWriteLimit() const
Definition: stream.h:252
Result< ByteSpan > ReadExact(ByteSpan const buffer)
Definition: stream.h:140
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:130
size_t ConservativeReadLimit() const
Definition: stream.h:240
virtual size_t DoTell()
Definition: stream.h:312
Result< ByteSpan > Read(ByteSpan dest)
Definition: stream.h:120
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:199
constexpr bool writable() const
Definition: stream.h:77
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:195
StatusWithSize DoRead(ByteSpan) final
Virtual Read() function implemented by derived classes.
Definition: stream.h:440