eo-cxx: Removed the necessity of copying for interoperability of containers
authorFelipe Magno de Almeida <felipe@expertisesolutions.com.br>
Fri, 18 Jul 2014 00:46:13 +0000 (21:46 -0300)
committerFelipe Magno de Almeida <felipe@expertisesolutions.com.br>
Fri, 18 Jul 2014 21:57:14 +0000 (18:57 -0300)
src/bindings/eo_cxx/eo_cxx_interop.hh

index 8d17e89902fb154b1351f0a05b2776f3aefdec0b..a6b3b37188ce3513906141685bec14cc8da948b7 100644 (file)
@@ -38,7 +38,7 @@ to_c(bool x)
 }
 
 template <typename T>
-T to_c(T const& v)
+T to_c(T const& v, typename std::enable_if<!std::is_base_of<efl::eo::base, T>::value>::type* = 0)
 {
    return v;
 }
@@ -121,53 +121,24 @@ struct traits
 };
 
 template <typename T, typename ...Args>
-inline efl::eina::range_ptr_list<T>
-to_cxx(const Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_ptr_list<T> >)
+inline efl::eina::range_list<T>
+to_cxx(const Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_list<T> >)
 {
-   efl::eina::ptr_list<T> list;
-   const Eina_List *l;
-   void *val;
-   EINA_LIST_FOREACH(x, l, val)
-     {
-        typedef typename traits<T>::type type;
-        list.push_back(new T (to_cxx(static_cast<type>(val), std::tuple<Args...>()
-                                     , tag<T>())));
-     }
-   return list;
+   return efl::eina::list<T> {x};
 }
 
 template <typename T, typename ...Args>
-inline efl::eina::range_ptr_list<T>
-to_cxx(Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_ptr_list<T> >)
-{
-   efl::eina::ptr_list<T> list;
-   Eina_List *l;
-   void *val;
-   EINA_LIST_FOREACH(x, l, val)
-     {
-        typedef typename traits<T>::type type;
-        list.push_back(new T (to_cxx(static_cast<type>(val), std::tuple<Args...>()
-                                     , tag<T>())));
-     }
-   eina_list_free(x);
-   return list;
+inline efl::eina::range_list<T>
+to_cxx(Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_list<T> >)
+{
+   return efl::eina::range_list<T>{x};
 }
 
 template <typename T, typename ...Args>
-inline efl::eina::ptr_list<T>
-to_cxx(Eina_List* x, std::tuple<std::true_type, Args...>, tag< efl::eina::ptr_list<T> >)
-{
-   efl::eina::ptr_list<T> list;
-   Eina_List *l;
-   void *val;
-   EINA_LIST_FOREACH(x, l, val)
-     {
-        typedef typename traits<T>::type type;
-        list.push_back(new T (to_cxx(static_cast<type>(val), std::tuple<Args...>()
-                                     , tag<T>())));
-     }
-   eina_list_free(x);
-   return list;
+inline efl::eina::list<T>
+to_cxx(Eina_List* x, std::tuple<std::true_type, Args...>, tag< efl::eina::list<T> >)
+{
+   return efl::eina::list<T> {x};
 }
 
 inline eina::stringshare
@@ -190,6 +161,24 @@ to_cxx(Eina_Iterator* x, std::tuple<std::false_type, Args...>, tag< efl::eina::i
    return efl::eina::iterator<T>(x);
 }
 
+template <typename T, typename ...Args>
+T
+to_cxx(Eo const* x, std::tuple<std::false_type, Args...>, tag< T >
+       , typename std::enable_if<std::is_base_of<efl::eo::base, T>::value>* = 0)
+{
+   // Workaround for erroneous constness
+   return T{ ::eo_ref(const_cast<Eo*>(x))};
+}
+
+template <typename T, typename ...Args>
+T
+to_cxx(Eo const* x, std::tuple<std::true_type, Args...>, tag< T >
+       , typename std::enable_if<std::is_base_of<efl::eo::base, T>::value>* = 0)
+{
+   // Workaround for erroneous constness
+   return T{const_cast<Eo*>(x)};
+}
+
 template <typename T, typename U, typename O>
 T to_cxx(U object, O o)
 {