eet-cxx: add implementation for eet C++.
[platform/upstream/efl.git] / src / bindings / eet_cxx / eet_composite.hh
1 #ifndef EFL_EET_COMPOSITE_HH_
2 #define EFL_EET_COMPOSITE_HH_
3
4 namespace efl { namespace eet {
5
6 template <typename, typename...> struct descriptor;
7
8 namespace _detail {
9
10 struct member_desc_info
11 {
12   const char* name;
13   std::size_t offset;
14 };
15
16 template <std::size_t E, typename U, typename... Types>
17 void descriptor_register_composite_member( ::Eet_Data_Descriptor*, int
18                                            , eet::descriptor<U, Types...>const*
19                                            , std::integral_constant<std::size_t, E>)
20 {
21 }
22
23 template <std::size_t E, typename U, typename... Types, std::size_t I>
24 void descriptor_register_composite_member( ::Eet_Data_Descriptor* cls, int offset_base
25                                            , eet::descriptor<U, Types...>const* descriptor
26                                            , std::integral_constant<std::size_t, I>
27                                            , typename std::enable_if<E != I>::type* = 0)
28 {
29   typedef typename std::tuple_element<I, std::tuple<Types...> >::type member_type;
30   eet_data_descriptor_element_add(cls, descriptor->get_member_info()[I].name
31                                   , _eet_type<member_type>::value, EET_G_UNKNOWN
32                                   , offset_base + descriptor->get_member_info()[I].offset
33                                   , 0, nullptr, nullptr);
34
35   _detail::descriptor_register_composite_member<E>
36     (cls, offset_base, descriptor, std::integral_constant<std::size_t, I+1>());
37 }
38
39 template <typename U, typename...Types>
40 void descriptor_type_register_composite( ::Eet_Data_Descriptor* cls, member_desc_info info
41                                          , eet::descriptor<U, Types...>const* descriptor)
42 {
43   _detail::descriptor_register_composite_member<eet::descriptor<U, Types...>::members::value>
44     (cls, info.offset, descriptor, std::integral_constant<std::size_t, 0u>());
45 }
46
47 } } }
48
49 #endif