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"
47 using difference_type = ptrdiff_t;
48 using value_type = std::byte;
49 using element_type =
const std::byte;
50 using pointer =
const std::byte*;
51 using reference =
const std::byte&;
52 using iterator_category = containers::contiguous_iterator_tag;
54 explicit constexpr iterator(
const std::byte* byte_ptr =
nullptr)
79 constexpr iterator& operator+=(
int n) {
86 constexpr iterator& operator-=(
int n) {
return operator+=(-n); }
90 constexpr difference_type operator-(
const iterator& rhs)
const {
91 return byte_ - rhs.byte_;
94 constexpr reference operator*()
const {
return *byte_; }
96 constexpr pointer operator->()
const {
return byte_; }
98 constexpr reference operator[](
int index)
const {
return byte_[index]; }
100 constexpr bool operator==(
const iterator& rhs)
const {
101 return byte_ == rhs.byte_;
104 constexpr bool operator!=(
const iterator& rhs)
const {
105 return byte_ != rhs.byte_;
108 constexpr bool operator<(
const iterator& rhs)
const {
109 return byte_ < rhs.byte_;
112 constexpr bool operator>(
const iterator& rhs)
const {
113 return byte_ > rhs.byte_;
116 constexpr bool operator<=(
const iterator& rhs)
const {
117 return !operator>(rhs);
120 constexpr bool operator>=(
const iterator& rhs)
const {
121 return !operator<(rhs);
126 int8_t
PeekInt8()
const {
return static_cast<int8_t
>(PeekUint8()); }
128 uint8_t PeekUint8()
const {
129 return bytes::ReadInOrder<uint8_t>(endian::little, byte_);
132 int16_t PeekInt16(endian order = endian::little)
const {
133 return static_cast<int16_t
>(PeekUint16(order));
136 uint16_t PeekUint16(endian order = endian::little)
const {
137 return bytes::ReadInOrder<uint16_t>(order, byte_);
140 int32_t PeekInt32(endian order = endian::little)
const {
141 return static_cast<int32_t
>(PeekUint32(order));
144 uint32_t PeekUint32(endian order = endian::little)
const {
145 return bytes::ReadInOrder<uint32_t>(order, byte_);
148 int64_t PeekInt64(endian order = endian::little)
const {
149 return static_cast<int64_t
>(PeekUint64(order));
152 uint64_t PeekUint64(endian order = endian::little)
const {
153 return bytes::ReadInOrder<uint64_t>(order, byte_);
159 int8_t
ReadInt8() {
return static_cast<int8_t
>(ReadUint8()); }
161 uint8_t ReadUint8() {
162 uint8_t value = bytes::ReadInOrder<uint8_t>(endian::little, byte_);
167 int16_t ReadInt16(endian order = endian::little) {
168 return static_cast<int16_t
>(ReadUint16(order));
171 uint16_t ReadUint16(endian order = endian::little) {
172 uint16_t value = bytes::ReadInOrder<uint16_t>(order, byte_);
177 int32_t ReadInt32(endian order = endian::little) {
178 return static_cast<int32_t
>(ReadUint32(order));
181 uint32_t ReadUint32(endian order = endian::little) {
182 uint32_t value = bytes::ReadInOrder<uint32_t>(order, byte_);
187 int64_t ReadInt64(endian order = endian::little) {
188 return static_cast<int64_t
>(ReadUint64(order));
191 uint64_t ReadUint64(endian order = endian::little) {
192 uint64_t value = bytes::ReadInOrder<uint64_t>(order, byte_);
198 const std::byte* byte_;
201 using element_type =
const std::byte;
202 using value_type = std::byte;
203 using pointer = std::byte*;
204 using reference = std::byte&;
205 using iterator = iterator;
206 using const_iterator = iterator;
218 const std::byte*
data()
const {
return buffer_.data(); }
237 bool ok()
const {
return status_.
ok(); }
243 size_t size()
const {
return size_; }
269 const_iterator cbegin()
const {
return begin(); }
273 const_iterator cend()
const {
return end(); }
276 const std::byte&
front()
const {
return buffer_[0]; }
277 const std::byte& back()
const {
return buffer_[
size() - 1]; }
289 return append(bytes.data(), bytes.size());
299 ByteBuilder& PutInt8(int8_t val) {
return WriteInOrder(val); }
306 ByteBuilder& PutInt16(int16_t value, endian order = endian::little) {
307 return PutUint16(
static_cast<uint16_t
>(value), order);
315 ByteBuilder& PutInt32(int32_t value, endian order = endian::little) {
316 return PutUint32(
static_cast<uint32_t
>(value), order);
324 ByteBuilder& PutInt64(int64_t value, endian order = endian::little) {
325 return PutUint64(
static_cast<uint64_t
>(value), order);
331 : buffer_(buffer), size_(other.size_), status_(other.status_) {}
335 status_ = other.status_;
339 template <
typename T>
340 ByteBuilder& WriteInOrder(T value) {
341 return append(&value,
sizeof(value));
343 size_t ResizeForAppend(
size_t bytes_to_append);
345 const ByteSpan buffer_;
352template <
size_t kSizeBytes>
364 template <
size_t kOtherSizeBytes>
366 assign<kOtherSizeBytes>(other);
371 assign<kSizeBytes>(other);
375 template <
size_t kOtherSizeBytes>
378 "A ByteBuffer cannot be copied into a smaller buffer");
379 CopySizeAndStatus(other);
392 static constexpr size_t max_size() {
return kSizeBytes; }
396 template <
typename... Args>
403 template <
size_t kOtherSize>
405 std::memcpy(buffer_.data(), other.
data(), other.
size());
408 std::array<std::byte, kSizeBytes> buffer_;
411constexpr ByteBuilder::iterator operator+(
int n, ByteBuilder::iterator it) {
ByteBuffers declare a buffer along with a ByteBuilder.
Definition: byte_builder.h:353
static constexpr size_t max_size()
Definition: byte_builder.h:392
ByteBuffer & append(Args &&... args)
Definition: byte_builder.h:397
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:45
int8_t PeekInt8() const
Definition: byte_builder.h:126
int8_t ReadInt8()
Definition: byte_builder.h:159
Definition: byte_builder.h:40
void pop_back()
Definition: byte_builder.h:263
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:229
ByteBuilder & PutUint32(uint32_t value, endian order=endian::little)
Put methods for inserting different 32-bit ints.
Definition: byte_builder.h:311
void clear_status()
Sets the statuses to OkStatus();.
Definition: byte_builder.h:255
size_t size() const
Returns the current length of the bytes.
Definition: byte_builder.h:243
const std::byte & front() const
Front and Back C++ container functions.
Definition: byte_builder.h:276
void clear()
Clears the bytes and resets its error state.
Definition: byte_builder.h:249
bool ok() const
True if status() is OkStatus().
Definition: byte_builder.h:237
ByteBuilder & PutUint64(uint64_t value, endian order=endian::little)
Put methods for inserting different 64-bit ints.
Definition: byte_builder.h:320
bool empty() const
True if the bytes builder is empty.
Definition: byte_builder.h:240
const std::byte * data() const
Returns the contents of the bytes buffer.
Definition: byte_builder.h:218
void push_back(std::byte b)
Definition: byte_builder.h:259
ByteBuilder & PutUint8(uint8_t val)
Put methods for inserting different 8-bit ints.
Definition: byte_builder.h:297
ByteBuilder & append(const void *bytes, size_t count)
const_iterator end() const
End of bytebuffer wrapped in iterator type.
Definition: byte_builder.h:272
ByteBuilder & append(ConstByteSpan bytes)
Appends bytes from a byte span that calls the pointer/length version.
Definition: byte_builder.h:288
const_iterator begin() const
Root of bytebuffer wrapped in iterator type.
Definition: byte_builder.h:268
StatusWithSize status_with_size() const
Returns status() and size() as a StatusWithSize.
Definition: byte_builder.h:232
ByteBuilder(const ByteBuilder &)=delete
constexpr ByteBuilder(const ByteSpan &buffer, const ByteBuilder &other)
Functions to support ByteBuffer copies.
Definition: byte_builder.h:330
ByteBuilder & PutUint16(uint16_t value, endian order=endian::little)
Put methods for inserting different 16-bit ints.
Definition: byte_builder.h:302
size_t max_size() const
Returns the maximum length of the bytes.
Definition: byte_builder.h:246
constexpr ByteBuilder(ByteSpan buffer)
Creates an empty ByteBuilder.
Definition: byte_builder.h:209
constexpr bool ok() const
Definition: status.h:346
Definition: status_with_size.h:51
constexpr T ConvertOrderTo(endian to_endianness, T value)
Definition: endian.h:131
#define PW_NO_SANITIZE(check)
Definition: compiler.h:158
constexpr Status OkStatus()
Definition: status.h:450
The Pigweed namespace.
Definition: alignment.h:27