9#include "roo_backport/byte.h"
21 byte read() {
return rep_->read(); }
26 Status status()
const {
return rep_->status(); }
31 void rewind() {
rep_->rewind(); }
43 size_t read(
byte* buf,
size_t count);
44 void skip(
size_t count);
45 Status status()
const {
return status_; }
47 uint64_t size()
const;
48 uint64_t position()
const;
51 void seek(uint64_t position);
54 Rep(
const Rep&) =
delete;
56 Rep& operator=(
const Rep&) =
delete;
59 byte buffer_[kFileInputIteratorBufferSize];
69 std::unique_ptr<Rep>
rep_;
72inline ArduinoFileInputIterator::Rep::Rep(::fs::File
file)
78inline ArduinoFileInputIterator::Rep::~Rep() { file_.close(); }
80inline uint64_t ArduinoFileInputIterator::Rep::size()
const {
84inline uint64_t ArduinoFileInputIterator::Rep::position()
const {
85 return file_.position() + offset_ - length_;
88inline void ArduinoFileInputIterator::Rep::rewind() {
89 if (status_ != kOk && status_ != kEndOfStream)
return;
90 uint64_t file_pos = file_.position();
91 if (file_pos <= length_) {
103inline void ArduinoFileInputIterator::Rep::seek(uint64_t position) {
104 if (status_ != kOk && status_ != kEndOfStream)
return;
105 uint64_t file_pos = file_.position();
106 if (file_pos <= position + length_ && file_pos >= position) {
108 offset_ = position + length_ - file_pos;
118inline byte ArduinoFileInputIterator::Rep::read() {
119 if (offset_ < length_) {
120 return buffer_[offset_++];
122 if (status_ != kOk)
return byte{0};
123 size_t len = file_.read((uint8_t*)buffer_, kFileInputIteratorBufferSize);
129 }
else if (len == ((
size_t)(-1))) {
140inline size_t ArduinoFileInputIterator::Rep::read(
byte* buf,
size_t count) {
141 if (offset_ < length_) {
143 const size_t available =
static_cast<size_t>(length_ - offset_);
144 if (count > available)
count = available;
145 memcpy(buf, &buffer_[offset_], count);
149 if (status_ != kOk) {
153 if (count >= kFileInputIteratorBufferSize) {
155 size_t len = file_.read((uint8_t*)buf, count);
161 }
else if (len == ((
size_t)(-1))) {
169 size_t len = file_.read((uint8_t*)buffer_, kFileInputIteratorBufferSize);
175 }
else if (len == ((
size_t)(-1))) {
182 if (count > length_)
count = length_;
183 memcpy(buf, buffer_, count);
188inline void ArduinoFileInputIterator::Rep::skip(
size_t count) {
189 if (status_ != kOk)
return;
190 size_t remaining = (length_ - offset_);
191 if (count < remaining) {
196 if (!file_.seek(count - remaining, SeekCur)) {
199 if (file_.position() > file_.size()) {
roo::basic_string_view< CharT, Traits > basic_string_view