pw_kvs/FlashPartition: Add stream read and write
Add NonSeekableWriter and SeekableReader for FlashPartition.
Change-Id: I643356bdda9a53af6b5d2391f8bd5859bbbfe955
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/84220
Reviewed-by: Armando Montanez <amontanez@google.com>
Reviewed-by: Wyatt Hepler <hepler@google.com>
Commit-Queue: David Rogers <davidrogers@google.com>
diff --git a/pw_kvs/flash_memory.cc b/pw_kvs/flash_memory.cc
index 4f28e07..cc22f67 100644
--- a/pw_kvs/flash_memory.cc
+++ b/pw_kvs/flash_memory.cc
@@ -31,6 +31,40 @@
using std::byte;
+Status FlashPartition::Writer::DoWrite(ConstByteSpan data) {
+ if (partition_.size_bytes() <= position_) {
+ return Status::OutOfRange();
+ }
+ if (data.size_bytes() > (partition_.size_bytes() - position_)) {
+ return Status::ResourceExhausted();
+ }
+ if (data.size_bytes() == 0) {
+ return OkStatus();
+ }
+
+ const StatusWithSize sws = partition_.Write(position_, data);
+ if (sws.ok()) {
+ position_ += data.size_bytes();
+ }
+ return sws.status();
+}
+
+StatusWithSize FlashPartition::Reader::DoRead(ByteSpan data) {
+ if (position_ >= partition_.size_bytes()) {
+ return StatusWithSize::OutOfRange();
+ }
+
+ size_t bytes_to_read =
+ std::min(data.size_bytes(), partition_.size_bytes() - position_);
+
+ const StatusWithSize sws =
+ partition_.Read(position_, data.first(bytes_to_read));
+ if (sws.ok()) {
+ position_ += bytes_to_read;
+ }
+ return sws;
+}
+
StatusWithSize FlashPartition::Output::DoWrite(std::span<const byte> data) {
PW_TRY_WITH_SIZE(flash_.Write(address_, data));
address_ += data.size();