q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=656d280e6a6e9bbf8d83a67afc4659aaf151c2c3

commit 656d280e6a6e9bbf8d83a67afc4659aaf151c2c3
Author: Savio Sena <savio.s...@acm.org>
Date:   Fri Jun 20 01:00:13 2014 +0100

    Eina-Cxx: Added native type constructors and examples.
    
    Summary:
    This patch allows us to construct efl::eina:: types from
    their respective C types.
    
    Reviewers: cedric, felipealmeida, q66
    
    Reviewed By: q66
    
    CC: smohanty, woohyun, raster, cedric
    
    Differential Revision: https://phab.enlightenment.org/D1068
---
 src/bindings/eina_cxx/eina_inarray.hh        | 12 +++++----
 src/bindings/eina_cxx/eina_inlist.hh         | 23 +++++++++++++++--
 src/bindings/eina_cxx/eina_ptrlist.hh        |  1 +
 src/tests/eina_cxx/eina_cxx_test_inarray.cc  | 22 ++++++++++++++++
 src/tests/eina_cxx/eina_cxx_test_inlist.cc   | 32 +++++++++++++++++++++++
 src/tests/eina_cxx/eina_cxx_test_ptrarray.cc | 13 ++++++++++
 src/tests/eina_cxx/eina_cxx_test_ptrlist.cc  | 38 ++++++++++++++++++++++++++++
 7 files changed, 134 insertions(+), 7 deletions(-)

diff --git a/src/bindings/eina_cxx/eina_inarray.hh 
b/src/bindings/eina_cxx/eina_inarray.hh
index ae593e4..dabfc89 100644
--- a/src/bindings/eina_cxx/eina_inarray.hh
+++ b/src/bindings/eina_cxx/eina_inarray.hh
@@ -363,7 +363,7 @@ struct _inarray_common_base
    * @warning It is important to note that the created array object
    * gains ownership of the handle, deallocating it at destruction time.
    */
-  explicit _inarray_common_base(Eina_Inarray* array)
+  explicit _inarray_common_base(native_handle_type array)
     : _array(array) {}
 
   /**
@@ -439,7 +439,7 @@ struct _inarray_common_base
    * @internal
    * Member variable that holds the native @c Eina_Inarray handle.
    */
-  Eina_Inarray* _array;
+  native_handle_type _array;
 private:
   /** Disabled copy constructor. */
   _inarray_common_base(_inarray_common_base const& other);
@@ -503,7 +503,7 @@ public:
    * @warning It is important to note that the created object gains
    * ownership of the handle, deallocating it at destruction time.
    */
-  _pod_inarray(Eina_Inarray* array)
+  _pod_inarray(native_handle_type array)
     : _base_type(array) {}
 
   /**
@@ -607,6 +607,7 @@ public:
   void push_back(T const& value)
   {
     size_type s = size();
+    static_cast<void>(s);
     eina_inarray_push(_array, &value);
     assert(size() != s);
     assert(size() == s + 1u);
@@ -1019,7 +1020,7 @@ public:
    * @warning It is important to take care when using it, since the
    * handle will be automatically release upon object destruction.
    */
-  Eina_Inarray* native_handle()
+  native_handle_type native_handle()
   {
     return this->_array;
   }
@@ -1033,7 +1034,7 @@ public:
    *
    * @see native_handle()
    */
-  Eina_Inarray const* native_handle() const
+  const_native_handle_type native_handle() const
   {
     return this->_array;
   }
@@ -1286,6 +1287,7 @@ public:
         for(size_type j = 0;j != n;++j)
           new (&*first++) T(t);
         std::size_t diff = last - first;
+        static_cast<void>(diff);
         assert(diff == _array->len - index - n);
         static_cast<void>(diff);
         while(first != last)
diff --git a/src/bindings/eina_cxx/eina_inlist.hh 
b/src/bindings/eina_cxx/eina_inlist.hh
index 4d83632..644d8c1 100644
--- a/src/bindings/eina_cxx/eina_inlist.hh
+++ b/src/bindings/eina_cxx/eina_inlist.hh
@@ -418,6 +418,7 @@ struct _inlist_common_base
   typedef typename Allocator::template rebind<_inlist_node<T> >::other 
node_allocator_type; /**< Type for the allocator of the node. */
   typedef Allocator allocator_type; /**< Type for the allocator. */
   typedef _inlist_node<T> node_type; /**< Type for the list node.  */
+  typedef Eina_Inlist* native_handle_type; /**< Native type. */
 
   /**
    * @brief Creates a list with the given allocator.
@@ -427,6 +428,13 @@ struct _inlist_common_base
     : _impl(allocator) {}
 
   /**
+   * @brief Wraps the native object.
+   * @param inlist The native inlist object (Eina_Inlist*).
+   */
+  _inlist_common_base(native_handle_type inlist)
+    : _impl(inlist) {}
+
+  /**
    * @brief Creates an empty inline list.
    */
   _inlist_common_base()
