eo-cxx: Removed the necessity of copying for interoperability of containers

This commit is contained in:
Felipe Magno de Almeida 2014-07-17 21:46:13 -03:00
parent c4faec118e
commit 1848d39588
1 changed files with 28 additions and 39 deletions

View File

@ -38,7 +38,7 @@ to_c(bool x)
} }
template <typename T> 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; return v;
} }
@ -121,53 +121,24 @@ struct traits
}; };
template <typename T, typename ...Args> template <typename T, typename ...Args>
inline 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_ptr_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; return efl::eina::list<T> {x};
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;
} }
template <typename T, typename ...Args> template <typename T, typename ...Args>
inline efl::eina::range_ptr_list<T> inline efl::eina::range_list<T>
to_cxx(Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_ptr_list<T> >) to_cxx(Eina_List* x, std::tuple<std::false_type, Args...>, tag< efl::eina::range_list<T> >)
{ {
efl::eina::ptr_list<T> list; return efl::eina::range_list<T>{x};
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;
} }
template <typename T, typename ...Args> template <typename T, typename ...Args>
inline efl::eina::ptr_list<T> inline efl::eina::list<T>
to_cxx(Eina_List* x, std::tuple<std::true_type, Args...>, tag< efl::eina::ptr_list<T> >) to_cxx(Eina_List* x, std::tuple<std::true_type, Args...>, tag< efl::eina::list<T> >)
{ {
efl::eina::ptr_list<T> list; return efl::eina::list<T> {x};
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 eina::stringshare 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); 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> template <typename T, typename U, typename O>
T to_cxx(U object, O o) T to_cxx(U object, O o)
{ {