From: Felipe Magno de Almeida Date: Wed, 17 Aug 2016 02:26:52 +0000 (-0300) Subject: eo-cxx: Add race promises through eina::variant X-Git-Tag: upstream/1.20.0~4350 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e0b444f95f2831738a307cbf64690d8f3bba63b3;p=platform%2Fupstream%2Fefl.git eo-cxx: Add race promises through eina::variant --- diff --git a/src/bindings/cxx/eina_cxx/eina_copy_traits.hh b/src/bindings/cxx/eina_cxx/eina_copy_traits.hh index 0db8bd8..e6e0164 100644 --- a/src/bindings/cxx/eina_cxx/eina_copy_traits.hh +++ b/src/bindings/cxx/eina_cxx/eina_copy_traits.hh @@ -7,6 +7,15 @@ 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; @@ -19,6 +28,18 @@ struct copy_from_c_traits::val } }; +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; @@ -37,7 +58,7 @@ struct alloc_to_c_traits::valu ::free(data); } }; - + } } #endif diff --git a/src/bindings/cxx/eo_cxx/eo_promise.hh b/src/bindings/cxx/eo_cxx/eo_promise.hh index f9a3261..7c3741a 100644 --- a/src/bindings/cxx/eo_cxx/eo_promise.hh +++ b/src/bindings/cxx/eo_cxx/eo_promise.hh @@ -125,6 +125,50 @@ race_impl(Futures const& ... futures) Efl_Future* future = ::efl_future_race_internal(futures.native_handle()..., NULL); return typename race_result_type::type{ ::efl_ref(future)}; } + +template +struct future_copy_traits +{ + static void copy(T* storage, Efl_Future_Event_Success const* info) + { + eina::copy_from_c_traits::copy_to_unitialized + (storage, info->value); + } +}; + +template +struct future_copy_traits> +{ + template + static void copy_impl(eina::variant*, void const*, int, std::integral_constant + , std::integral_constant) + { + std::abort(); + } + + template + static void copy_impl(eina::variant* storage, void const* value, int index, std::integral_constant + , std::integral_constant max + , typename std::enable_if::type* = 0) + { + if(I == index) + { + eina::copy_from_c_traits>::copy_to_unitialized + (storage, static_cast>::type const*> + (static_cast(value))); + } + else + copy_impl(storage, value, index, std::integral_constant{}, max); + } + + static void copy(eina::variant* storage, Efl_Future_Event_Success const* other_info) + { + Efl_Future_Race_Success const* info = static_cast + (static_cast(other_info)); + copy_impl(storage, info->value, info->index, std::integral_constant{} + , std::integral_constant{}); + } +}; template typename std::enable_if @@ -138,8 +182,7 @@ future_invoke(F f, Efl_Event const* event) try { typename std::aligned_storage::type storage; - eina::copy_from_c_traits::copy_to_unitialized - (static_cast(static_cast(&storage)), info->value); + future_copy_traits::copy(static_cast(static_cast(&storage)), info); auto r = f(*static_cast(static_cast(&storage))); typedef decltype(r) result_type; typedef typename eina::alloc_to_c_traits::c_type c_type; @@ -375,8 +418,7 @@ struct shared_future_1_type : private shared_future_common Efl_Future_Event_Success* info = static_cast(event->info); std::unique_lock l(wait_state->mutex); - eina::copy_from_c_traits::copy_to_unitialized - (static_cast(static_cast(&wait_state->storage)), info->value); + _impl::future_copy_traits::copy(static_cast(static_cast(&wait_state->storage)), info); wait_state->available = true; wait_state->cv.notify_one(); }