19#include "pw_bytes/span.h"
20#include "pw_multibuf/v2/internal/chunk_iterator.h"
22namespace pw::multibuf::v2 {
38template <
typename SizeType, ChunkMutability kMutability>
43 using Deque =
typename ChunkIteratorType::Deque;
46 using size_type = SizeType;
47 using difference_type = ptrdiff_t;
48 using value_type =
typename ChunkIteratorType::ByteType;
49 using pointer = value_type*;
50 using reference = value_type&;
51 using iterator_category = std::random_access_iterator_tag;
57 return {chunk_iterator_, offset_};
60 constexpr reference operator*()
const {
61 return chunk_iterator_->data()[offset_];
64 constexpr reference operator[](difference_type n)
const {
68 constexpr ByteIterator& operator++() {
return operator+=(1); }
78 return operator-=(-n);
80 size_t delta =
static_cast<size_t>(n);
82 while (delta != 0 && chunk_iterator_->size() <= delta) {
83 delta -= chunk_iterator_->size();
98 constexpr ByteIterator& operator--() {
return operator-=(1); }
108 return operator+=(-n);
110 size_t delta =
static_cast<size_t>(n);
111 while (delta > offset_) {
114 offset_ = chunk_iterator_->size();
124 constexpr friend difference_type operator-(
const ByteIterator& lhs,
129 difference_type delta = 0;
130 auto chunk_iterator = rhs.chunk_iterator_;
131 size_t offset = rhs.offset_;
132 while (chunk_iterator != lhs.chunk_iterator_) {
134 delta +=
static_cast<difference_type
>(bytes.size() - offset);
138 return delta +
static_cast<difference_type
>(lhs.offset_);
141 constexpr friend bool operator==(
const ByteIterator& lhs,
143 return lhs.Compare(rhs) == 0;
146 constexpr friend bool operator!=(
const ByteIterator& lhs,
148 return lhs.Compare(rhs) != 0;
151 constexpr friend bool operator<(
const ByteIterator& lhs,
153 return lhs.Compare(rhs) < 0;
156 constexpr friend bool operator>(
const ByteIterator& lhs,
158 return lhs.Compare(rhs) > 0;
161 constexpr friend bool operator<=(
const ByteIterator& lhs,
163 return lhs.Compare(rhs) <= 0;
166 constexpr friend bool operator>=(
const ByteIterator& lhs,
168 return lhs.Compare(rhs) >= 0;
173 template <
typename, ChunkMutability>
180 friend class ::pw::multibuf::v2::test::IteratorTest;
183 : chunk_iterator_(std::move(chunk_iterator)), offset_(offset) {}
185 constexpr size_type chunk()
const {
return chunk_iterator_.chunk_; }
188 constexpr int Compare(
const ByteIterator& other)
const {
189 if (chunk_iterator_ != other.chunk_iterator_) {
190 return chunk_iterator_.chunk_ < other.chunk_iterator_.chunk_ ? -1 : 1;
192 if (offset_ != other.offset_) {
193 return offset_ < other.offset_ ? -1 : 1;
Definition: byte_iterator.h:39
Definition: multibuf.h:1021