5#include <boost/mp11/detail/mp_list.hpp>
6#include <boost/mp11/list.hpp>
9#include <range/v3/algorithm/copy.hpp>
10#include <range/v3/algorithm/transform.hpp>
11#include <range/v3/iterator/concepts.hpp>
12#include <range/v3/range/access.hpp>
13#include <range/v3/range/concepts.hpp>
14#include <range/v3/range/primitives.hpp>
15#include <range/v3/range/traits.hpp>
19#include <initializer_list>
29static_assert(ranges::input_iterator<const std::byte*>);
43 using iterator = std::vector<std::byte>::iterator;
51 template <ranges::input_iterator It>
53 : data_{first, last} {}
58 template <
typename ByteLike = std::
byte>
59 requires requires(ByteLike value) {
static_cast<std::byte
>(value); }
60 explicit ByteVector(std::size_t count, ByteLike value = std::byte{0})
61 : data_{count, std::byte{value}} {}
65 const std::byte&
operator[](
size_t idx)
const {
return data_[idx]; }
67 template <ranges::input_iterator It>
69 return data_.insert(pos, first, last);
72 template <
typename ByteLike>
73 requires requires(ByteLike value) {
static_cast<std::byte
>(value); }
75 data_.push_back(value);
78 template <
typename ByteLike>
79 requires requires(ByteLike value) {
static_cast<std::byte
>(value); }
81 data_.emplace_back(value);
84 auto begin() {
return data_.begin(); }
86 auto begin()
const {
return data_.begin(); }
88 auto cbegin()
const {
return data_.cend(); }
90 auto end() {
return data_.end(); }
92 auto end()
const {
return data_.end(); }
94 auto cend()
const {
return data_.cend(); }
96 auto data() {
return data_.data(); }
98 auto data()
const {
return data_.data(); }
100 size_t size()
const {
return data_.size(); }
102 void resize(std::size_t new_size) { data_.resize(new_size); }
106 : data_{init.
size()} {
107 init_range_to_bytes(init);
112 template <ranges::range Range>
113 requires requires(Range range, std::size_t
size, std::byte byte) {
114 { range.resize(
size) };
115 { std::to_integer<ranges::range_value_t<Range>>(byte) };
119 result.resize(this->
size());
121 ranges::transform(*
this, result.begin(),
122 [](std::byte value) { return std::to_integer<ranges::range_value_t<Range>>(value); });
127 template <
typename... Types>
128 requires(std::is_trivially_copyable_v<Types> && ...)
130 -> std::conditional_t<sizeof...(Types) == 1, boost::mp11::mp_first<boost::mp11::mp_list<Types...>>,
131 std::tuple<Types...>> {
132 constexpr auto TOTAL_SIZE = (
sizeof(Types) + ...);
133 Expects(TOTAL_SIZE <=
size());
135 std::array<std::byte, TOTAL_SIZE> bytes;
136 ranges::copy(
begin(),
begin() + TOTAL_SIZE, bytes.begin());
138 return {std::bit_cast<Types>(bytes)...};
141 template <ranges::range Range>
143 auto raw_bytes = std::as_bytes(std::span{range});
145 static_assert(ranges::input_iterator<
decltype(raw_bytes.begin())>);
147 return {raw_bytes.begin(), raw_bytes.end()};
150 template <
typename... Ts>
154 auto it = ranges::begin(result);
156 (ranges::copy(std::bit_cast<std::array<std::byte,
sizeof(Ts)>>(args), std::exchange(it, it +
sizeof(Ts))), ...);
162 template <ranges::range Range>
163 requires requires(ranges::range_value_t<Range> value) {
static_cast<std::byte
>(value); }
164 void init_range_to_bytes(
const Range& range) {
165 Expects(
size() == ranges::size(range));
167 ranges::transform(range, this->
begin(), [](u8 value) {
return std::byte{value}; });
170 std::vector<std::byte> data_;
Definition byte_vector.hpp:32
std::size_t size_type
Definition byte_vector.hpp:37
auto begin() const
Definition byte_vector.hpp:86
const std::byte & operator[](size_t idx) const
Definition byte_vector.hpp:65
void resize(std::size_t new_size)
Definition byte_vector.hpp:102
std::byte value_type
Definition byte_vector.hpp:35
std::allocator< std::byte > allocator_type
Definition byte_vector.hpp:36
auto cbegin() const
Definition byte_vector.hpp:88
auto insert(const_iterator pos, It first, It last)
Definition byte_vector.hpp:68
std::byte & operator[](size_t idx)
Definition byte_vector.hpp:63
std::vector< std::byte >::const_reverse_iterator const_reverse_iterator
Definition byte_vector.hpp:46
auto end()
Definition byte_vector.hpp:90
ByteVector(std::initializer_list< u8 > init)
Definition byte_vector.hpp:105
std::ptrdiff_t difference_type
Definition byte_vector.hpp:38
void push_back(ByteLike value)
Definition byte_vector.hpp:74
ByteVector(std::initializer_list< std::byte > init)
Definition byte_vector.hpp:55
auto begin()
Definition byte_vector.hpp:84
void emplace_back(ByteLike value)
Definition byte_vector.hpp:80
auto data()
Definition byte_vector.hpp:96
std::vector< std::byte >::iterator iterator
Definition byte_vector.hpp:43
value_type & reference
Definition byte_vector.hpp:39
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:129
Range to_range() const
T should be a stdlib-compatible container type where std::byte is convertible to T::value_type.
Definition byte_vector.hpp:117
auto end() const
Definition byte_vector.hpp:92
size_t size() const
Definition byte_vector.hpp:100
const value_type * const_pointer
Definition byte_vector.hpp:42
static ByteVector from(const Ts &... args)
Definition byte_vector.hpp:151
ByteVector(It first, It last)
Definition byte_vector.hpp:52
ByteVector(std::size_t count, ByteLike value=std::byte{0})
Definition byte_vector.hpp:60
auto data() const
Definition byte_vector.hpp:98
const value_type & const_reference
Definition byte_vector.hpp:40
auto cend() const
Definition byte_vector.hpp:94
std::vector< std::byte >::reverse_iterator reverse_iterator
Definition byte_vector.hpp:45
static ByteVector from(const Range &range)
Definition byte_vector.hpp:142
value_type * pointer
Definition byte_vector.hpp:41
std::vector< std::byte >::const_iterator const_iterator
Definition byte_vector.hpp:44
Definition asm_buffer.hpp:19