Commit 64dbf780 authored by Dominik Charousset's avatar Dominik Charousset

bugfix

parent 32de80f3
......@@ -62,30 +62,24 @@ struct vg_fwd
typename util::rm_ref<T>::type> {
};
template<typename FilteredPattern>
class value_guard {
typename tdata_from_type_list<FilteredPattern>::type m_args;
template<typename... Args>
static inline bool _eval(const util::void_type&, const tdata<>&, const Args&...) {
return true;
}
template<typename T0, typename T1>
static inline bool cmp(const T0& lhs, const T1& rhs) {
template<typename T>
struct vg_cmp {
template<typename U>
inline static bool _(const T& lhs, const U& rhs) {
return lhs == rhs;
}
};
template<typename T0, typename T1>
static inline bool cmp(const T0& lhs, const std::reference_wrapper<T1>& rhs) {
return lhs == rhs.get();
template<>
struct vg_cmp<util::void_type> {
template<typename T>
inline static bool _(const util::void_type&, const T&) {
return true;
}
};
template<typename Head, typename Tail0, typename... Tail, typename Arg0, typename... Args>
static inline bool _eval(const Head& head, const tdata<Tail0, Tail...>& tail,
const Arg0& arg0, const Args&... args) {
return cmp(head, arg0) && _eval(tail.head, tail.tail(), args...);
}
template<typename FilteredPattern>
class value_guard {
public:
......@@ -100,6 +94,39 @@ class value_guard {
inline bool operator()(const Args&... args) const {
return _eval(m_args.head, m_args.tail(), args...);
}
private:
typename tdata_from_type_list<FilteredPattern>::type m_args;
template<typename T, typename U>
static inline bool cmp(const T& lhs, const U& rhs) {
return vg_cmp<T>::_(lhs, rhs);
}
template<typename T, typename U>
static inline bool cmp(const T& lhs, const std::reference_wrapper<U>& rhs) {
return vg_cmp<T>::_(lhs, rhs.get());
}
static inline bool _eval(const util::void_type&, const tdata<>&) {
return true;
}
template<typename Head, typename Arg0, typename... Args>
static inline bool _eval(const Head& head, const tdata<>&,
const Arg0& arg0, const Args&...) {
return cmp(head, arg0);
}
template<typename Head,
typename Tail0, typename... Tail,
typename Arg0, typename... Args>
static inline bool _eval(const Head& head, const tdata<Tail0,Tail...>& tail,
const Arg0& arg0, const Args&... args) {
return cmp(head, arg0) && _eval(tail.head, tail.tail(), args...);
}
};
} } // namespace cppa::detail
......
......@@ -41,9 +41,6 @@ struct void_type {
constexpr void_type(const Arg&) { }
};
inline bool operator==(const void_type&, const void_type&) { return true; }
inline bool operator!=(const void_type&, const void_type&) { return false; }
} } // namespace cppa::util
#endif // LIBCPPA_UTIL_VOID_TYPE_HPP
......@@ -143,11 +143,11 @@ void deserialize_nullptr(deserializer* source) {
source->end_object();
}
class void_type_tinfo : public util::abstract_uniform_type_info<void_type> {
class void_type_tinfo : public uniform_type_info {
protected:
void serialize(void const*, serializer* sink) const {
void serialize(const void*, serializer* sink) const {
serialize_nullptr(sink);
}
......@@ -159,6 +159,25 @@ class void_type_tinfo : public util::abstract_uniform_type_info<void_type> {
deserialize_nullptr(source);
}
bool equals(const void*, const void*) const {
return true;
}
void* new_instance(const void*) const {
return new void_type;
}
void delete_instance(void* instance) const {
delete reinterpret_cast<void_type*>(instance);
}
public:
bool equals(const std::type_info &tinfo) const {
return typeid(void_type) == tinfo;
}
};
class actor_ptr_tinfo : public util::abstract_uniform_type_info<actor_ptr> {
......@@ -232,7 +251,7 @@ class actor_ptr_tinfo : public util::abstract_uniform_type_info<actor_ptr> {
protected:
void serialize(void const* ptr, serializer* sink) const {
void serialize(const void* ptr, serializer* sink) const {
s_serialize(*reinterpret_cast<const actor_ptr*>(ptr),
sink,
name());
......@@ -287,7 +306,7 @@ class group_ptr_tinfo : public util::abstract_uniform_type_info<group_ptr> {
protected:
void serialize(void const* ptr, serializer* sink) const {
void serialize(const void* ptr, serializer* sink) const {
s_serialize(*reinterpret_cast<const group_ptr*>(ptr),
sink,
name());
......@@ -365,7 +384,7 @@ class channel_ptr_tinfo : public util::abstract_uniform_type_info<channel_ptr> {
protected:
void serialize(void const* instance, serializer* sink) const {
void serialize(const void* instance, serializer* sink) const {
s_serialize(*reinterpret_cast<const channel_ptr*>(instance),
sink,
name(),
......@@ -425,7 +444,7 @@ class any_tuple_tinfo : public util::abstract_uniform_type_info<any_tuple> {
protected:
void serialize(void const* instance, serializer* sink) const {
void serialize(const void* instance, serializer* sink) const {
s_serialize(*reinterpret_cast<const any_tuple*>(instance),sink,name());
}
......@@ -444,7 +463,7 @@ class addr_msg_tinfo : public util::abstract_uniform_type_info<addressed_message
public:
virtual void serialize(void const* instance, serializer* sink) const {
virtual void serialize(const void* instance, serializer* sink) const {
const addressed_message& msg = *reinterpret_cast<const addressed_message*>(instance);
const any_tuple& data = msg.content();
sink->begin_object(name());
......@@ -493,7 +512,7 @@ class process_info_ptr_tinfo : public util::abstract_uniform_type_info<process_i
public:
virtual void serialize(void const* instance, serializer* sink) const {
virtual void serialize(const void* instance, serializer* sink) const {
auto& ptr = *reinterpret_cast<ptr_type const*>(instance);
if (ptr == nullptr) {
serialize_nullptr(sink);
......@@ -538,7 +557,7 @@ class atom_value_tinfo : public util::abstract_uniform_type_info<atom_value> {
public:
virtual void serialize(void const* instance, serializer* sink) const {
virtual void serialize(const void* instance, serializer* sink) const {
auto val = reinterpret_cast<const atom_value*>(instance);
sink->begin_object(name());
sink->write_value(static_cast<std::uint64_t>(*val));
......@@ -559,7 +578,7 @@ class atom_value_tinfo : public util::abstract_uniform_type_info<atom_value> {
class duration_tinfo : public util::abstract_uniform_type_info<util::duration> {
virtual void serialize(void const* instance, serializer* sink) const {
virtual void serialize(const void* instance, serializer* sink) const {
auto val = reinterpret_cast<const util::duration*>(instance);
sink->begin_object(name());
sink->write_value(static_cast<std::uint32_t>(val->unit));
......
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