/* * Copyright 2019 by its authors. See AUTHORS. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EFL_EET_REGISTER_HH_ #define EFL_EET_REGISTER_HH_ #include #include namespace efl { namespace eet { template struct descriptor; namespace _detail { template struct member_type; template struct member_type { typedef T type; }; template struct object_type; template struct object_type { typedef U type; }; template struct member_info { typedef F member_type; const char* name; F member; eet::descriptor const* descriptor; }; template struct member_info { typedef F member_type; const char* name; F member; }; template void descriptor_type_register_impl (std::false_type , ::Eet_Data_Descriptor* cls , member_desc_info i , member_info arg0 , typename std::enable_if < !std::is_pointer::type>::value >::type* = 0) { // composition by value static_assert(std::is_member_object_pointer::value, ""); typedef typename _detail::member_type::type member_type; static_assert(!std::is_pointer::value, ""); static_assert(std::is_same::value, ""); static_assert(std::is_pod::value, ""); _detail::descriptor_type_register_composite(cls, i, arg0.descriptor); } template void descriptor_type_register_impl (std::false_type , ::Eet_Data_Descriptor* cls , member_desc_info i , member_info arg0 , typename std::enable_if < std::is_pointer::type>::value >::type* = 0) { // composition by pointer static_assert(std::is_member_object_pointer::value, ""); typedef typename _detail::member_type::type pointer_member_type; static_assert(std::is_pointer::value, ""); typedef typename std::remove_pointer::type member_type; static_assert(std::is_same::value, ""); eet_data_descriptor_element_add (cls, i.name , EET_T_UNKNOW , EET_G_UNKNOWN , i.offset , 0 , nullptr , const_cast*>(arg0.descriptor)->native_handle()); } template void descriptor_type_register_impl (std::true_type, ::Eet_Data_Descriptor* cls , member_desc_info i , member_info) { static_assert(std::is_member_object_pointer::value, ""); typedef typename _detail::member_type::type member_type; eet_data_descriptor_element_add(cls, i.name, _eet_type::value, EET_G_UNKNOWN , i.offset, 0, nullptr, nullptr); } inline void descriptor_type_register( ::Eet_Data_Descriptor*, member_desc_info*) { } template void descriptor_type_register( ::Eet_Data_Descriptor* cls, member_desc_info* i , member_info a0, FArgs... args) { static_assert(std::is_member_object_pointer::value, ""); typedef typename _detail::member_type::type member_type; _detail::descriptor_type_register_impl(is_eet_primitive(), cls, *i, a0); _detail::descriptor_type_register(cls, ++i, args...); } } } } #endif