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.

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

Reply via email to