eet-cxx: add implementation for eet C++.
[platform/upstream/efl.git] / src / bindings / eet_cxx / eet_register.hh
1 #ifndef EFL_EET_REGISTER_HH_
2 #define EFL_EET_REGISTER_HH_
3
4 #include <eet_type.hh>
5 #include <eet_composite.hh>
6
7 namespace efl { namespace eet {
8
9 template <typename, typename...> struct descriptor;
10
11 namespace _detail {
12
13 template <typename T>
14 struct member_type;
15
16 template <typename T, typename U>
17 struct member_type<T(U::*)>
18 {
19   typedef T type;
20 };
21
22 template <typename T>
23 struct object_type;
24
25 template <typename T, typename U>
26 struct object_type<T(U::*)>
27 {
28   typedef U type;
29 };
30
31 template <typename F, typename T, typename... Args>
32 struct member_info
33 {
34   typedef F member_type;
35
36   const char* name;
37   F member;
38   eet::descriptor<T, Args...> const* descriptor;
39 };
40
41 template <typename F>
42 struct member_info<F, void>
43 {
44   typedef F member_type;
45
46   const char* name;
47   F member;
48 };
49
50 template <typename F, typename U, typename... Args>
51 void descriptor_type_register_impl
52  (std::false_type
53   , ::Eet_Data_Descriptor* cls
54   , member_desc_info i
55   , member_info<F, U, Args...> arg0
56   , typename std::enable_if
57   <
58     !std::is_pointer<typename _detail::member_type<F>::type>::value
59   >::type* = 0)
60 {
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, "");
68
69   _detail::descriptor_type_register_composite(cls, i, arg0.descriptor);
70 }
71
72 template <typename F, typename U, typename... Args>
73 void descriptor_type_register_impl
74  (std::false_type
75   , ::Eet_Data_Descriptor* cls
76   , member_desc_info i
77   , member_info<F, U, Args...> arg0
78   , typename std::enable_if
79   <
80     std::is_pointer<typename _detail::member_type<F>::type>::value
81   >::type* = 0)
82 {
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, "");
90
91   eet_data_descriptor_element_add
92     (cls, i.name
93      , EET_T_UNKNOW
94      , EET_G_UNKNOWN
95      , i.offset
96      , 0
97      , nullptr
98      , const_cast<descriptor<U, Args...>*>(arg0.descriptor)->native_handle());
99 }
100
101 template <typename F>
102 void descriptor_type_register_impl
103  (std::true_type, ::Eet_Data_Descriptor* cls
104   , member_desc_info i
105   , member_info<F, void>)
106 {
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;
110
111   eet_data_descriptor_element_add(cls, i.name, _eet_type<member_type>::value, EET_G_UNKNOWN
112                                   , i.offset, 0, nullptr, nullptr);
113 }
114
115 inline void descriptor_type_register( ::Eet_Data_Descriptor*, member_desc_info*)
116 {
117 }
118
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)
122 {
123   static_assert(std::is_member_object_pointer<F>::value, "");
124   typedef typename _detail::member_type<F>::type member_type;
125
126   _detail::descriptor_type_register_impl(is_eet_primitive<member_type>(), cls, *i, a0);
127   _detail::descriptor_type_register(cls, ++i, args...);
128 }
129
130 } } }
131
132 #endif