@@ -477,9 +485,11 @@ struct _inlist_common_base
     _inlist_impl(Allocator allocator)
       : node_allocator_type(allocator), _list(0)
     {}
+     explicit _inlist_impl(native_handle_type list)
+       : _list(list)
+     {}
     _inlist_impl() : _list(0) {}
-
-    Eina_Inlist* _list;
+    native_handle_type _list;
   };
 
   _inlist_impl _impl; /**< @internal */
@@ -518,6 +528,7 @@ public:
   typedef typename allocator_type::const_pointer const_pointer; /**< Type for 
a constant pointer for an element. */
   typedef std::size_t size_type; /**< Type for size information. */
   typedef std::ptrdiff_t difference_type; /**< Type to represent the distance 
between two iterators. */
+  typedef typename _base_type::native_handle_type native_handle_type; /**< The 
native handle type. */
 
   typedef std::reverse_iterator<iterator> reverse_iterator; /**< Type for 
reverse iterator for this kind of container. */
   typedef std::reverse_iterator<const_iterator> const_reverse_iterator; /**< 
Type for constant reverse iterator for this kind of container. */
@@ -530,6 +541,14 @@ public:
   inlist() {}
 
   /**
+   * @brief Construct an inlist from a native object.
+   * @param list The native object.
+   */
+  inlist(native_handle_type list)
+    : _inlist_common_base<T, Allocator>(list)
+  {}
+
+  /**
    * @brief Construct an inline list object with @p n copies of @p t.
    * @param n Number of elements.
    * @param t Value to be copied to each element.
diff --git a/src/bindings/eina_cxx/eina_ptrlist.hh 
b/src/bindings/eina_cxx/eina_ptrlist.hh
index f723f61..5dafed2 100644
--- a/src/bindings/eina_cxx/eina_ptrlist.hh
+++ b/src/bindings/eina_cxx/eina_ptrlist.hh
@@ -6,6 +6,7 @@
 #include <eina_lists_auxiliary.hh>
 #include <eina_type_traits.hh>
 #include <eina_accessor.hh>
+#include <eina_iterator.hh>
 
 #include <memory>
 #include <iterator>
diff --git a/src/tests/eina_cxx/eina_cxx_test_inarray.cc 
b/src/tests/eina_cxx/eina_cxx_test_inarray.cc
index 062a5e7..3f48bef 100644
--- a/src/tests/eina_cxx/eina_cxx_test_inarray.cc
+++ b/src/tests/eina_cxx/eina_cxx_test_inarray.cc
@@ -419,6 +419,27 @@ START_TEST(eina_cxx_range_inarray)
 }
 END_TEST
 
+START_TEST(eina_cxx_inarray_from_c)
+{
+  efl::eina::eina_init eina_init;
+
+  Eina_Inarray *c_array = nullptr;
+  int values[] = { 11, 22, 33 };
+
+  c_array = ::eina_inarray_new(sizeof(int), sizeof(values)/sizeof(int));
+  ck_assert(!!c_array);
+
+  eina_inarray_push(c_array, &values[0]);
+  eina_inarray_push(c_array, &values[1]);
+  eina_inarray_push(c_array, &values[2]);
+  {
+      efl::eina::range_inarray<int> range_array(c_array);
+  }
+  ck_assert(eina_inarray_count(c_array) == 3);
+  efl::eina::inarray<int> array(c_array);
+}
+END_TEST
+
 void
 eina_test_inarray(TCase *tc)
 {
@@ -433,4 +454,5 @@ eina_test_inarray(TCase *tc)
   tcase_add_test(tc, eina_cxx_inarray_nonpod_erase);
   tcase_add_test(tc, eina_cxx_inarray_nonpod_constructors);
   tcase_add_test(tc, eina_cxx_range_inarray);
+  tcase_add_test(tc, eina_cxx_inarray_from_c);
 }
diff --git a/src/tests/eina_cxx/eina_cxx_test_inlist.cc 
b/src/tests/eina_cxx/eina_cxx_test_inlist.cc
index b5ff8a4..04feed0 100644
--- a/src/tests/eina_cxx/eina_cxx_test_inlist.cc
+++ b/src/tests/eina_cxx/eina_cxx_test_inlist.cc
@@ -6,6 +6,12 @@
 
 #include <check.h>
 
+struct Eina_Test_Inlist
+{
+   int i;
+   EINA_INLIST;
+};
+
 START_TEST(eina_cxx_inlist_push_back)
 {
   efl::eina::eina_init eina_init;
@@ -242,6 +248,31 @@ START_TEST(eina_cxx_inlist_range)
 }
 END_TEST
 
+START_TEST(eina_cxx_inlist_from_c)
+{
+  efl::eina::eina_init eina_init;
+
+  Eina_Inlist *c_list = nullptr;
+  Eina_Test_Inlist arr[3] = { {11}, {22}, {33} };
+
+  c_list = eina_inlist_append(c_list, EINA_INLIST_GET(&arr[0]));
+  ck_assert(!!c_list);
+
+  c_list = eina_inlist_append(c_list, EINA_INLIST_GET(&arr[1]));
+  ck_assert(!!c_list);
+
+  c_list = eina_inlist_append(c_list, EINA_INLIST_GET(&arr[2]));
+  ck_assert(!!c_list);
+
+  efl::eina::range_inlist<int const> const_range_inlist(c_list);
+  efl::eina::range_inlist<int> range_inlist(c_list);
+
+  c_list = eina_inlist_first(c_list);
+   while (c_list)
+      c_list = eina_inlist_remove(c_list, c_list);
+}
+END_TEST
+
 void
 eina_test_inlist(TCase *tc)
 {
@@ -253,4 +284,5 @@ eina_test_inlist(TCase *tc)
   tcase_add_test(tc, eina_cxx_inlist_erase);
   tcase_add_test(tc, eina_cxx_inlist_constructors);
   tcase_add_test(tc, eina_cxx_inlist_range);
+  tcase_add_test(tc, eina_cxx_inlist_from_c);
 }
diff --git a/src/tests/eina_cxx/eina_cxx_test_ptrarray.cc 
b/src/tests/eina_cxx/eina_cxx_test_ptrarray.cc
index d9c848e..0d5f9ac 100644
--- a/src/tests/eina_cxx/eina_cxx_test_ptrarray.cc
+++ b/src/tests/eina_cxx/eina_cxx_test_ptrarray.cc
@@ -212,6 +212,18 @@ START_TEST(eina_cxx_ptrarray_range)
 }
 END_TEST
 
+START_TEST(eina_cxx_ptrarray_from_c)
+{
+  efl::eina::eina_init eina_init;
+
+  Eina_Array *c_array = eina_array_new(3);
+  ck_assert(!!c_array);
+  efl::eina::range_ptr_array<int> range_array(c_array);
+
+  eina_array_free(c_array);
+}
+END_TEST
+
 void
 eina_test_ptrarray(TCase* tc)
 {
@@ -221,4 +233,5 @@ eina_test_ptrarray(TCase* tc)
   tcase_add_test(tc, eina_cxx_ptrarray_constructors);
   tcase_add_test(tc, eina_cxx_ptrarray_erase);
   tcase_add_test(tc, eina_cxx_ptrarray_range);
+  tcase_add_test(tc, eina_cxx_ptrarray_from_c);
 }
diff --git a/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc 
b/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc
index 6b3466c..f422cde 100644
--- a/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc
+++ b/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc
@@ -255,6 +255,43 @@ START_TEST(eina_cxx_ptrlist_range)
 }
 END_TEST
 
+START_TEST(eina_cxx_ptrlist_from_c)
+{
+  efl::eina::eina_init eina_init;
+  Eina_List *c_list = nullptr;
+
+  int values[] = { 11, 22, 33 };
+
+  c_list = ::eina_list_append(c_list, &values[0]);
+  ck_assert(!!c_list);
+
+  c_list = ::eina_list_append(c_list, &values[1]);
+  ck_assert(!!c_list);
+
+  c_list = ::eina_list_append(c_list, &values[2]);
+  ck_assert(!!c_list);
+
+  const Eina_List* const_c_list = c_list;
+  const Eina_List* const_c_list_const_ptr = c_list;
+
+  efl::eina::range_ptr_list<int> r0(c_list);
+  const efl::eina::range_ptr_list<int> r1(c_list);
+
+  efl::eina::range_ptr_list<int const> r2(c_list);
+  efl::eina::range_ptr_list<int const> r3(const_c_list);
+  efl::eina::range_ptr_list<int const> r4(const_c_list_const_ptr);
+
+  const efl::eina::range_ptr_list<int const> r5(c_list);
+  const efl::eina::range_ptr_list<int const> r6(const_c_list);
+  const efl::eina::range_ptr_list<int const> r7(const_c_list_const_ptr);
+
+  const efl::eina::range_ptr_list<int> r8(c_list);
+
+  c_list = ::eina_list_free(c_list);
+  ck_assert(!c_list);
+}
+END_TEST
+
 void
 eina_test_ptrlist(TCase* tc)
 {
@@ -267,4 +304,5 @@ eina_test_ptrlist(TCase* tc)
   tcase_add_test(tc, eina_cxx_ptrlist_erase);
   tcase_add_test(tc, eina_cxx_ptrlist_range);
   tcase_add_test(tc, eina_cxx_ptrlist_malloc_clone_allocator);
+  tcase_add_test(tc, eina_cxx_ptrlist_from_c);
 }

-- 


Reply via email to