Hi,

2017-09-05 21:57 GMT+09:00 Gustavo Sverzut Barbieri <[email protected]>:

> 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>;
    }
  }
}

-- 
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to