Commit 47538648 authored by Dominik Charousset's avatar Dominik Charousset

Switch to offset instead of using vector::iterator

parent 79081a84
...@@ -41,6 +41,14 @@ public: ...@@ -41,6 +41,14 @@ public:
binary_serializer(execution_unit* ctx, buffer& buf); binary_serializer(execution_unit* ctx, buffer& buf);
binary_serializer(binary_serializer&&) = default;
binary_serializer& operator=(binary_serializer&&) = default;
binary_serializer(const binary_serializer&) = delete;
binary_serializer& operator=(const binary_serializer&) = delete;
// -- position management ---------------------------------------------------- // -- position management ----------------------------------------------------
/// Sets the write position to given offset. /// Sets the write position to given offset.
...@@ -104,7 +112,7 @@ protected: ...@@ -104,7 +112,7 @@ protected:
private: private:
buffer& buf_; buffer& buf_;
buffer::iterator write_pos_; size_t write_pos_;
}; };
} // namespace caf } // namespace caf
...@@ -38,28 +38,24 @@ error apply_int(binary_serializer& bs, T x) { ...@@ -38,28 +38,24 @@ error apply_int(binary_serializer& bs, T x) {
} // namespace <anonmyous> } // namespace <anonmyous>
binary_serializer::binary_serializer(actor_system& sys, buffer& buf) binary_serializer::binary_serializer(actor_system& sys, buffer& buf)
: super(sys), buf_(buf), write_pos_(buf.end()) { : super(sys), buf_(buf), write_pos_(buf_.size()) {
// nop // nop
} }
binary_serializer::binary_serializer(execution_unit* ctx, buffer& buf) binary_serializer::binary_serializer(execution_unit* ctx, buffer& buf)
: super(ctx), buf_(buf), write_pos_(buf.end()) { : super(ctx), buf_(buf), write_pos_(buf_.size()) {
// nop // nop
} }
void binary_serializer::seek(size_t offset) { void binary_serializer::seek(size_t offset) {
write_pos_ = buf_.begin() + offset; write_pos_ = offset;
} }
void binary_serializer::skip(size_t num_bytes) { void binary_serializer::skip(size_t num_bytes) {
auto last = buf_.end(); auto remaining = buf_.size() - write_pos_;
auto remaining = static_cast<size_t>(std::distance(write_pos_, last)); if (remaining < num_bytes)
if (remaining >= num_bytes) { buf_.insert(buf_.end(), num_bytes - remaining, 0);
write_pos_ += num_bytes; write_pos_ += num_bytes;
} else {
buf_.insert(last, num_bytes - remaining, 0);
write_pos_ = buf_.end();
}
} }
error binary_serializer::begin_object(uint16_t& nr, std::string& name) { error binary_serializer::begin_object(uint16_t& nr, std::string& name) {
...@@ -84,20 +80,21 @@ error binary_serializer::end_sequence() { ...@@ -84,20 +80,21 @@ error binary_serializer::end_sequence() {
} }
error binary_serializer::apply_raw(size_t num_bytes, void* data) { error binary_serializer::apply_raw(size_t num_bytes, void* data) {
CAF_ASSERT(write_pos_ <= buf_.size());
auto ptr = reinterpret_cast<char*>(data); auto ptr = reinterpret_cast<char*>(data);
auto last = buf_.end(); auto buf_size = buf_.size();
if (write_pos_ == last) { if (write_pos_ == buf_size) {
buf_.insert(last, ptr, ptr + num_bytes); buf_.insert(buf_.end(), ptr, ptr + num_bytes);
write_pos_ = buf_.end(); } else if (write_pos_ + num_bytes <= buf_size) {
} else if (write_pos_ + num_bytes < last) { memcpy(buf_.data() + write_pos_, ptr, num_bytes);
memcpy(&(*write_pos_), ptr, num_bytes);
write_pos_ += num_bytes;
} else { } else {
auto remaining = static_cast<size_t>(last - write_pos_); auto remaining = buf_size - write_pos_;
memcpy(&(*write_pos_), ptr, remaining); CAF_ASSERT(remaining < num_bytes);
buf_.insert(last, ptr + remaining, ptr + num_bytes); memcpy(buf_.data() + write_pos_, ptr, remaining);
write_pos_ = buf_.end(); buf_.insert(buf_.end(), ptr + remaining, ptr + num_bytes);
} }
write_pos_ += num_bytes;
CAF_ASSERT(write_pos_ <= buf_.size());
return none; return none;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment