21#include "pw_bytes/bit.h"
22#include "pw_bytes/endian.h"
23#include "pw_bytes/span.h"
24#include "pw_containers/iterator.h"
25#include "pw_preprocessor/compiler.h"
26#include "pw_status/status.h"
27#include "pw_status/status_with_size.h"
45 using difference_type = ptrdiff_t;
46 using value_type = std::byte;
47 using element_type =
const std::byte;
48 using pointer =
const std::byte*;
49 using reference =
const std::byte&;
50 using iterator_category = containers::contiguous_iterator_tag;
52 explicit constexpr iterator(
const std::byte* byte_ptr =
nullptr)
77 constexpr iterator& operator+=(
int n) {
84 constexpr iterator& operator-=(
int n) {
return operator+=(-n); }
88 constexpr difference_type operator-(
const iterator& rhs)
const {
89 return byte_ - rhs.byte_;
92 constexpr reference operator*()
const {
return *byte_; }
94 constexpr pointer operator->()
const {
return byte_; }
96 constexpr reference operator[](
int index)
const {
return byte_[index]; }
98 constexpr bool operator==(
const iterator& rhs)
const {
99 return byte_ == rhs.byte_;
102 constexpr bool operator!=(
const iterator& rhs)
const {
103 return byte_ != rhs.byte_;
106 constexpr bool operator<(
const iterator& rhs)
const {
107 return byte_ < rhs.byte_;
110 constexpr bool operator>(
const iterator& rhs)
const {
111 return byte_ > rhs.byte_;
114 constexpr bool operator<=(
const iterator& rhs)
const {
115 return !operator>(rhs);
118 constexpr bool operator>=(
const iterator& rhs)
const {
119 return !operator<(rhs);
124 int8_t
PeekInt8()
const {
return static_cast<int8_t
>(PeekUint8()); }
126 uint8_t PeekUint8()
const {
127 return bytes::ReadInOrder<uint8_t>(endian::little, byte_);
130 int16_t PeekInt16(endian order = endian::little)
const {
131 return static_cast<int16_t
>(PeekUint16(order));
134 uint16_t PeekUint16(endian order = endian::little)
const {
135 return bytes::ReadInOrder<uint16_t>(order, byte_);
138 int32_t PeekInt32(endian order = endian::little)
const {
139 return static_cast<int32_t
>(PeekUint32(order));
142 uint32_t PeekUint32(endian order = endian::little)
const {
143 return bytes::ReadInOrder<uint32_t>(order, byte_);
146 int64_t PeekInt64(endian order = endian::little)
const {
147 return static_cast<int64_t
>(PeekUint64(order));
150 uint64_t PeekUint64(endian order = endian::little)
const {
151 return bytes::ReadInOrder<uint64_t>(order, byte_);
157 int8_t
ReadInt8() {
return static_cast<int8_t
>(ReadUint8()); }
159 uint8_t ReadUint8() {
160 uint8_t value = bytes::ReadInOrder<uint8_t>(endian::little, byte_);
165 int16_t ReadInt16(endian order = endian::little) {
166 return static_cast<int16_t
>(ReadUint16(order));
169 uint16_t ReadUint16(endian order = endian::little) {
170 uint16_t value = bytes::ReadInOrder<uint16_t>(order, byte_);
175 int32_t ReadInt32(endian order = endian::little) {
176 return static_cast<int32_t
>(ReadUint32(order));
179 uint32_t ReadUint32(endian order = endian::little) {
180 uint32_t value = bytes::ReadInOrder<uint32_t>(order, byte_);
185 int64_t ReadInt64(endian order = endian::little) {
186 return static_cast<int64_t
>(ReadUint64(order));
189 uint64_t ReadUint64(endian order = endian::little) {
190 uint64_t value = bytes::ReadInOrder<uint64_t>(order, byte_);
196 const std::byte* byte_;
199 using element_type =
const std::byte;
200 using value_type = std::byte;
201 using pointer = std::byte*;
202 using reference = std::byte&;
203 using iterator = iterator;
204 using const_iterator = iterator;
207 constexpr ByteBuilder(ByteSpan buffer) : buffer_(buffer), size_(0) {}
216 const std::byte*
data()
const {
return buffer_.data(); }
243 bool ok()
const {
return status_.
ok(); }
249 size_t size()
const {
return size_; }
275 const_iterator cbegin()
const {
return begin(); }
279 const_iterator cend()
const {
return end(); }
282 const std::byte&
front()
const {
return buffer_[0]; }
283 const std::byte& back()
const {
return buffer_[
size() - 1]; }
295 return append(bytes.data(), bytes.size());
305 ByteBuilder& PutInt8(int8_t val) {
return WriteInOrder(val); }
309 return WriteInOrder(bytes::ConvertOrderTo(order, value));
312 ByteBuilder& PutInt16(int16_t value, endian order = endian::little) {
313 return PutUint16(
static_cast<uint16_t
>(value), order);
318 return WriteInOrder(bytes::ConvertOrderTo(order, value));
321 ByteBuilder& PutInt32(int32_t value, endian order = endian::little) {
322 return PutUint32(
static_cast<uint32_t
>(value), order);
327 return WriteInOrder(bytes::ConvertOrderTo(order, value));
330 ByteBuilder& PutInt64(int64_t value, endian order = endian::little) {
331 return PutUint64(
static_cast<uint64_t
>(value), order);
337 : buffer_(buffer), size_(other.size_), status_(other.status_) {}
341 status_ = other.status_;
345 template <
typename T>
346 ByteBuilder& WriteInOrder(T value) {
347 return append(&value,
sizeof(value));
349 size_t ResizeForAppend(
size_t bytes_to_append);
351 const ByteSpan buffer_;
358template <
size_t kSizeBytes>
370 template <
size_t kOtherSizeBytes>
372 assign<kOtherSizeBytes>(other);
377 assign<kSizeBytes>(other);
381 template <
size_t kOtherSizeBytes>
384 "A ByteBuffer cannot be copied into a smaller buffer");
385 CopySizeAndStatus(other);
398 static constexpr size_t max_size() {
return kSizeBytes; }
402 template <
typename... Args>
409 template <
size_t kOtherSize>
411 std::memcpy(buffer_.data(), other.
data(), other.
size());
414 std::array<std::byte, kSizeBytes> buffer_;
417constexpr ByteBuilder::iterator operator+(
int n, ByteBuilder::iterator it) {
ByteBuffers declare a buffer along with a ByteBuilder.
Definition: byte_builder.h:359
static constexpr size_t max_size()
Definition: byte_builder.h:398
ByteBuffer & append(Args &&... args)
Definition: byte_builder.h:403
ByteBuffer & operator=(ByteBuffer &&other)=delete
ByteBuffers are not movable: the underlying data must be copied.
ByteBuffer(ByteBuffer &&other)=delete
ByteBuffers are not movable: the underlying data must be copied.
Definition: byte_builder.h:43
int8_t PeekInt8() const
Definition: byte_builder.h:124
int8_t ReadInt8()
Definition: byte_builder.h:157
Definition: byte_builder.h:38
void pop_back()
Definition: byte_builder.h:269
void resize(size_t new_size)
ByteBuilder & append(size_t count, std::byte b)
Appends the provided byte count times.
Status status() const
Definition: byte_builder.h:235
ByteBuilder & PutUint32(uint32_t value, endian order=endian::little)
Put methods for inserting different 32-bit ints.
Definition: byte_builder.h:317
void clear_status()
Sets the statuses to OkStatus();.
Definition: byte_builder.h:261
size_t size() const
Returns the current length of the bytes.
Definition: byte_builder.h:249
const std::byte & front() const
Front and Back C++ container functions.
Definition: byte_builder.h:282
void clear()
Clears the bytes and resets its error state.
Definition: byte_builder.h:255
bool ok() const
True if status() is OkStatus().
Definition: byte_builder.h:243
ByteBuilder & PutUint64(uint64_t value, endian order=endian::little)
Put methods for inserting different 64-bit ints.
Definition: byte_builder.h:326
bool empty() const
True if the bytes builder is empty.
Definition: byte_builder.h:246
const std::byte * data() const
Returns the contents of the bytes buffer.
Definition: byte_builder.h:216
void push_back(std::byte b)
Definition: byte_builder.h:265
ByteBuilder & PutUint8(uint8_t val)
Put methods for inserting different 8-bit ints.
Definition: byte_builder.h:303
ByteBuilder & append(const void *bytes, size_t count)
const_iterator end() const
End of bytebuffer wrapped in iterator type.
Definition: byte_builder.h:278
ByteBuilder & append(ConstByteSpan bytes)
Appends bytes from a byte span that calls the pointer/length version.
Definition: byte_builder.h:294
const_iterator begin() const
Root of bytebuffer wrapped in iterator type.
Definition: byte_builder.h:274
StatusWithSize status_with_size() const
Returns status() and size() as a StatusWithSize.
Definition: byte_builder.h:238
ByteBuilder(const ByteBuilder &)=delete
constexpr ByteBuilder(const ByteSpan &buffer, const ByteBuilder &other)
Functions to support ByteBuffer copies.
Definition: byte_builder.h:336
ByteBuilder & PutUint16(uint16_t value, endian order=endian::little)
Put methods for inserting different 16-bit ints.
Definition: byte_builder.h:308
size_t max_size() const
Returns the maximum length of the bytes.
Definition: byte_builder.h:252
constexpr ByteBuilder(ByteSpan buffer)
Creates an empty ByteBuilder.
Definition: byte_builder.h:207
constexpr bool ok() const
Definition: status.h:157
Definition: status_with_size.h:49
#define PW_NO_SANITIZE(check)
Definition: compiler.h:155
Provides basic helpers for reading and writing UTF-8 encoded strings.
Definition: alignment.h:27
constexpr Status OkStatus()
Definition: status.h:234