58 raw_->reserve(raw_->size() +
size);
65 return write(sp.data(), sp.size());
72 return write(s.data(), s.size());
76 return write(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.size() + 1);
80 write(
reinterpret_cast<const uint8_t*
>(s.data()), s.size());
92 if (!checked_write_pos(count, pos) || count > raw_->max_size() - raw_->size())
97 raw_->insert(raw_->end(), count, value);
98 current_pos_ = (
off_type)(pos + count);
102 const uint64_t stack_val = value;
103 return write(
reinterpret_cast<const uint8_t*
>(&stack_val),
size);
110 template<
class T,
typename = std::enable_if_t<std::is_standard_layout_v<T> &&
111 std::is_trivial_v<T>>>
114 if (!checked_write_pos(
sizeof(T), pos)) {
118 const size_t end = pos +
sizeof(T);
119 if (raw_->size() <
end) {
125 memcpy(raw_->data() + pos, &tmp,
sizeof(T));
127 memcpy(raw_->data() + pos, &t,
sizeof(T));
142 template<
typename T,
size_t size>
144 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
153 for (
const T& e : elements) {
159 template<
typename T,
class U>
161 return opt ?
write<T>(*opt) : *
this;
172 c = std::move(owned_);
198 return seekp(raw_->size());
202 raw_->resize(raw_->size() +
size, value);
208 const std::vector<uint8_t>&
raw()
const {
212 std::vector<uint8_t>&
raw() {
226 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
227 if (offset > raw_->size() ||
sizeof(T) > raw_->size() - offset) {
230 T& value = *
reinterpret_cast<T*
>(raw_->data() + offset);
241 fixups_.resize(count);
248 fixups_[id].push_back(
tellp());
260 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
274 if (!checked_write_pos(
sizeof(T), pos) || pos > raw_->size() ||
275 sizeof(T) > raw_->size() - pos)
279 return reinterpret_cast<T*
>(raw_->data() + pos);
284 if ((uintmax_t)pos > (uintmax_t)((std::numeric_limits<off_type>::max)())) {
292 assert(sz <= raw_->
size());
293 std::copy(raw_->data(), raw_->data() + sz, sp.data());
298 if (sp.size() < this->size()) {
302 std::copy(raw_->begin(), raw_->end(), sp.begin());
315 std::vector<uint8_t>::iterator
begin() {
316 return raw_->begin();
319 std::vector<uint8_t>::iterator
end() {
323 std::vector<uint8_t>::const_iterator
begin()
const {
324 return raw_->begin();
327 std::vector<uint8_t>::const_iterator
end()
const {
332 bool checked_write_pos(
size_t count,
size_t& pos)
const {
333 const auto offset = (off_type)current_pos_;
338 const auto unsigned_offset = (uintmax_t)offset;
339 const auto max_vector_pos = (uintmax_t)raw_->max_size();
340 const auto max_stream_pos =
341 (uintmax_t)((std::numeric_limits<off_type>::max)());
342 const uintmax_t max_pos = (std::min)(max_vector_pos, max_stream_pos);
344 if (unsigned_offset > max_pos || (uintmax_t)count > max_pos - unsigned_offset)
349 pos = (size_t)unsigned_offset;
353 std::vector<std::vector<uint64_t>> fixups_;
354 pos_type current_pos_ = 0;
355 std::vector<uint8_t> owned_;
356 std::vector<uint8_t>* raw_ = &owned_;
357 bool endian_swap_ =
false;
369 pos_{stream.tellp()},
375 pos_{stream.tellp()},
395 std::streampos pos_ = 0;
vector_iostream & operator*()
Definition iostream.hpp:386
ScopeOStream(vector_iostream &stream)
Definition iostream.hpp:374
vector_iostream * operator->()
Definition iostream.hpp:382
ScopeOStream(const ScopeOStream &)=delete
ScopeOStream & operator=(const ScopeOStream &)=delete
~ScopeOStream()
Definition iostream.hpp:378
ScopeOStream(vector_iostream &stream, uint64_t pos)
Definition iostream.hpp:368
ScopeOStream & operator=(ScopeOStream &&)=delete
const vector_iostream & operator*() const
Definition iostream.hpp:390
ScopeOStream(ScopeOStream &&)=delete
Definition iostream.hpp:34
std::vector< uint8_t > & raw()
Definition iostream.hpp:212
vector_iostream & reloc(uint64_t offset, T shift, RELOC_OP op=RELOC_OP::ADD)
Definition iostream.hpp:225
static size_t sleb128_size(int64_t value)
vector_iostream & write(const std::vector< uint8_t > &s)
Definition iostream.hpp:68
vector_iostream & flush()
Definition iostream.hpp:176
std::vector< uint8_t >::iterator end()
Definition iostream.hpp:319
vector_iostream & seekp(vector_iostream::off_type p, std::ios_base::seekdir dir)
const vector_iostream & copy_into(const span< uint8_t > &sp) const
Definition iostream.hpp:297
const std::vector< uint8_t > & raw() const
Definition iostream.hpp:208
bool empty() const
Definition iostream.hpp:84
vector_iostream & write(const std::optional< U > &opt)
Definition iostream.hpp:160
vector_iostream & write(const std::array< T, size > &t)
Definition iostream.hpp:143
vector_iostream & seek_end()
Definition iostream.hpp:197
vector_iostream & apply_fixup(size_t id, T value)
Definition iostream.hpp:259
size_t size() const
Definition iostream.hpp:180
vector_iostream & put(uint8_t c)
vector_iostream & write_uleb128(uint64_t value)
vector_iostream & write(const uint8_t *s, std::streamsize n)
vector_iostream & seekp(pos_type p)
Definition iostream.hpp:189
vector_iostream & write(const std::u16string &s, bool with_null_char)
vector_iostream & clear()
Definition iostream.hpp:310
bool endian_swap() const
Definition iostream.hpp:220
span< const uint8_t > data() const
Definition iostream.hpp:306
vector_iostream & increase_capacity(size_t size)
Definition iostream.hpp:57
vector_iostream & init_fixups(size_t count)
Definition iostream.hpp:240
vector_iostream & move(std::vector< uint8_t > &c)
Definition iostream.hpp:171
T * edit_as(size_t pos)
Definition iostream.hpp:283
vector_iostream & write(const std::string_view &s)
Definition iostream.hpp:79
vector_iostream & write_sized_int(uint64_t value, size_t size)
Definition iostream.hpp:101
vector_iostream & write(const std::string &s)
Definition iostream.hpp:75
std::streampos pos_type
Definition iostream.hpp:39
vector_iostream & record_fixup(size_t id)
Definition iostream.hpp:254
vector_iostream & record_fixup(size_t id, bool cond)
Definition iostream.hpp:246
vector_iostream()=default
const std::vector< uint64_t > & get_fixups(size_t id) const
Definition iostream.hpp:267
pos_type tellp() const
Definition iostream.hpp:185
vector_iostream & write(const vector_iostream &other)
Definition iostream.hpp:106
vector_iostream & write(span< const uint8_t > sp)
Definition iostream.hpp:64
vector_iostream & align(size_t alignment, uint8_t fill=0)
vector_iostream & reserve(size_t size)
Definition iostream.hpp:52
void set_endian_swap(bool swap)
Definition iostream.hpp:216
RELOC_OP
Definition iostream.hpp:41
@ SUB
Definition iostream.hpp:43
@ ADD
Definition iostream.hpp:42
vector_iostream & write(const T &t)
Definition iostream.hpp:112
std::vector< uint8_t >::const_iterator end() const
Definition iostream.hpp:327
T * edit_as()
Definition iostream.hpp:272
static size_t uleb128_size(uint64_t value)
std::streamoff off_type
Definition iostream.hpp:40
std::vector< uint8_t >::iterator begin()
Definition iostream.hpp:315
vector_iostream & write(const std::vector< T > &elements)
Definition iostream.hpp:152
vector_iostream(std::vector< uint8_t > &ref)
Definition iostream.hpp:47
vector_iostream & write_sleb128(int64_t value)
const vector_iostream & copy_into(const span< uint8_t > &sp, size_t sz) const
Definition iostream.hpp:291
std::vector< uint8_t >::const_iterator begin() const
Definition iostream.hpp:323
vector_iostream & write(size_t count, uint8_t value)
Definition iostream.hpp:90
vector_iostream(bool endian_swap)
Definition iostream.hpp:49
vector_iostream & pad(size_t size, uint8_t value=0)
Definition iostream.hpp:201
vector_iostream & get(std::vector< uint8_t > &c)
Definition iostream.hpp:167
#define LIEF_LIFETIMEBOUND
Definition compiler_attributes.hpp:72
LIEF namespace.
Definition Abstract/Binary.hpp:41
tcb::span< ElementType, Extent > span
Definition span.hpp:22
void swap_endian(T *)
Definition endianness_support.hpp:117
#define LIEF_API
Definition visibility.h:45