47 endian_swap_(endian_swap)
63 return write(sp.data(), sp.size());
70 return write(s.data(), s.size());
74 return write(
reinterpret_cast<const uint8_t*
>(s.c_str()), s.size() + 1);
84 raw_->insert(raw_->end(), count, value);
85 current_pos_ += count;
89 const uint64_t stack_val = value;
90 return write(
reinterpret_cast<const uint8_t*
>(&stack_val),
size);
97 template<class T, typename = typename std::enable_if<std::is_standard_layout<T>::value && std::is_trivial<T>::value>::type>
99 const auto pos =
static_cast<size_t>(
tellp());
100 if (raw_->size() < (pos +
sizeof(T))) {
101 raw_->resize(pos +
sizeof(T));
106 memcpy(raw_->data() + pos, &tmp,
sizeof(T));
108 memcpy(raw_->data() + pos, &t,
sizeof(T));
110 current_pos_ +=
sizeof(T);
123 template<
typename T,
size_t size>
125 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
134 for (
const T& e : elements) {
140 template<
typename T,
class U>
142 return opt ?
write<T>(*opt) : *
this;
153 c = std::move(owned_);
176 return seekp(raw_->size());
180 raw_->resize(raw_->size() +
size, value);
186 const std::vector<uint8_t>&
raw()
const {
190 std::vector<uint8_t>&
raw() {
200 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
201 if (offset > raw_->size() || (offset +
sizeof(T) > raw_->size())) {
204 T& value = *
reinterpret_cast<T*
>(raw_->data() + offset);
215 fixups_.resize(count);
222 fixups_[id].push_back(
tellp());
234 static_assert(std::numeric_limits<T>::is_integer,
"Requires integer type");
247 assert(((
size_t)current_pos_ +
sizeof(T)) <= raw_->size());
248 return reinterpret_cast<T*
>(raw_->data() + current_pos_);
254 assert(((
size_t)current_pos_ +
sizeof(T)) <= raw_->size());
255 return reinterpret_cast<T*
>(raw_->data() + current_pos_);
259 assert(sz <= raw_->
size());
260 std::copy(raw_->data(), raw_->data() + sz, sp.data());
265 if (sp.size() < this->size()) {
269 std::copy(raw_->begin(), raw_->end(), sp.begin());
282 std::vector<uint8_t>::iterator
begin() {
283 return raw_->begin();
286 std::vector<uint8_t>::iterator
end() {
290 std::vector<uint8_t>::const_iterator
begin()
const {
291 return raw_->begin();
294 std::vector<uint8_t>::const_iterator
end()
const {
299 std::vector<std::vector<uint64_t>> fixups_;
301 std::vector<uint8_t> owned_;
302 std::vector<uint8_t>* raw_ = &owned_;
303 bool endian_swap_ =
false;
315 pos_{stream.tellp()},
322 pos_{stream.tellp()},
343 std::streampos pos_ = 0;
344 vector_iostream& stream_;
Definition iostream.hpp:306
vector_iostream & operator*()
Definition iostream.hpp:334
ScopeOStream(vector_iostream &stream)
Definition iostream.hpp:321
vector_iostream * operator->()
Definition iostream.hpp:330
ScopeOStream(const ScopeOStream &)=delete
ScopeOStream & operator=(const ScopeOStream &)=delete
~ScopeOStream()
Definition iostream.hpp:326
ScopeOStream(vector_iostream &stream, uint64_t pos)
Definition iostream.hpp:314
ScopeOStream & operator=(ScopeOStream &&)=delete
const vector_iostream & operator*() const
Definition iostream.hpp:338
ScopeOStream(ScopeOStream &&)=delete
Definition iostream.hpp:31
std::vector< uint8_t > & raw()
Definition iostream.hpp:190
vector_iostream & reloc(uint64_t offset, T shift, RELOC_OP op=RELOC_OP::ADD)
Definition iostream.hpp:199
static size_t sleb128_size(int64_t value)
vector_iostream & flush()
Definition iostream.hpp:157
std::vector< uint8_t >::iterator end()
Definition iostream.hpp:286
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:264
const std::vector< uint8_t > & raw() const
Definition iostream.hpp:186
bool empty() const
Definition iostream.hpp:77
vector_iostream & write(const std::array< T, size > &t)
Definition iostream.hpp:124
vector_iostream & seek_end()
Definition iostream.hpp:175
vector_iostream & apply_fixup(size_t id, T value)
Definition iostream.hpp:233
size_t size() const
Definition iostream.hpp:161
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:170
vector_iostream & write(const std::u16string &s, bool with_null_char)
vector_iostream & clear()
Definition iostream.hpp:277
vector_iostream & write(const optional< U > &opt)
Definition iostream.hpp:141
span< const uint8_t > data() const
Definition iostream.hpp:273
vector_iostream & increase_capacity(size_t size)
Definition iostream.hpp:55
vector_iostream & init_fixups(size_t count)
Definition iostream.hpp:214
vector_iostream & move(std::vector< uint8_t > &c)
Definition iostream.hpp:152
T * edit_as(size_t pos)
Definition iostream.hpp:252
vector_iostream & write_sized_int(uint64_t value, size_t size)
Definition iostream.hpp:88
vector_iostream & write(const std::pair< T, T > &p)
Definition iostream.hpp:117
vector_iostream & write(const std::string &s)
Definition iostream.hpp:73
std::streampos pos_type
Definition iostream.hpp:36
vector_iostream & record_fixup(size_t id)
Definition iostream.hpp:228
vector_iostream & record_fixup(size_t id, bool cond)
Definition iostream.hpp:220
vector_iostream()=default
const std::vector< uint64_t > & get_fixups(size_t id) const
Definition iostream.hpp:241
pos_type tellp() const
Definition iostream.hpp:166
vector_iostream & write(const vector_iostream &other)
Definition iostream.hpp:93
vector_iostream & write(span< const uint8_t > sp)
Definition iostream.hpp:62
vector_iostream & align(size_t alignment, uint8_t fill=0)
vector_iostream & reserve(size_t size)
Definition iostream.hpp:50
void set_endian_swap(bool swap)
Definition iostream.hpp:194
RELOC_OP
Definition iostream.hpp:38
@ SUB
Definition iostream.hpp:39
@ ADD
Definition iostream.hpp:39
vector_iostream & write(std::vector< uint8_t > s)
Definition iostream.hpp:66
vector_iostream & write(const T &t)
Definition iostream.hpp:98
std::vector< uint8_t >::const_iterator end() const
Definition iostream.hpp:294
T * edit_as()
Definition iostream.hpp:246
static size_t uleb128_size(uint64_t value)
std::streamoff off_type
Definition iostream.hpp:37
std::vector< uint8_t >::iterator begin()
Definition iostream.hpp:282
vector_iostream & write(const std::vector< T > &elements)
Definition iostream.hpp:133
vector_iostream(std::vector< uint8_t > &ref)
Definition iostream.hpp:43
vector_iostream & write_sleb128(int64_t value)
const vector_iostream & copy_into(const span< uint8_t > &sp, size_t sz) const
Definition iostream.hpp:258
std::vector< uint8_t >::const_iterator begin() const
Definition iostream.hpp:290
vector_iostream & write(size_t count, uint8_t value)
Definition iostream.hpp:83
vector_iostream(bool endian_swap)
Definition iostream.hpp:46
vector_iostream & pad(size_t size, uint8_t value=0)
Definition iostream.hpp:179
vector_iostream & get(std::vector< uint8_t > &c)
Definition iostream.hpp:148
LIEF namespace.
Definition Abstract/Binary.hpp:36
tcb::span< ElementType, Extent > span
Definition span.hpp:22
void swap_endian(T *)
Definition endianness_support.hpp:116