7#include <boost/mp11/detail/mp_list.hpp>
8#include <boost/mp11/list.hpp>
11#include <libassert/assert.hpp>
12#include <range/v3/algorithm/copy.hpp>
13#include <range/v3/algorithm/copy_n.hpp>
14#include <range/v3/algorithm/transform.hpp>
15#include <range/v3/iterator/concepts.hpp>
16#include <range/v3/range/access.hpp>
17#include <range/v3/range/concepts.hpp>
18#include <range/v3/range/primitives.hpp>
19#include <range/v3/range/traits.hpp>
23#include <initializer_list>
32template <EndiannessKind Endianness>
53 template <ranges::input_iterator It>
55 : data_{first, last} {}
61 : data_(count,
Byte{value}) {}
63 bool empty()
const {
return data_.empty(); }
69 Byte&
at(
size_t idx) {
return data_.at(idx); }
71 const Byte&
at(
size_t idx)
const {
return data_.at(idx); }
73 template <ranges::input_iterator It>
75 return data_.insert(pos, first, last);
82 template <
typename... Args>
84 data_.emplace_back(std::forward<Args>(args)...);
87 auto begin() {
return data_.begin(); }
89 auto begin()
const {
return data_.begin(); }
91 auto cbegin()
const {
return data_.cend(); }
93 auto end() {
return data_.end(); }
95 auto end()
const {
return data_.end(); }
97 auto cend()
const {
return data_.cend(); }
99 auto data() {
return data_.data(); }
101 auto data()
const {
return data_.data(); }
103 size_t size()
const {
return data_.size(); }
105 void resize(std::size_t new_size) { data_.resize(new_size); }
109 template <ranges::range Range>
110 requires requires(Range range, std::size_t
size,
Byte byte) {
111 { range.resize(
size) };
112 {
static_cast<ranges::range_value_t<Range>
>(
byte.value) };
116 result.resize(this->
size());
118 ranges::transform(*
this, result.begin(),
119 [](
Byte byte) { return static_cast<ranges::range_value_t<Range>>(byte.value); });
124 template <
typename... Types>
125 requires(
sizeof...(Types) > 0 && (std::is_trivially_copyable_v<Types> && ...))
127 ->
std::conditional_t<sizeof...(Types) == 1, boost::mp11::mp_first<boost::mp11::mp_list<Types...>>,
128 std::tuple<Types...>> {
129 constexpr auto TOTAL_SIZE = (
sizeof(Types) + ...);
130 ASSERT(TOTAL_SIZE <=
size());
132 std::tuple<std::array<
Byte,
sizeof(Types)>...> bytes;
135 [&bytes, iter =
begin()](
auto&&... elems)
mutable {
136 ((ranges::copy_n(std::exchange(iter, iter +
sizeof(Types)),
sizeof(Types), elems.begin())), ...);
140 if constexpr (
sizeof...(Types) == 1) {
141 return {std::bit_cast<Types>(std::get<0>(bytes))...};
143 return std::apply([](
auto&&... args) {
return std::tuple{(std::bit_cast<Types>(args))...}; }, bytes);
148 template <ranges::range Range>
149 requires requires(ranges::range_value_t<Range> value) {
static_cast<Byte>(value); }
150 void init_range_to_bytes(
const Range& range) {
151 Expects(
size() == ranges::size(range));
153 ranges::transform(range, this->
begin(), [](u8 value) {
return Byte{value}; });
156 std::vector<Byte> data_;
163static_assert(ranges::range<NativeByteVector>);
Definition byte_vector.hpp:34
const Byte & operator[](size_t idx) const
Definition byte_vector.hpp:67
std::allocator< Byte > allocator_type
Definition byte_vector.hpp:38
const Byte & at(size_t idx) const
Definition byte_vector.hpp:71
auto cbegin() const
Definition byte_vector.hpp:91
ByteVector(std::size_t count, Byte value=Byte{})
Definition byte_vector.hpp:60
void push_back(const Byte &value)
Definition byte_vector.hpp:80
ByteVector(It first, It last)
Definition byte_vector.hpp:54
std::vector< Byte >::iterator iterator
Definition byte_vector.hpp:45
size_t size() const
Definition byte_vector.hpp:103
auto end()
Definition byte_vector.hpp:93
std::size_t size_type
Definition byte_vector.hpp:39
Byte & at(size_t idx)
Definition byte_vector.hpp:69
void emplace_back(Args &&... args)
Definition byte_vector.hpp:83
void resize(std::size_t new_size)
Definition byte_vector.hpp:105
auto cend() const
Definition byte_vector.hpp:97
std::vector< Byte >::const_reverse_iterator const_reverse_iterator
Definition byte_vector.hpp:48
auto begin() const
Definition byte_vector.hpp:89
Byte & operator[](size_t idx)
Definition byte_vector.hpp:65
auto data() const
Definition byte_vector.hpp:101
auto bit_cast_to() const -> std::conditional_t< sizeof...(Types)==1, boost::mp11::mp_first< boost::mp11::mp_list< Types... > >, std::tuple< Types... > >
Definition byte_vector.hpp:126
std::vector< Byte >::reverse_iterator reverse_iterator
Definition byte_vector.hpp:47
std::ptrdiff_t difference_type
Definition byte_vector.hpp:40
auto begin()
Definition byte_vector.hpp:87
ByteVector(std::initializer_list< Byte > init)
Definition byte_vector.hpp:57
bool empty() const
Definition byte_vector.hpp:63
auto end() const
Definition byte_vector.hpp:95
auto insert(const_iterator pos, It first, It last)
Definition byte_vector.hpp:74
Range to_range() const
T should be a stdlib-compatible container type where Byte is convertible to T::value_type.
Definition byte_vector.hpp:114
std::vector< Byte >::const_iterator const_iterator
Definition byte_vector.hpp:46
auto data()
Definition byte_vector.hpp:99
More user-friendly interface wrapper for a byte-like integral.
Definition byte.hpp:18
Definition asm_buffer.hpp:20
Definition byte_array.hpp:94