Commit 47f19c7a authored by Marian Triebe's avatar Marian Triebe

Prevent nested message views

Closes #233
parent 17a0506b
...@@ -48,14 +48,7 @@ class decorated_tuple : public message_data { ...@@ -48,14 +48,7 @@ class decorated_tuple : public message_data {
using pointer = message_data::ptr; using pointer = message_data::ptr;
// creates a typed subtuple from `d` with mapping `v` // creates a typed subtuple from `d` with mapping `v`
static inline pointer create(pointer d, vector_type v) { static pointer create(pointer d, vector_type v);
return pointer{new decorated_tuple(std::move(d), std::move(v))};
}
// creates a typed subtuple from `d` with an offset
static inline pointer create(pointer d, size_t offset) {
return pointer{new decorated_tuple(std::move(d), offset)};
}
void* mutable_at(size_t pos) override; void* mutable_at(size_t pos) override;
...@@ -74,6 +67,14 @@ class decorated_tuple : public message_data { ...@@ -74,6 +67,14 @@ class decorated_tuple : public message_data {
uint16_t type_nr_at(size_t pos) const override; uint16_t type_nr_at(size_t pos) const override;
const pointer& decorated() const {
return m_decorated;
}
const vector_type& mapping() const {
return m_mapping;
}
private: private:
pointer m_decorated; pointer m_decorated;
...@@ -82,10 +83,6 @@ class decorated_tuple : public message_data { ...@@ -82,10 +83,6 @@ class decorated_tuple : public message_data {
void init(); void init();
void init(size_t);
decorated_tuple(pointer, size_t);
decorated_tuple(pointer, vector_type&&); decorated_tuple(pointer, vector_type&&);
decorated_tuple(const decorated_tuple&) = default; decorated_tuple(const decorated_tuple&) = default;
......
...@@ -22,6 +22,22 @@ ...@@ -22,6 +22,22 @@
namespace caf { namespace caf {
namespace detail { namespace detail {
using vector_type = std::vector<size_t>;
using pointer = message_data::ptr;
pointer decorated_tuple::create(pointer d, vector_type v) {
auto ptr = dynamic_cast<const decorated_tuple*>(d.get());
if (ptr) {
d = ptr->decorated();
auto& pmap = ptr->mapping();
for (size_t i = 0; i < v.size(); ++i) {
v[i] = pmap[v[i]];
}
}
return pointer{new decorated_tuple(std::move(d), std::move(v))};
}
void* decorated_tuple::mutable_at(size_t pos) { void* decorated_tuple::mutable_at(size_t pos) {
CAF_REQUIRE(pos < size()); CAF_REQUIRE(pos < size());
return m_decorated->mutable_at(m_mapping[pos]); return m_decorated->mutable_at(m_mapping[pos]);
...@@ -68,16 +84,6 @@ void decorated_tuple::init() { ...@@ -68,16 +84,6 @@ void decorated_tuple::init() {
} }
} }
void decorated_tuple::init(size_t offset) {
if (offset < m_decorated->size()) {
size_t i = offset;
size_t new_size = m_decorated->size() - offset;
m_mapping.resize(new_size);
std::generate(m_mapping.begin(), m_mapping.end(), [&] { return i++; });
}
init();
}
decorated_tuple::decorated_tuple(pointer d, vector_type&& v) decorated_tuple::decorated_tuple(pointer d, vector_type&& v)
: m_decorated(std::move(d)), : m_decorated(std::move(d)),
m_mapping(std::move(v)), m_mapping(std::move(v)),
...@@ -85,11 +91,5 @@ decorated_tuple::decorated_tuple(pointer d, vector_type&& v) ...@@ -85,11 +91,5 @@ decorated_tuple::decorated_tuple(pointer d, vector_type&& v)
init(); init();
} }
decorated_tuple::decorated_tuple(pointer d, size_t offset)
: m_decorated(std::move(d)),
m_type_token(0xFFFFFFFF) {
init(offset);
}
} // namespace detail } // namespace detail
} // namespace caf } // namespace caf
...@@ -86,7 +86,10 @@ message message::drop(size_t n) const { ...@@ -86,7 +86,10 @@ message message::drop(size_t n) const {
if (n >= size()) { if (n >= size()) {
return message{}; return message{};
} }
return message{detail::decorated_tuple::create(m_vals, n)}; std::vector<size_t> mapping (size() - n);
size_t i = n;
std::generate(mapping.begin(), mapping.end(), [&] { return i++; });
return message {detail::decorated_tuple::create(m_vals, mapping)};
} }
message message::drop_right(size_t n) const { message message::drop_right(size_t n) const {
......
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