/// /// @file eo_concrete.hh /// #ifndef EFL_CXX_EINA_COPY_TRAITS_HH #define EFL_CXX_EINA_COPY_TRAITS_HH namespace efl { namespace eina { namespace _impl { template struct bool_pack; template struct and_ : std::is_same, bool_pack> {}; } template struct variant; template struct copy_from_c_traits; template struct copy_from_c_traits::value>::type> { static void copy_to_unitialized(T* storage, void const* data) { std::memcpy(storage, data, sizeof(T)); } }; template struct copy_from_c_traits, typename std::enable_if<_impl::and_::value...>::value>::type> { template static void copy_to_unitialized(eina::variant* storage, T const* data) { new (storage) eina::variant{*data}; } }; template struct alloc_to_c_traits; template struct alloc_to_c_traits::value>::type> { typedef T c_type; static c_type* copy_alloc(T const& value) { c_type* v = static_cast(malloc(sizeof(c_type))); std::memcpy(v, &value, sizeof(c_type)); return v; } static void free_alloc(void* data) { ::free(data); } }; } } #endif