diff --git a/src/bindings/eina_cxx/eina_clone_allocators.hh b/src/bindings/eina_cxx/eina_clone_allocators.hh index 459b6356cd..9174eee609 100644 --- a/src/bindings/eina_cxx/eina_clone_allocators.hh +++ b/src/bindings/eina_cxx/eina_clone_allocators.hh @@ -2,6 +2,9 @@ #define EINA_CLONE_ALLOCATORS_HH_ #include +#include +#include +#include namespace efl { namespace eina { @@ -64,6 +67,25 @@ struct heap_no_copy_allocator } }; +struct malloc_clone_allocator +{ + template + static T* allocate_clone(T const& v) + { + static_assert(std::is_pod::value, "malloc_clone_allocator can only be used with POD types"); + T* p = static_cast(std::malloc(sizeof(T))); + std::memcpy(p, &v, sizeof(T)); + return p; + } + + template + static void deallocate_clone(T const* p) + { + static_assert(std::is_pod::value, "malloc_clone_allocator can only be used with POD types"); + std::free(const_cast(p)); + } +}; + } } #endif diff --git a/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc b/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc index dbded3ac46..d68095e45e 100644 --- a/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc +++ b/src/tests/eina_cxx/eina_cxx_test_ptrlist.cc @@ -128,6 +128,19 @@ START_TEST(eina_cxx_ptrlist_insert) } END_TEST + +START_TEST(eina_cxx_ptrlist_malloc_clone_allocator) +{ + efl::eina::eina_init eina_init; + + efl::eina::ptr_list list1; + list1.push_back(5); + list1.push_back(10); + + efl::eina::ptr_list list2 = list1; +} +END_TEST + START_TEST(eina_cxx_ptrlist_constructors) { efl::eina::eina_init eina_init; @@ -240,4 +253,5 @@ eina_test_ptrlist(TCase* tc) tcase_add_test(tc, eina_cxx_ptrlist_constructors); 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); }