diff --git a/src/bin/eolian_mono/eolian/mono/marshall_type_impl.hh b/src/bin/eolian_mono/eolian/mono/marshall_type_impl.hh index 38dbbcb48c..95970dedd6 100644 --- a/src/bin/eolian_mono/eolian/mono/marshall_type_impl.hh +++ b/src/bin/eolian_mono/eolian/mono/marshall_type_impl.hh @@ -237,6 +237,11 @@ struct marshall_type_visitor_generate return regular_type_def{" System.IntPtr", complex.outer.base_qualifier, {}}; } } + ,{"accessor", nullptr, nullptr, [&] + { + return regular_type_def{" System.IntPtr", complex.outer.base_qualifier, {}}; + } + } }; auto default_match = [&] (attributes::complex_type_def const& complex) diff --git a/src/bin/eolian_mono/eolian/mono/parameter.hh b/src/bin/eolian_mono/eolian/mono/parameter.hh index f7c97b723f..55ea6f4115 100644 --- a/src/bin/eolian_mono/eolian/mono/parameter.hh +++ b/src/bin/eolian_mono/eolian/mono/parameter.hh @@ -275,6 +275,10 @@ inline bool param_should_use_out_var(attributes::parameter_def const& param, boo || param_is_acceptable(param, "Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", !WANT_OWN, WANT_OUT) @@ -321,6 +325,10 @@ inline bool param_should_use_in_var(attributes::parameter_def const& param, bool || param_is_acceptable(param, "const Eina_List *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Inlist *", WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, !WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, !WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, !WANT_OUT) @@ -578,6 +586,7 @@ struct native_convert_in_variable_generator || param.type.c_type == "Eina_List *" || param.type.c_type == "const Eina_List *" || param.type.c_type == "Eina_Inlist *" || param.type.c_type == "const Eina_Inlist *" || param.type.c_type == "Eina_Iterator *" || param.type.c_type == "const Eina_Iterator *" + || param.type.c_type == "Eina_Accessor *" || param.type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get(¶m.type.original_type); @@ -665,6 +674,7 @@ struct convert_in_variable_generator || param.type.c_type == "Eina_List *" || param.type.c_type == "const Eina_List *" || param.type.c_type == "Eina_Inlist *" || param.type.c_type == "const Eina_Inlist *" || param.type.c_type == "Eina_Iterator *" || param.type.c_type == "const Eina_Iterator *" + || param.type.c_type == "Eina_Accessor *" || param.type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get(¶m.type.original_type); @@ -743,6 +753,10 @@ struct convert_out_variable_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", WANT_OWN, WANT_OUT) @@ -818,6 +832,10 @@ struct native_convert_out_variable_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Hash *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Hash *", WANT_OWN, WANT_OUT) @@ -926,6 +944,10 @@ struct convert_out_assign_generator || param_is_acceptable(param, "Eina_Inlist *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Inlist *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Iterator *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "Eina_Iterator *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", WANT_OWN, WANT_OUT) @@ -1045,6 +1067,7 @@ struct convert_return_generator || ret_type.c_type == "Eina_List *" || ret_type.c_type == "const Eina_List *" || ret_type.c_type == "Eina_Inlist *" || ret_type.c_type == "const Eina_Inlist *" || ret_type.c_type == "Eina_Iterator *" || ret_type.c_type == "const Eina_Iterator *" + || ret_type.c_type == "Eina_Accessor *" || ret_type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get(&ret_type.original_type); @@ -1175,6 +1198,10 @@ struct native_convert_out_assign_generator || param_is_acceptable(param, "Eina_Iterator *", !WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", WANT_OWN, WANT_OUT) || param_is_acceptable(param, "const Eina_Iterator *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "Eina_Accessor *", !WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", WANT_OWN, WANT_OUT) + || param_is_acceptable(param, "const Eina_Accessor *", !WANT_OWN, WANT_OUT) ) { attributes::complex_type_def const* complex = efl::eina::get(¶m.type.original_type); @@ -1302,6 +1329,7 @@ struct native_convert_return_generator || ret_type.c_type == "Eina_List *" || ret_type.c_type == "const Eina_List *" || ret_type.c_type == "Eina_Inlist *" || ret_type.c_type == "const Eina_Inlist *" || ret_type.c_type == "Eina_Iterator *" || ret_type.c_type == "const Eina_Iterator *" + || ret_type.c_type == "Eina_Accessor *" || ret_type.c_type == "const Eina_Accessor *" ) { attributes::complex_type_def const* complex = efl::eina::get(&ret_type.original_type); diff --git a/src/bin/eolian_mono/eolian/mono/type_impl.hh b/src/bin/eolian_mono/eolian/mono/type_impl.hh index 1028a76ad9..09c4bc198d 100644 --- a/src/bin/eolian_mono/eolian/mono/type_impl.hh +++ b/src/bin/eolian_mono/eolian/mono/type_impl.hh @@ -287,8 +287,6 @@ struct visitor_generate { (*this)(regular_type_def{" eina.Future", complex.outer.base_qualifier, {}}); return attributes::type_def::variant_type(); - // return replace_outer - // (complex, regular_type_def{" ::efl::shared_future", complex.outer.base_qualifier, {}}); } } , {"iterator", nullptr, nullptr, [&] @@ -300,10 +298,9 @@ struct visitor_generate } , {"accessor", nullptr, nullptr, [&] { - (*this)(regular_type_def{" int", complex.outer.base_qualifier, {}}); - return attributes::type_def::variant_type(); - // return replace_outer - // (complex, regular_type_def{" ::efl::eina::accessor", complex.outer.base_qualifier, {}}); + complex_type_def c = complex; + c.outer.base_type = "eina.Accessor"; + return c; } } }; diff --git a/src/bindings/mono/eina_mono/eina_accessor.cs b/src/bindings/mono/eina_mono/eina_accessor.cs index eab0aebc8c..b3af7cccde 100644 --- a/src/bindings/mono/eina_mono/eina_accessor.cs +++ b/src/bindings/mono/eina_mono/eina_accessor.cs @@ -26,6 +26,19 @@ public class Accessor : IEnumerable, IDisposable /// Who is in charge of releasing the resources wrapped by this instance. private Ownership Ownership { get; set; } + // FIXME Part of the implicit EFL Container interface. Need to make it explicit. + public bool Own + { + get + { + return Ownership == Ownership.Managed; + } + set + { + Ownership = value ? Ownership.Managed : Ownership.Unmanaged; + } + } + /// Create a new accessor wrapping the given pointer. public Accessor(IntPtr handle, Ownership owner=Ownership.Managed) { @@ -33,6 +46,11 @@ public class Accessor : IEnumerable, IDisposable Ownership = owner; } + public Accessor(IntPtr handle, bool own, bool ownContent=false) + : this(handle, own ? Ownership.Managed : Ownership.Unmanaged) + { + } + /// Release the native resources held by this instance. public void Dispose() { diff --git a/src/tests/efl_mono/Eo.cs b/src/tests/efl_mono/Eo.cs index db89fb8c4f..997876b52f 100644 --- a/src/tests/efl_mono/Eo.cs +++ b/src/tests/efl_mono/Eo.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace TestSuite { @@ -224,4 +225,25 @@ class TestTypedefs } } +class TestEoAccessors +{ + public static void basic_eo_accessors() + { + test.ITesting obj = new test.Testing(); + eina.List lst = new eina.List(); + lst.Append(4); + lst.Append(3); + lst.Append(2); + lst.Append(5); + eina.Accessor acc = obj.CloneAccessor(lst.GetAccessor()); + + var zipped = acc.Zip(lst, (first, second) => new Tuple(first, second)); + + foreach(Tuple pair in zipped) + { + Test.AssertEquals(pair.Item1, pair.Item2); + } + } +} + } diff --git a/src/tests/efl_mono/libefl_mono_native_test.c b/src/tests/efl_mono/libefl_mono_native_test.c index 085188bcde..346ef2cb2c 100644 --- a/src/tests/efl_mono/libefl_mono_native_test.c +++ b/src/tests/efl_mono/libefl_mono_native_test.c @@ -52,6 +52,7 @@ typedef struct Test_Testing_Data Eo *part1; Eo *part2; Eina_Promise *promise; + Eina_List *list_for_accessor; } Test_Testing_Data; typedef struct Test_Numberwrapper_Data @@ -3841,6 +3842,20 @@ void _test_testing_reject_promise(Eo *obj, Test_Testing_Data *pd, Eina_Error err eina_promise_reject(pd->promise, err); } +Eina_Accessor *_test_testing_clone_accessor(Eo *obj, Test_Testing_Data *pd, Eina_Accessor *acc) +{ + if (pd->list_for_accessor) + eina_list_free(pd->list_for_accessor); + + unsigned int i; + int *data; + EINA_ACCESSOR_FOREACH(acc, i, data) + { + pd->list_for_accessor = eina_list_append(pd->list_for_accessor, data); + } + + return eina_list_accessor_new(pd->list_for_accessor); +} #include "test_testing.eo.c" #include "test_numberwrapper.eo.c" diff --git a/src/tests/efl_mono/test_testing.eo b/src/tests/efl_mono/test_testing.eo index d19024f435..3b43168c43 100644 --- a/src/tests/efl_mono/test_testing.eo +++ b/src/tests/efl_mono/test_testing.eo @@ -1633,6 +1633,14 @@ class Test.Testing (Efl.Object, Efl.Part) { @in error: Eina.Error; } } + + /* Accessors */ + clone_accessor { + params { + @in acc: accessor; + } + return: accessor @owned; + } } implements { class.constructor;