}
else if (param.type.c_type == "Eina_Array *" || param.type.c_type == "const Eina_Array *"
|| param.type.c_type == "Eina_List *" || param.type.c_type == "const Eina_List *"
- || 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<attributes::complex_type_def>(¶m.type.original_type);
<< ");\n"
).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.type), context);
}
+ else if (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<attributes::complex_type_def>(¶m.type.original_type);
+ if (!complex)
+ return false;
+ return as_generator(
+ "var " << string << " = new " << type << "(" << escape_keyword(param.param_name)
+ << ", " << (param.type.has_own ? "true" : "false")
+ << ");\n"
+ ).generate(sink, std::make_tuple(in_variable_name(param.param_name), param.type), context);
+ }
else if (param.type.c_type == "Eina_Value")
{
return as_generator(
escape_keyword(param.param_name) << ".Own = false;\n"
).generate(sink, attributes::unused, context))
return false;
+
+ // Iterators and Accessors can't own their content.
+ if (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 *"
+ )
+ return true;
+
if (complex->subtypes.front().has_own && !as_generator(
escape_keyword(param.param_name) << ".OwnContent = false;\n"
).generate(sink, attributes::unused, context))
|| param_is_acceptable(param, "Eina_List *", !WANT_OWN, WANT_OUT)
|| param_is_acceptable(param, "const Eina_List *", WANT_OWN, WANT_OUT)
|| param_is_acceptable(param, "const Eina_List *", !WANT_OWN, WANT_OUT)
+ )
+ {
+ attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(¶m.type.original_type);
+ if (!complex)
+ return false;
+ return as_generator(
+ string << " = new " << type << "(" << string
+ << ", " << (param.type.has_own ? "true" : "false")
+ << ", " << (complex->subtypes.front().has_own ? "true" : "false")
+ << ");\n"
+ ).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type, out_variable_name(param.param_name)), context);
+ }
+ else if (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)
+ || 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)
- || 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)
- || param_is_acceptable(param, "const Eina_Iterator *", !WANT_OWN, WANT_OUT)
)
{
attributes::complex_type_def const* complex = efl::eina::get<attributes::complex_type_def>(¶m.type.original_type);
return as_generator(
string << " = new " << type << "(" << string
<< ", " << (param.type.has_own ? "true" : "false")
- << ", " << (complex->subtypes.front().has_own ? "true" : "false")
<< ");\n"
).generate(sink, std::make_tuple(escape_keyword(param.param_name), param.type, out_variable_name(param.param_name)), context);
}
}
else if (ret_type.c_type == "Eina_Array *" || ret_type.c_type == "const Eina_Array *"
|| ret_type.c_type == "Eina_List *" || ret_type.c_type == "const Eina_List *"
- || 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<attributes::complex_type_def>(&ret_type.original_type);
if (!complex)
.generate(sink, ret_type, context))
return false;
}
+ else if(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<attributes::complex_type_def>(&ret_type.original_type);
+ if (!complex)
+ return false;
+ if (!as_generator("return new " << type << "(_ret_var, " << std::string{ret_type.has_own ? "true" : "false"} << ");\n")
+ .generate(sink, ret_type, context))
+ return false;
+ }
else if (ret_type.c_type != "void")
{
return as_generator("return _ret_var;\n").generate(sink, ret_type, context);
string << ".Own = false;\n"
).generate(sink, outvar, context))
return false;
+
+ // Iterators and Accessors can't own their content.
+ if (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 *"
+ )
+ return true;
+
if (complex->subtypes.front().has_own && !as_generator(
string << ".OwnContent = false;\n"
).generate(sink, outvar, context))
if (ret_type.has_own && !as_generator("_ret_var.Own = false; ")
.generate(sink, attributes::unused, context))
return false;
- if (complex->subtypes.front().has_own && !as_generator("_ret_var.OwnContent = false; ")
- .generate(sink, attributes::unused, context))
- return false;
+
+ // Iterators and Accessors can't own their content.
+ if (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 *"
+ )
+ {
+ if (complex->subtypes.front().has_own && !as_generator("_ret_var.OwnContent = false; ")
+ .generate(sink, attributes::unused, context))
+ return false;
+ }
return as_generator("return _ret_var.Handle;\n")
.generate(sink, attributes::unused, context);
return false;
}
else if (complex && (complex->outer.base_type == "array"
- || complex->outer.base_type == "list"
- || complex->outer.base_type == "iterator"))
+ || complex->outer.base_type == "list"))
{
// Always assumes pointer
if (!as_generator(
.generate(sink, std::make_tuple(field_name, field.type, field_name), context))
return false;
}
+ else if (complex && complex->outer.base_type == "iterator")
+ {
+ if (!as_generator(
+ indent << scope_tab << scope_tab << "_external_struct." << string << " = new " << type << "(_internal_struct." << string << ", false);\n")
+ .generate(sink, std::make_tuple(field_name, field.type, field_name), context))
+ return false;
+ }
else if (field.type.is_ptr && helpers::need_pointer_conversion(regular) && !helpers::need_struct_conversion(regular))
{
if (!as_generator(
public Eina.Iterator<T> GetIterator()
{
- return new Eina.Iterator<T>(eina_array_iterator_new(Handle), true, false);
+ return new Eina.Iterator<T>(eina_array_iterator_new(Handle), true);
}
public IEnumerator<T> GetEnumerator()
public Eina.Iterator<TKey> Keys()
{
- return new Eina.Iterator<TKey>(EinaHashIteratorKeyNew<TKey>(Handle), true, false);
+ return new Eina.Iterator<TKey>(EinaHashIteratorKeyNew<TKey>(Handle), true);
}
public Eina.Iterator<TValue> Values()
{
- return new Eina.Iterator<TValue>(eina_hash_iterator_data_new(Handle), true, false);
+ return new Eina.Iterator<TValue>(eina_hash_iterator_data_new(Handle), true);
}
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
public Eina.Iterator<T> GetIterator()
{
- return new Eina.Iterator<T>(eina_inarray_iterator_new(Handle), true, false);
+ return new Eina.Iterator<T>(eina_inarray_iterator_new(Handle), true);
}
public Eina.Iterator<T> GetReversedIterator()
{
- return new Eina.Iterator<T>(eina_inarray_iterator_reversed_new(Handle), true, false);
+ return new Eina.Iterator<T>(eina_inarray_iterator_reversed_new(Handle), true);
}
public IEnumerator<T> GetEnumerator()
public Eina.Iterator<T> GetIterator()
{
- return new Eina.Iterator<T>(eina_inlist_iterator_wrapper_new_custom_export_mono(Handle), true, false);
+ return new Eina.Iterator<T>(eina_inlist_iterator_wrapper_new_custom_export_mono(Handle), true);
}
public IEnumerator<T> GetEnumerator()
{
public IntPtr Handle {get;set;} = IntPtr.Zero;
public bool Own {get;set;} = true;
- public bool OwnContent {get;set;} = false;
public Iterator(IntPtr handle, bool own)
{
Handle = handle;
Own = own;
- OwnContent = own;
- }
-
- public Iterator(IntPtr handle, bool own, bool ownContent)
- {
- Handle = handle;
- Own = own;
- OwnContent = ownContent;
}
~Iterator()
return;
}
- if (OwnContent)
- {
- for (IntPtr data; eina_iterator_next(h, out data);)
- {
- NativeFree<T>(data);
- }
- }
-
if (Own)
{
if (disposing)
return h;
}
- public void SetOwnership(bool ownAll)
- {
- Own = ownAll;
- OwnContent = ownAll;
- }
-
- public void SetOwnership(bool own, bool ownContent)
+ public void SetOwnership(bool own)
{
Own = own;
- OwnContent = ownContent;
}
public bool Next(out T res)
res = NativeToManaged<T>(data);
- if (OwnContent)
- {
- NativeFree<T>(data);
- }
-
return true;
}
public Eina.Iterator<T> GetIterator()
{
- return new Eina.Iterator<T>(eina_list_iterator_new(Handle), true, false);
+ return new Eina.Iterator<T>(eina_list_iterator_new(Handle), true);
}
public Eina.Iterator<T> GetReversedIterator()
{
- return new Eina.Iterator<T>(eina_list_iterator_reversed_new(Handle), true, false);
+ return new Eina.Iterator<T>(eina_list_iterator_reversed_new(Handle), true);
}
public IEnumerator<T> GetEnumerator()
var itr = arr.GetIterator();
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
Test.Assert(t.EinaIteratorIntIn(itr));
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
var arr = new Eina.Array<int>();
arr.Append(base_seq_int);
var itr = arr.GetIterator();
- arr.OwnContent = false;
- itr.OwnContent = true;
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ Test.Assert(arr.OwnContent);
+ // Will take ownership of the Iterator
Test.Assert(t.EinaIteratorIntInOwn(itr));
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ // Content must continue to be owned by the array
+ Test.Assert(arr.OwnContent);
itr.Dispose();
arr.Dispose();
Test.Assert(t.EinaIteratorIntOut(out itr));
-
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
int idx = 0;
foreach (int e in itr)
Test.Assert(t.EinaIteratorIntOutOwn(out itr));
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
int idx = 0;
foreach (int e in itr)
var itr = t.EinaIteratorIntReturn();
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
int idx = 0;
foreach (int e in itr)
var itr = t.EinaIteratorIntReturnOwn();
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
int idx = 0;
foreach (int e in itr)
var itr = arr.GetIterator();
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
Test.Assert(t.EinaIteratorStrIn(itr));
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
var arr = new Eina.Array<string>();
arr.Append(base_seq_str);
var itr = arr.GetIterator();
- arr.OwnContent = false;
- itr.OwnContent = true;
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ Test.Assert(arr.OwnContent);
Test.Assert(t.EinaIteratorStrInOwn(itr));
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
- Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
- Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ Test.Assert(arr.OwnContent);
itr.Dispose();
arr.Dispose();
Test.Assert(t.EinaIteratorStrOut(out itr));
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
int idx = 0;
foreach (string e in itr)
Test.Assert(t.EinaIteratorStrOutOwn(out itr));
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
int idx = 0;
foreach (string e in itr)
var itr = t.EinaIteratorStrReturn();
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
int idx = 0;
foreach (string e in itr)
var itr = t.EinaIteratorStrReturnOwn();
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
int idx = 0;
foreach (string e in itr)
var itr = arr.GetIterator();
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
Test.Assert(t.EinaIteratorObjIn(itr));
Test.Assert(itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
Test.Assert(arr.OwnContent);
var arr = new Eina.Array<Dummy.Numberwrapper>();
arr.Append(BaseSeqObj());
var itr = arr.GetIterator();
- arr.OwnContent = false;
- itr.OwnContent = true;
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ Test.Assert(arr.OwnContent);
Test.Assert(t.EinaIteratorObjInOwn(itr));
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
Test.Assert(arr.Own);
- Test.Assert(!arr.OwnContent);
+ Test.Assert(arr.OwnContent);
itr.Dispose();
arr.Dispose();
Test.Assert(t.EinaIteratorObjOut(out itr));
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
var base_seq_obj = BaseSeqObj();
Test.Assert(t.EinaIteratorObjOutOwn(out itr));
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
var base_seq_obj = BaseSeqObj();
var itr = t.EinaIteratorObjReturn();
Test.Assert(!itr.Own);
- Test.Assert(!itr.OwnContent);
var base_seq_obj = BaseSeqObj();
var itr = t.EinaIteratorObjReturnOwn();
Test.Assert(itr.Own);
- Test.Assert(itr.OwnContent);
var base_seq_obj = BaseSeqObj();
int iface_prop;
Eo *provider;
Eo *iface_provider;
+
+ // Containers passed to C# as iterator/accessors
+ Eina_Array *out_array;
} Dummy_Test_Object_Data;
static
pd->list_for_accessor = NULL;
}
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
+
efl_destructor(efl_super(obj, DUMMY_TEST_OBJECT_CLASS));
}
Eina_Bool _dummy_test_object_eina_iterator_int_in_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd, Eina_Iterator *itr)
{
- Eina_Bool r = _iterator_int_equal(itr, base_seq_int, base_seq_int_size, EINA_TRUE);
+ Eina_Bool r = _iterator_int_equal(itr, base_seq_int, base_seq_int_size, EINA_FALSE);
_iterator_int_in_own_to_check = itr;
return r;
}
{
if (!itr) return EINA_FALSE;
- Eina_Array *arr = _iterator_int_eina_array_new();
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
- *itr = eina_array_iterator_new(arr);
+ pd->out_array = _iterator_int_eina_array_new();
+
+ *itr = eina_array_iterator_new(pd->out_array);
return EINA_TRUE;
}
Eina_Iterator *_dummy_test_object_eina_iterator_int_return_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd)
{
- Eina_Array *arr = _iterator_int_eina_array_new();
- return eina_array_iterator_new(arr);
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
+
+ pd->out_array = _iterator_int_eina_array_new();
+ return eina_array_iterator_new(pd->out_array);
}
// String //
Eina_Bool _dummy_test_object_eina_iterator_str_in_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd, Eina_Iterator *itr)
{
- Eina_Bool r = _iterator_str_equal(itr, base_seq_str, base_seq_str_size, EINA_TRUE);
+ Eina_Bool r = _iterator_str_equal(itr, base_seq_str, base_seq_str_size, EINA_FALSE);
_iterator_str_in_own_to_check = itr;
return r;
}
{
if (!itr) return EINA_FALSE;
- Eina_Array *arr = _iterator_str_eina_array_new();
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
- *itr = eina_array_iterator_new(arr);
+ pd->out_array = _iterator_str_eina_array_new();
+
+ *itr = eina_array_iterator_new(pd->out_array);
return EINA_TRUE;
}
Eina_Iterator *_dummy_test_object_eina_iterator_str_return_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd)
{
- Eina_Array *arr = _iterator_str_eina_array_new();
- return eina_array_iterator_new(arr);
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
+
+ pd->out_array = _iterator_str_eina_array_new();
+ return eina_array_iterator_new(pd->out_array);
}
// Object //
Eina_Bool _dummy_test_object_eina_iterator_obj_in_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd, Eina_Iterator *itr)
{
- Eina_Bool r = _iterator_obj_equal(itr, base_seq_obj, base_seq_obj_size, EINA_TRUE);
+ Eina_Bool r = _iterator_obj_equal(itr, base_seq_obj, base_seq_obj_size, EINA_FALSE);
_iterator_obj_in_own_to_check = itr;
return r;
}
{
if (!itr) return EINA_FALSE;
- Eina_Array *arr = _iterator_obj_eina_array_new();
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
- *itr = eina_array_iterator_new(arr);
+ pd->out_array = _iterator_obj_eina_array_new();
+
+ *itr = eina_array_iterator_new(pd->out_array);
return EINA_TRUE;
}
Eina_Iterator *_dummy_test_object_eina_iterator_obj_return_own(EINA_UNUSED Eo *obj, EINA_UNUSED Dummy_Test_Object_Data *pd)
{
- Eina_Array *arr = _iterator_obj_eina_array_new();
- return eina_array_iterator_new(arr);
+ if (pd->out_array)
+ eina_array_free(pd->out_array);
+
+ pd->out_array = _iterator_obj_eina_array_new();
+ return eina_array_iterator_new(pd->out_array);
}
// //
/* Integer */
eina_iterator_int_in {
params {
- @in itr: iterator<ptr(int)>;
+ @in itr: iterator<int>;
}
return: bool;
}
eina_iterator_int_in_own {
params {
- @in itr: iterator<free(ptr(int),free)> @owned;
+ @in itr: iterator<int> @owned;
}
return: bool;
}
eina_iterator_int_out {
params {
- @out itr: iterator<ptr(int)>;
+ @out itr: iterator<int>;
}
return: bool;
}
eina_iterator_int_out_own {
params {
- @out itr: iterator<free(ptr(int),free)> @owned;
+ @out itr: iterator<int> @owned;
}
return: bool;
}
eina_iterator_int_return {
- return: iterator<ptr(int)>;
+ return: iterator<int>;
}
check_eina_iterator_int_return {
return: bool;
}
eina_iterator_int_return_own {
- return: iterator<free(ptr(int),free)> @owned;
+ return: iterator<int> @owned;
}
/* String */
/* Accessors */
clone_accessor {
params {
- @in acc: accessor<ptr(int)>;
+ @in acc: accessor<int>;
}
- return: accessor<ptr(int)> @owned;
+ return: accessor<int> @owned;
}
@property setter_only {