Commit 82435879 authored by Dominik Charousset's avatar Dominik Charousset

Fix message builder

parent 89115514
...@@ -125,7 +125,9 @@ class message_builder { ...@@ -125,7 +125,9 @@ class message_builder {
template <class T> template <class T>
message_builder& message_builder&
append_impl(typename detail::implicit_conversions<T>::type what) { append_impl(typename unbox_message_element<
typename detail::implicit_conversions<T>::type
>::type what) {
using type = decltype(what); using type = decltype(what);
auto uti = uniform_typeid<type>(); auto uti = uniform_typeid<type>();
auto uval = uti->create(); auto uval = uti->create();
......
...@@ -31,24 +31,19 @@ class message_builder::dynamic_msg_data : public detail::message_data { ...@@ -31,24 +31,19 @@ class message_builder::dynamic_msg_data : public detail::message_data {
using message_data::const_iterator; using message_data::const_iterator;
dynamic_msg_data() : m_type_token(0xFFFFFFFF) { dynamic_msg_data() {
// nop // nop
} }
dynamic_msg_data(const dynamic_msg_data& other) dynamic_msg_data(const dynamic_msg_data& other) {
: m_type_token(other.m_type_token) {
for (auto& d : other.m_elements) { for (auto& d : other.m_elements) {
m_elements.push_back(d->copy()); m_elements.push_back(d->copy());
} }
} }
dynamic_msg_data(std::vector<uniform_value>&& data) dynamic_msg_data(std::vector<uniform_value>&& data)
: m_elements(std::move(data)), : m_elements(std::move(data)) {
m_type_token(0xFFFFFFFF) { // nop
for (auto& e : m_elements) {
m_type_token <<= 6;
m_type_token |= e->ti->type_nr();
}
} }
~dynamic_msg_data(); ~dynamic_msg_data();
...@@ -75,7 +70,10 @@ class message_builder::dynamic_msg_data : public detail::message_data { ...@@ -75,7 +70,10 @@ class message_builder::dynamic_msg_data : public detail::message_data {
const std::type_info* rtti) const override { const std::type_info* rtti) const override {
CAF_REQUIRE(typenr != 0 || rtti != nullptr); CAF_REQUIRE(typenr != 0 || rtti != nullptr);
auto uti = m_elements[pos]->ti; auto uti = m_elements[pos]->ti;
return uti->type_nr() == typenr || uti->equal_to(*rtti); if (uti->type_nr() != typenr) {
return false;
}
return typenr != 0 || uti->equal_to(*rtti);
} }
const char* uniform_name_at(size_t pos) const override { const char* uniform_name_at(size_t pos) const override {
...@@ -87,11 +85,14 @@ class message_builder::dynamic_msg_data : public detail::message_data { ...@@ -87,11 +85,14 @@ class message_builder::dynamic_msg_data : public detail::message_data {
} }
uint32_t type_token() const override { uint32_t type_token() const override {
return m_type_token; uint32_t result = 0xFFFFFFFF;
for (auto& e : m_elements) {
result = (result << 6) | e->ti->type_nr();
}
return result;
} }
std::vector<uniform_value> m_elements; std::vector<uniform_value> m_elements;
uint32_t m_type_token;
}; };
message_builder::dynamic_msg_data::~dynamic_msg_data() { message_builder::dynamic_msg_data::~dynamic_msg_data() {
......
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