2017-09-06 10:32 GMT+09:00 Gustavo Sverzut Barbieri <barbi...@gmail.com>:
> 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. > <https://lists.sourceforge.net/lists/listinfo/enlightenment-devel> > Cool :) This even works today (to a certain extent, at least... no idea how much info the Eina_Value has about the struct). -- Jean-Philippe André ------------------------------------------------------------------------------ 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