Commit 3ed3da35 authored by Dominik Charousset's avatar Dominik Charousset

Add missing access policy overload for enums

This patch adds the assignment overload for the apply operator to
`memptr_access_policy`. This fixes #149.
parent 8e7a1b40
...@@ -267,31 +267,37 @@ class member_tinfo : public detail::abstract_uniform_type_info<T> { ...@@ -267,31 +267,37 @@ class member_tinfo : public detail::abstract_uniform_type_info<T> {
}; };
template <class T, class A, class S> template <class T, class A, class S>
class member_tinfo<T, A, S, false, class member_tinfo<T, A, S, false, true>
true> : public detail::abstract_uniform_type_info<T> { : public detail::abstract_uniform_type_info<T> {
public: public:
member_tinfo(const A&, const S&) {
// nop
}
member_tinfo(const A&, const S&) {} member_tinfo(const A&) {
// nop
member_tinfo(const A&) {} }
member_tinfo() {}
void serialize(const void*, serializer*) const override {} member_tinfo() {
// nop
}
void deserialize(void*, deserializer*) const override {} void serialize(const void*, serializer*) const override {
// nop
}
void deserialize(void*, deserializer*) const override {
// nop
}
}; };
template <class T, class AccessPolicy, class SerializePolicy> template <class T, class AccessPolicy, class SerializePolicy>
class member_tinfo<T, AccessPolicy, SerializePolicy, true, class member_tinfo<T, AccessPolicy, SerializePolicy, true, false>
false> : public detail::abstract_uniform_type_info<T> { : public detail::abstract_uniform_type_info<T> {
using value_type = typename std::underlying_type<T>::type; using value_type = typename std::underlying_type<T>::type;
public: public:
member_tinfo(AccessPolicy apol, SerializePolicy spol) member_tinfo(AccessPolicy apol, SerializePolicy spol)
: m_apol(std::move(apol)), m_spol(std::move(spol)) {} : m_apol(std::move(apol)), m_spol(std::move(spol)) {}
...@@ -311,7 +317,6 @@ class member_tinfo<T, AccessPolicy, SerializePolicy, true, ...@@ -311,7 +317,6 @@ class member_tinfo<T, AccessPolicy, SerializePolicy, true,
} }
private: private:
AccessPolicy m_apol; AccessPolicy m_apol;
SerializePolicy m_spol; SerializePolicy m_spol;
...@@ -319,7 +324,6 @@ class member_tinfo<T, AccessPolicy, SerializePolicy, true, ...@@ -319,7 +324,6 @@ class member_tinfo<T, AccessPolicy, SerializePolicy, true,
template <class T, class C> template <class T, class C>
class memptr_access_policy { class memptr_access_policy {
public: public:
memptr_access_policy(const memptr_access_policy&) = default; memptr_access_policy(const memptr_access_policy&) = default;
...@@ -337,12 +341,16 @@ class memptr_access_policy { ...@@ -337,12 +341,16 @@ class memptr_access_policy {
return *ptr.*m_memptr; return *ptr.*m_memptr;
} }
template <class Arg>
inline void operator()(void* vptr, Arg&& value) const {
auto ptr = reinterpret_cast<C*>(vptr);
(*ptr.*m_memptr) = std::forward<Arg>(value);
}
static constexpr bool grants_mutable_access = true; static constexpr bool grants_mutable_access = true;
private: private:
T C::*m_memptr; T C::*m_memptr;
}; };
template <class C, typename GRes, typename SRes, typename SArg> template <class C, typename GRes, typename SRes, typename SArg>
...@@ -363,7 +371,7 @@ class getter_setter_access_policy { ...@@ -363,7 +371,7 @@ class getter_setter_access_policy {
template <class Arg> template <class Arg>
inline void operator()(void* vptr, Arg&& value) const { inline void operator()(void* vptr, Arg&& value) const {
auto ptr = reinterpret_cast<C*>(vptr); auto ptr = reinterpret_cast<C*>(vptr);
return (*ptr.*m_set)(std::forward<Arg>(value)); (*ptr.*m_set)(std::forward<Arg>(value));
} }
static constexpr bool grants_mutable_access = false; static constexpr bool grants_mutable_access = false;
...@@ -404,7 +412,7 @@ uniform_type_info_ptr new_member_tinfo(T C::*memptr) { ...@@ -404,7 +412,7 @@ uniform_type_info_ptr new_member_tinfo(T C::*memptr) {
template <class T, class C> template <class T, class C>
uniform_type_info_ptr new_member_tinfo(T C::*memptr, uniform_type_info_ptr new_member_tinfo(T C::*memptr,
uniform_type_info_ptr meminf) { uniform_type_info_ptr meminf) {
using access_policy = memptr_access_policy<T, C>; using access_policy = memptr_access_policy<T, C>;
using tinfo = member_tinfo<T, access_policy, forwarding_serialize_policy>; using tinfo = member_tinfo<T, access_policy, forwarding_serialize_policy>;
return uniform_type_info_ptr(new tinfo(memptr, std::move(meminf))); return uniform_type_info_ptr(new tinfo(memptr, std::move(meminf)));
...@@ -412,7 +420,7 @@ uniform_type_info_ptr new_member_tinfo(T C::*memptr, ...@@ -412,7 +420,7 @@ uniform_type_info_ptr new_member_tinfo(T C::*memptr,
template <class C, typename GRes, typename SRes, typename SArg> template <class C, typename GRes, typename SRes, typename SArg>
uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const, uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const,
SRes (C::*setter)(SArg)) { SRes (C::*setter)(SArg)) {
using access_policy = getter_setter_access_policy<C, GRes, SRes, SArg>; using access_policy = getter_setter_access_policy<C, GRes, SRes, SArg>;
using value_type = typename detail::rm_const_and_ref<GRes>::type; using value_type = typename detail::rm_const_and_ref<GRes>::type;
using result_type = member_tinfo<value_type, access_policy>; using result_type = member_tinfo<value_type, access_policy>;
...@@ -422,7 +430,7 @@ uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const, ...@@ -422,7 +430,7 @@ uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const,
template <class C, typename GRes, typename SRes, typename SArg> template <class C, typename GRes, typename SRes, typename SArg>
uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const, uniform_type_info_ptr new_member_tinfo(GRes (C::*getter)() const,
SRes (C::*setter)(SArg), SRes (C::*setter)(SArg),
uniform_type_info_ptr meminf) { uniform_type_info_ptr meminf) {
using access_policy = getter_setter_access_policy<C, GRes, SRes, SArg>; using access_policy = getter_setter_access_policy<C, GRes, SRes, SArg>;
using value_type = typename detail::rm_const_and_ref<GRes>::type; using value_type = typename detail::rm_const_and_ref<GRes>::type;
......
...@@ -33,11 +33,23 @@ inline bool operator==(const foo& lhs, const foo& rhs) { ...@@ -33,11 +33,23 @@ inline bool operator==(const foo& lhs, const foo& rhs) {
return lhs.value == rhs.value; return lhs.value == rhs.value;
} }
enum class test_enum {
test_value1,
test_value2
};
struct test_struct {
test_enum test_value;
};
} // namespace <anonymous> } // namespace <anonymous>
using namespace caf; using namespace caf;
bool check_types(const std::set<std::string>& expected) { bool check_types(const std::set<std::string>& expected) {
// check whether enums can be announced as members
announce<test_enum>();
announce<test_struct>(&test_struct::test_value);
// holds the type names we see at runtime // holds the type names we see at runtime
std::set<std::string> found; std::set<std::string> found;
// fetch all available type names // fetch all available type names
......
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