19#include "pw_bytes/span.h"
20#include "pw_multibuf/internal/chunk_iterator.h"
22namespace pw::multibuf {
25class MultiBufV1Adapter;
42template <
typename SizeType, ChunkMutability kMutability>
47 using Deque =
typename ChunkIteratorType::Deque;
50 using size_type = SizeType;
51 using difference_type = ptrdiff_t;
52 using value_type =
typename ChunkIteratorType::ByteType;
53 using pointer = value_type*;
54 using reference = value_type&;
55 using iterator_category = std::random_access_iterator_tag;
61 return {chunk_iterator_, offset_};
64 constexpr reference operator*()
const {
65 return chunk_iterator_->data()[offset_];
68 constexpr reference operator[](difference_type n)
const {
72 constexpr ByteIterator& operator++() {
return operator+=(1); }
82 return operator-=(-n);
84 size_t delta =
static_cast<size_t>(n);
86 while (delta != 0 && chunk_iterator_->size() <= delta) {
87 delta -= chunk_iterator_->size();
102 constexpr ByteIterator& operator--() {
return operator-=(1); }
112 return operator+=(-n);
114 size_t delta =
static_cast<size_t>(n);
115 while (delta > offset_) {
118 offset_ = chunk_iterator_->size();
128 constexpr friend difference_type operator-(
const ByteIterator& lhs,
133 difference_type delta = 0;
134 auto chunk_iterator = rhs.chunk_iterator_;
135 size_t offset = rhs.offset_;
136 while (chunk_iterator != lhs.chunk_iterator_) {
138 delta +=
static_cast<difference_type
>(bytes.size() - offset);
142 return delta +
static_cast<difference_type
>(lhs.offset_);
145 constexpr friend bool operator==(
const ByteIterator& lhs,
147 return lhs.Compare(rhs) == 0;
150 constexpr friend bool operator!=(
const ByteIterator& lhs,
152 return lhs.Compare(rhs) != 0;
155 constexpr friend bool operator<(
const ByteIterator& lhs,
157 return lhs.Compare(rhs) < 0;
160 constexpr friend bool operator>(
const ByteIterator& lhs,
162 return lhs.Compare(rhs) > 0;
165 constexpr friend bool operator<=(
const ByteIterator& lhs,
167 return lhs.Compare(rhs) <= 0;
170 constexpr friend bool operator>=(
const ByteIterator& lhs,
172 return lhs.Compare(rhs) >= 0;
177 template <
typename, ChunkMutability>
181 friend class ::pw::multibuf::internal::GenericMultiBuf;
184 friend class ::pw::multibuf::MultiBufV1Adapter;
187 friend class ::pw::multibuf::test::IteratorTest;
190 : chunk_iterator_(std::move(chunk_iterator)), offset_(offset) {}
192 constexpr size_type chunk()
const {
return chunk_iterator_.chunk_; }
195 constexpr int Compare(
const ByteIterator& other)
const {
196 if (chunk_iterator_ != other.chunk_iterator_) {
197 return chunk_iterator_.chunk_ < other.chunk_iterator_.chunk_ ? -1 : 1;
199 if (offset_ != other.offset_) {
200 return offset_ < other.offset_ ? -1 : 1;
Definition: byte_iterator.h:43