1 #ifndef EFL_EET_REGISTER_HH_
2 #define EFL_EET_REGISTER_HH_
5 #include <eet_composite.hh>
7 namespace efl { namespace eet {
9 template <typename, typename...> struct descriptor;
16 template <typename T, typename U>
17 struct member_type<T(U::*)>
25 template <typename T, typename U>
26 struct object_type<T(U::*)>
31 template <typename F, typename T, typename... Args>
34 typedef F member_type;
38 eet::descriptor<T, Args...> const* descriptor;
42 struct member_info<F, void>
44 typedef F member_type;
50 template <typename F, typename U, typename... Args>
51 void descriptor_type_register_impl
53 , ::Eet_Data_Descriptor* cls
55 , member_info<F, U, Args...> arg0
56 , typename std::enable_if
58 !std::is_pointer<typename _detail::member_type<F>::type>::value
61 // composition by value
62 static_assert(std::is_member_object_pointer<F>::value, "");
63 typedef typename _detail::member_type<F>::type member_type;
64 typedef typename _detail::object_type<F>::type object_type;
65 static_assert(!std::is_pointer<member_type>::value, "");
66 static_assert(std::is_same<member_type, U>::value, "");
67 static_assert(std::is_pod<member_type>::value, "");
69 _detail::descriptor_type_register_composite(cls, i, arg0.descriptor);
72 template <typename F, typename U, typename... Args>
73 void descriptor_type_register_impl
75 , ::Eet_Data_Descriptor* cls
77 , member_info<F, U, Args...> arg0
78 , typename std::enable_if
80 std::is_pointer<typename _detail::member_type<F>::type>::value
83 // composition by pointer
84 static_assert(std::is_member_object_pointer<F>::value, "");
85 typedef typename _detail::member_type<F>::type pointer_member_type;
86 typedef typename _detail::object_type<F>::type object_type;
87 static_assert(std::is_pointer<pointer_member_type>::value, "");
88 typedef typename std::remove_pointer<pointer_member_type>::type member_type;
89 static_assert(std::is_same<member_type, U>::value, "");
91 eet_data_descriptor_element_add
98 , const_cast<descriptor<U, Args...>*>(arg0.descriptor)->native_handle());
101 template <typename F>
102 void descriptor_type_register_impl
103 (std::true_type, ::Eet_Data_Descriptor* cls
105 , member_info<F, void>)
107 static_assert(std::is_member_object_pointer<F>::value, "");
108 typedef typename _detail::member_type<F>::type member_type;
109 typedef typename _detail::object_type<F>::type object_type;
111 eet_data_descriptor_element_add(cls, i.name, _eet_type<member_type>::value, EET_G_UNKNOWN
112 , i.offset, 0, nullptr, nullptr);
115 inline void descriptor_type_register( ::Eet_Data_Descriptor*, member_desc_info*)
119 template <typename F, typename D, typename... Args, typename... FArgs>
120 void descriptor_type_register( ::Eet_Data_Descriptor* cls, member_desc_info* i
121 , member_info<F, D, Args...> a0, FArgs... args)
123 static_assert(std::is_member_object_pointer<F>::value, "");
124 typedef typename _detail::member_type<F>::type member_type;
126 _detail::descriptor_type_register_impl(is_eet_primitive<member_type>(), cls, *i, a0);
127 _detail::descriptor_type_register(cls, ++i, args...);