On Tue, Sep 5, 2017 at 10:08 PM, Jean-Philippe André <j...@videolan.org> wrote: > Hi, > > 2017-09-05 21:57 GMT+09:00 Gustavo Sverzut Barbieri <barbi...@gmail.com>: > >> With eolian one could declare a future using C++ template-like syntax: >> >> future<int> >> >> That is, a future that provides (resolves to) an integer. With >> Eina_Value, this will be an Eina_Value->type == EINA_VALUE_TYPE_INT. >> >> In some cases, when multiple values are needed, it would be written as: >> >> future<int, string> >> >> That is, a future that provides both an integer and a string. In the >> old representation one would only get a "void *value", and would need >> to do its casts and hope for the best. With Eina_Value, this will be >> an Eina_Value->type == EINA_VALUE_TYPE_STRUCT, with internal pointer >> being an Eina_Value_Struct, that contains an Eina_Value_Struct_Desc >> with the members, memory layout is like: >> >> value = (Eina_Value) { >> .type = EINA_VALUE_TYPE_STRUCT, >> .value.ptr = &(Eina_Value_Struct){ >> .desc = EINA_VALUE_STRUCT_DESC_MYSTRUCT, >> .memory = &mystruct, >> }, >> }; >> >> Easily accessible with: >> >> eina_value_struct_get(value, "member_name", &ret); >> >> Or directly (check/get could be made single-line with a helper function): >> >> // safety first! >> if (eina_value_struct_desc_get(&value) == EINA_VALUE_STRUCT_DESC_ >> MYSTRUCT) >> { >> Eina_Value_Struct st; >> eina_value_get(&value, &st); >> My_Struct *mst = st.memory; >> >> mst->member_name; // from here on, no more checks are required >> } >> >> My proposal is to extend eolian syntax to allow named parameters and >> it would generate the structure, typedef and EINA_VALUE_STRUCT_DESC, >> all exposed in .eo.h file. Example: >> >> future<age: int, name: string> >> >> Generates: my_class.eo.h >> >> typedef struct _My_Class_Future_Result_Age_Name { >> int age; >> char *name; >> } My_Class_Result_Age_Name; >> >> EOAPI const Eina_Value_Struct_Desc >> *EINA_VALUE_STRUCT_DESC_MY_CLASS_FUTURE_RESULT_AGE_NAME; >> >> Generates: my_class.eo.c >> >> static /* not const! */ Eina_Value_Struct_Member >> _EINA_VALUE_STRUCT_MEMBERS_MY_CLASS_FUTURE_RESULT_AGE_NAME[] = { >> {"age", NULL /* type placeholder */, >> offsetof(My_Class_Result_Age_Name, age)}, >> {"name", NULL /* type placeholder */, >> offsetof(My_Class_Result_Age_Name, name)}, >> }; >> >> static const Eina_Value_Struct_Desc >> _EINA_VALUE_STRUCT_DESC_MY_CLASS_FUTURE_RESULT_AGE_NAME = { >> EINA_VALUE_STRUCT_DESC_VERSION, >> NULL, /* ops */ >> _EINA_VALUE_STRUCT_DESC_MEMBERS_MY_CLASS_FUTURE_RESULT_AGE_NAME, >> EINA_C_ARRAY_LENGTH(_EINA_VALUE_STRUCT_MEMBERS_MY_CLASS_ >> FUTURE_RESULT_AGE_NAME), >> sizeof(My_Class_Result_Age_Name), >> }; >> >> EOAPI const Eina_Value_Struct_Desc >> *EINA_VALUE_STRUCT_DESC_MY_CLASS_FUTURE_RESULT_AGE_NAME; >> >> // inside class constructor using it: >> _class_constructor(...) { >> if (_EINA_VALUE_STRUCT_MEMBERS_MY_CLASS_FUTURE_RESULT_AGE_ >> NAME[0].type >> == NULL) >> { >> _EINA_VALUE_STRUCT_MEMBERS_MY_CLASS_FUTURE_RESULT_AGE_NAME[ >> 0].type >> = EINA_VALUE_TYPE_INT; >> _EINA_VALUE_STRUCT_MEMBERS_MY_CLASS_FUTURE_RESULT_AGE_NAME[ >> 1].type >> = EINA_VALUE_TYPE_STRING; >> } >> } >> >> The constructor thing is because EINA_VALUE_TYPE_INT and >> EINA_VALUE_TYPE_STRING are declared in other libraries, thus cannot be >> resolved at compile-time. >> >> Another option is to ignore that from Eolian signature, not allowing >> structs there -- one could use future<generic_value>. But as you can >> see, to make proper use of structures one need to type a lot, which >> could be easily automated by Eolian. >> >> > Can't we just declare the struct in EO and use it inside the future<> ? > Like: > > struct Future_Struct_Value { > age: int; > sex: bool; > } > > class Abc { > methods { > future_do { > return: future<Future_Struct_Value>; > } > } > }
Could... everything else would be the same, except the name would be explicitly defined. works for me. -- Gustavo Sverzut Barbieri -------------------------------------- Mobile: +55 (16) 99354-9890 ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel