The difference is that here we're attaining ourselves to two new data types to store in an Eet file – unions and variants. We don't try to come with data mapping to real world use cases, here. Instead, we're defining 3 different simple structures to be used throughout the example:  
 To identify, for both union and variant data cases, the type of each chunk of data, we're defining types to point to each of those structs:  
 We have also a mapping from those types to name strings, to be used in the Eet unions and variants type_get() and type_set() type identifying callbacks: 
 In this example, we have no fancy hash to store our data into profiles/accounts, but just two lists for union and variant data nodes:  
 The first interesting part of the code is where we define our data descriptors for the main lists, the unions and all of structures upon which those two depend.  
_data_descriptors_init(void)
{
 
 
   _struct_1_descriptor = _st1_dd();
   _struct_2_descriptor = _st2_dd();
   _struct_3_descriptor = _st3_dd();
 
   
 
 
     _union_unified_descriptor, "ST1", _struct_1_descriptor);
     _union_unified_descriptor, "ST2", _struct_2_descriptor);
     _union_unified_descriptor, "ST3", _struct_3_descriptor);
 
     _union_descriptor, Example_Union, "u", u, type,
     _union_unified_descriptor);
 
     _lists_descriptor, Example_Lists, "union_list", union_list,
     _union_descriptor);
#define EET_DATA_DESCRIPTOR_ADD_UNION(edd, struct_type, name, member, type_member, unified_type)
Adds an union type to a data descriptor.
Definition Eet.h:3834
 
#define EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(clas, type)
This macro is an helper that set all the parameter of an Eet_Data_Descriptor_Class correctly when you...
Definition Eet.h:3092
 
#define EET_T_STRING
Data type: char *.
Definition Eet.h:2606
 
#define EET_T_FLOAT
Data type: float.
Definition Eet.h:2600
 
#define EET_DATA_DESCRIPTOR_CLASS_VERSION
The version of Eet_Data_Descriptor_Class at the time of the distribution of the sources.
Definition Eet.h:2657
 
EAPI Eet_Data_Descriptor * eet_data_descriptor_file_new(const Eet_Data_Descriptor_Class *eddc)
This function creates a new data descriptor and returns a handle to the new data descriptor.
Definition eet_data.c:2090
 
#define EET_DATA_DESCRIPTOR_ADD_MAPPING_BASIC(unified_type, name, basic_type)
Adds a mapping of a basic type to a data descriptor that will be used by a union type.
Definition Eet.h:3907
 
#define EET_DATA_DESCRIPTOR_ADD_LIST(edd, struct_type, name, member, subtype)
Adds a linked list type to a data descriptor.
Definition Eet.h:3528
 
#define EET_DATA_DESCRIPTOR_ADD_MAPPING(unified_type, name, subtype)
Adds a mapping to a data descriptor that will be used by union, variant or inherited type.
Definition Eet.h:3887
 
Instructs Eet about memory management for different needs under serialization and parse process.
Definition Eet.h:2845
 
Eet_Descriptor_Type_Set_Callback type_set
called when loading a mapped type with the given type used to describe the type in the descriptor
Definition Eet.h:2865
 
int version
ABI version.
Definition Eet.h:2846
 
Eet_Descriptor_Type_Get_Callback type_get
get the type, as used in the union or variant mapping, that should be used to store the given data in...
Definition Eet.h:2864
 
 
   12typedef enum _Example_Data_Type      Example_Data_Type;
 
   13typedef struct _Example_Variant_Type Example_Variant_Type;
 
   14typedef struct _Example_Variant      Example_Variant;
 
   15typedef struct _Example_Union        Example_Union;
 
   16typedef struct _Example_Struct1      Example_Struct1;
 
   17typedef struct _Example_Struct2      Example_Struct2;
 
   18typedef struct _Example_Struct3      Example_Struct3;
 
   19typedef struct _Example_Lists        Example_Lists;
 
   21enum _Example_Data_Type
 
   36   { EET_STRUCT1, 
"ST1" },
 
   37   { EET_STRUCT2, 
"ST2" },
 
   38   { EET_STRUCT3, 
"ST3" },
 
   39   { EET_BASIC_FLOAT, 
"float" },
 
   40   { EET_BASIC_STRING, 
"string" },
 
   44struct _Example_Struct1
 
   51struct _Example_Struct2
 
   54   unsigned long long v1;
 
   57struct _Example_Struct3
 
   64   Example_Data_Type type;
 
   75struct _Example_Variant_Type
 
   81struct _Example_Variant
 
   83   Example_Variant_Type t;
 
   97_st1_set(Example_Struct1 *st1,
 
  108_st2_set(Example_Struct2   *st2,
 
  110         unsigned long long v2)
 
  117_st3_set(Example_Struct3 *st3,
 
  126_union_type_get(
const void *data,
 
  129   const Example_Data_Type *u = data;
 
  135   for (i = 0; eet_mapping[i].name != NULL; ++i)
 
  136     if (*u == eet_mapping[i].u)
 
  137       return eet_mapping[i].name;
 
  146_union_type_set(
const char *type,
 
  150   Example_Data_Type *u = data;
 
  156   for (i = 0; eet_mapping[i].name != NULL; ++i)
 
  157     if (strcmp(eet_mapping[i].name, type) == 0)
 
  159          *u = eet_mapping[i].u;
 
  167_variant_type_get(
const void *data,
 
  170   const Example_Variant_Type *type = data;
 
  174     *unknow = type->unknow;
 
  176   for (i = 0; eet_mapping[i].name != NULL; ++i)
 
  177     if (strcmp(type->type, eet_mapping[i].name) == 0)
 
  178       return eet_mapping[i].name;
 
  187_variant_type_set(
const char *type,
 
  191   Example_Variant_Type *vt = data;
 
  209     res, Example_Struct1, 
"stuff", stuff, 
EET_T_INT);
 
  241     res, Example_Struct3, 
"body", body, 
EET_T_INT);
 
  250static const char CACHE_FILE_ENTRY[] = 
"cache";
 
  271_data_descriptors_init(
void)
 
  278   _struct_1_descriptor = _st1_dd();
 
  279   _struct_2_descriptor = _st2_dd();
 
  280   _struct_3_descriptor = _st3_dd();
 
  287   eddc.func.
type_get = _union_type_get;
 
  288   eddc.func.
type_set = _union_type_set;
 
  292     _union_unified_descriptor, 
"ST1", _struct_1_descriptor);
 
  294     _union_unified_descriptor, 
"ST2", _struct_2_descriptor);
 
  296     _union_unified_descriptor, 
"ST3", _struct_3_descriptor);
 
  303     _union_descriptor, Example_Union, 
"u", u, type,
 
  304     _union_unified_descriptor);
 
  307     _lists_descriptor, Example_Lists, 
"union_list", union_list,
 
  315   eddc.func.
type_get = _variant_type_get;
 
  316   eddc.func.
type_set = _variant_type_set;
 
  320     _variant_unified_descriptor, 
"ST1", _struct_1_descriptor);
 
  322     _variant_unified_descriptor, 
"ST2", _struct_2_descriptor);
 
  324     _variant_unified_descriptor, 
"ST3", _struct_3_descriptor);
 
  327     _variant_descriptor, Example_Variant, 
"data", data, t,
 
  328     _variant_unified_descriptor);
 
  331     _lists_descriptor, Example_Lists, 
"variant_list", variant_list,
 
  332     _variant_descriptor);
 
  336_data_descriptors_shutdown(
void)
 
  352_string_free(
const char *str)
 
  363static Example_Union *
 
  364_union_1_new(
const char *v1,
 
  368   Example_Union *un = calloc(1, 
sizeof(Example_Union));
 
  372          stderr, 
"ERROR: could not allocate an Example_Union struct.\n");
 
  376   un->type = EET_STRUCT1;
 
  382static Example_Union *
 
  383_union_2_new(
const char *v1,
 
  386   Example_Union *un = calloc(1, 
sizeof(Example_Union));
 
  390          stderr, 
"ERROR: could not allocate an Example_Union struct.\n");
 
  394   un->type = EET_STRUCT2;
 
  395   _st2_set(&(un->u.st2), atoi(v1), atoi(v2));
 
  400static Example_Union *
 
  401_union_3_new(
const char *v1)
 
  403   Example_Union *un = calloc(1, 
sizeof(Example_Union));
 
  407          stderr, 
"ERROR: could not allocate an Example_Union struct.\n");
 
  411   un->type = EET_STRUCT3;
 
  412   _st3_set(&(un->u.st3), atoi(v1));
 
  417static Example_Union *
 
  418_union_float_new(
const char *v1)
 
  420   Example_Union *un = calloc(1, 
sizeof(Example_Union));
 
  424          stderr, 
"ERROR: could not allocate an Example_Union struct.\n");
 
  428   un->type = EET_BASIC_FLOAT;
 
  434static Example_Union *
 
  435_union_string_new(
const char *v1)
 
  437   Example_Union *un = calloc(1, 
sizeof(Example_Union));
 
  441          stderr, 
"ERROR: could not allocate an Example_Union struct.\n");
 
  445   un->type = EET_BASIC_STRING;
 
  451static Example_Variant *
 
  452_variant_1_new(
const char *v1,
 
  456   Example_Struct1 *st1;
 
  457   Example_Variant *va = calloc(1, 
sizeof(Example_Variant));
 
  461          stderr, 
"ERROR: could not allocate an Example_Variant struct.\n");
 
  465   va->t.type = eet_mapping[0].name;
 
  466   st1 = calloc(1, 
sizeof (Example_Struct1));
 
  473static Example_Variant *
 
  474_variant_2_new(
const char *v1,
 
  477   printf(
"varinant 2 new\n");
 
  479   Example_Struct2 *st2;
 
  480   Example_Variant *va = calloc(1, 
sizeof(Example_Variant));
 
  484          stderr, 
"ERROR: could not allocate an Example_Variant struct.\n");
 
  488   va->t.type = eet_mapping[1].name;
 
  490   printf(
"type gets %s\n", va->t.type);
 
  492   st2 = calloc(1, 
sizeof (Example_Struct2));
 
  493   _st2_set(st2, atoi(v1), atoi(v2));
 
  499static Example_Variant *
 
  500_variant_3_new(
const char *v1)
 
  502   Example_Struct3 *st3;
 
  503   Example_Variant *va = calloc(1, 
sizeof(Example_Variant));
 
  507          stderr, 
"ERROR: could not allocate an Example_Variant struct.\n");
 
  511   va->t.type = eet_mapping[2].name;
 
  512   st3 = calloc(1, 
sizeof (Example_Struct3));
 
  513   _st3_set(st3, atoi(v1));
 
  519static Example_Lists *
 
  522   Example_Lists *example_lists = calloc(1, 
sizeof(Example_Lists));
 
  525        fprintf(stderr, 
"ERROR: could not allocate a Example_Lists struct.\n");
 
  529   return example_lists;
 
  533_union_free(Example_Union *un)
 
  535   if (un->type == EET_STRUCT1)
 
  537        Example_Struct1 *st1 = &(un->u.st1);
 
  538        _string_free(st1->s1);
 
  545_variant_free(Example_Variant *va)
 
  547   if (!strcmp(va->t.type, eet_mapping[0].name))
 
  549        Example_Struct1 *st1 = va->data;
 
  550        _string_free(st1->s1);
 
  558_data_free(Example_Lists *cache)
 
  572static Example_Lists *
 
  573_data_load(
const char *filename)
 
  579        fprintf(stderr, 
"ERROR: could not open '%s' for read\n", filename);
 
  583   data = 
eet_data_read(ef, _lists_descriptor, CACHE_FILE_ENTRY);
 
  600_data_save(
const Example_Lists *cache,
 
  601           const char          *filename)
 
  610   if (len + 12 >= (
int)
sizeof(tmp))
 
  612        fprintf(stderr, 
"ERROR: file name is too big: %s\n", filename);
 
  619        snprintf(tmp + len, 12, 
".%u", i);
 
  622   while (stat(tmp, &st) == 0);
 
  627        fprintf(stderr, 
"ERROR: could not open '%s' for write\n", tmp);
 
  632       (ef, _lists_descriptor, CACHE_FILE_ENTRY, cache, 
EINA_TRUE);
 
  639        rename(tmp, filename);
 
  646_print_union(
const Example_Union *un)
 
  648   printf(
"\t  |   type: %s'\n", eet_mapping[un->type - 1].name);
 
  653        printf(
"\t\t  val1: %f\n", un->u.st1.val1);
 
  654        printf(
"\t\t  stuff: %d\n", un->u.st1.stuff);
 
  655        printf(
"\t\t  s1: %s\n", un->u.st1.s1);
 
  659        printf(
"\t\t  val1: %i\n", un->u.st2.b1);
 
  660        printf(
"\t\t  stuff: %lli\n", un->u.st2.v1);
 
  664        printf(
"\t\t  val1: %i\n", un->u.st3.body);
 
  667      case EET_BASIC_FLOAT:
 
  668        printf(
"\t\t  float: %f\n", un->u.f);
 
  671      case EET_BASIC_STRING:
 
  672        printf(
"\t\t  string: %s\n", un->u.string);
 
  681_print_variant(
const Example_Variant *va)
 
  683   printf(
"\t  |   type: %s'\n", va->t.type);
 
  685   switch (va->t.type[2])
 
  689         Example_Struct1 *st1 = va->data;
 
  691         printf(
"\t\t  val1: %f\n", st1->val1);
 
  692         printf(
"\t\t  stuff: %d\n", st1->stuff);
 
  693         printf(
"\t\t  s1: %s\n", st1->s1);
 
  699         Example_Struct2 *st2 = va->data;
 
  701         printf(
"\t\t  val1: %i\n", st2->b1);
 
  702         printf(
"\t\t  stuff: %lli\n", st2->v1);
 
  708         Example_Struct3 *st3 = va->data;
 
  710         printf(
"\t\t  val1: %i\n", st3->body);
 
  723   Example_Lists *data_lists;
 
  729                "Usage:\n\t%s <input> <output> [action action-params]\n\n" 
  730                "where actions and their parameters are:\n" 
  731                "\tunion <type> [fields]\n" 
  732                "\tvariant <type> [fields]\n" 
  740   _data_descriptors_init();
 
  742   data_lists = _data_load(argv[1]);
 
  745        printf(
"Creating new data lists.\n");
 
  746        data_lists = _data_new();
 
  756        if (strcmp(argv[3], 
"union") == 0)
 
  760                  int type = atoi(argv[4]);
 
  763                  if (type < EET_STRUCT1 || type > EET_BASIC_STRING)
 
  766                               "ERROR: invalid type parameter (%s).\n",
 
  777                              stderr, 
"ERROR: wrong number of parameters" 
  783                           argv[5], argv[6], argv[7]);
 
  787                              stderr, 
"ERROR: could not create the " 
  788                                      "requested union.\n");
 
  791                       data_lists->union_list =
 
  799                              stderr, 
"ERROR: wrong number of parameters" 
  804                       un = _union_2_new(argv[5], argv[6]);
 
  808                              stderr, 
"ERROR: could not create the " 
  809                                      "requested union.\n");
 
  812                       data_lists->union_list =
 
  820                              stderr, 
"ERROR: wrong number of parameters" 
  825                       un = _union_3_new(argv[5]);
 
  829                              stderr, 
"ERROR: could not create the " 
  830                                      "requested union.\n");
 
  833                       data_lists->union_list =
 
  837                     case EET_BASIC_FLOAT:
 
  841                              stderr, 
"ERROR: wrong number of parameters" 
  846                       un = _union_float_new(argv[5]);
 
  850                              stderr, 
"ERROR: could not create the " 
  851                                      "requested union.\n");
 
  854                       data_lists->union_list =
 
  858                     case EET_BASIC_STRING:
 
  862                              stderr, 
"ERROR: wrong number of parameters" 
  867                       un = _union_string_new(argv[5]);
 
  871                              stderr, 
"ERROR: could not create the " 
  872                                      "requested union.\n");
 
  875                       data_lists->union_list =
 
  881                         stderr, 
"ERROR: bad type of of struct passed\n");
 
  887                       "ERROR: wrong number of parameters (%d).\n",
 
  890        else if (strcmp(argv[3], 
"variant") == 0)
 
  894                  int type = atoi(argv[4]);
 
  897                  if (type < EET_STRUCT1 || type > EET_STRUCT3)
 
  900                               "ERROR: invalid type parameter (%s).\n",
 
  911                              stderr, 
"ERROR: wrong number of parameters" 
  917                           argv[5], argv[6], argv[7]);
 
  921                              stderr, 
"ERROR: could not create the " 
  922                                      "requested variant.\n");
 
  925                       data_lists->variant_list =
 
  933                              stderr, 
"ERROR: wrong number of parameters" 
  938                       va = _variant_2_new(argv[5], argv[6]);
 
  942                              stderr, 
"ERROR: could not create the " 
  943                                      "requested variant.\n");
 
  946                       data_lists->variant_list =
 
  954                              stderr, 
"ERROR: wrong number of parameters" 
  959                       va = _variant_3_new(argv[5]);
 
  963                              stderr, 
"ERROR: could not create the " 
  964                                      "requested variant.\n");
 
  967                       data_lists->variant_list =
 
  973                         stderr, 
"ERROR: bad type of of struct passed\n");
 
  979                       "ERROR: wrong number of parameters (%d).\n",
 
  983          fprintf(stderr, 
"ERROR: unknown action '%s'\n", argv[3]);
 
  987   printf(
"Cached data:\n");
 
  989   printf(
"\tstats: unions=%u, variants=%u\n",
 
  990          eina_list_count(data_lists->union_list),
 
  991          eina_list_count(data_lists->variant_list));
 
  993   if (eina_list_count(data_lists->union_list))
 
  996        const Example_Union *un;
 
  997        printf(
"\t  * union list:\n");
 
 1005   if (eina_list_count(data_lists->variant_list))
 
 1008        const Example_Variant *un;
 
 1009        printf(
"\t  * variant list:\n");
 
 1019   if (!_data_save(data_lists, argv[2]))
 
 1022   _data_free(data_lists);
 
 1027   _data_descriptors_shutdown();
 
The file that provides the eet functions.
 
#define EET_T_UCHAR
Data type: unsigned char.
Definition Eet.h:2602
 
EAPI void eet_data_descriptor_free(Eet_Data_Descriptor *edd)
This function frees a data descriptor when it is not needed anymore.
Definition eet_data.c:2104
 
struct _Eet_Data_Descriptor Eet_Data_Descriptor
Opaque handle that have information on a type members.
Definition Eet.h:2648
 
EAPI void * eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
Reads a data structure from an eet file and decodes it.
Definition eet_data.c:2379
 
#define EET_T_INT
Data type: int.
Definition Eet.h:2598
 
EAPI Eet_Data_Descriptor * eet_data_descriptor_stream_new(const Eet_Data_Descriptor_Class *eddc)
This function creates a new data descriptor and returns a handle to the new data descriptor.
Definition eet_data.c:2084
 
#define EET_DATA_DESCRIPTOR_ADD_VARIANT(edd, struct_type, name, member, type_member, unified_type)
Adds a automatically selectable type to a data descriptor.
Definition Eet.h:3866
 
#define EET_T_DOUBLE
Data type: double.
Definition Eet.h:2601
 
#define EET_DATA_DESCRIPTOR_ADD_BASIC(edd, struct_type, name, member, type)
Adds a basic data element to a data descriptor.
Definition Eet.h:3449
 
EAPI int eet_data_write(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, const void *data, int compress)
Writes a data structure from memory and store in an eet file.
Definition eet_data.c:2416
 
#define EET_T_ULONG_LONG
Data type: unsigned long long.
Definition Eet.h:2605
 
EAPI Eet_Error eet_close(Eet_File *ef)
Closes an eet file handle and flush pending writes.
Definition eet_lib.c:1934
 
EAPI int eet_dictionary_string_check(Eet_Dictionary *ed, const char *string)
Checks if a given string comes from a given dictionary.
Definition eet_dictionary.c:601
 
EAPI Eet_File * eet_open(const char *file, Eet_File_Mode mode)
Opens an eet file on disk, and returns a handle to it.
Definition eet_lib.c:1525
 
struct _Eet_File Eet_File
Opaque handle that defines an Eet file (or memory).
Definition Eet.h:527
 
EAPI Eet_Dictionary * eet_dictionary_get(Eet_File *ef)
Returns a handle to the shared string dictionary of the Eet file.
Definition eet_lib.c:2599
 
struct _Eet_Dictionary Eet_Dictionary
Opaque handle that defines a file-backed (mmaped) dictionary of strings.
Definition Eet.h:533
 
@ EET_FILE_MODE_READ
File is read-only.
Definition Eet.h:479
 
@ EET_FILE_MODE_WRITE
File is write-only.
Definition Eet.h:480
 
EAPI int eet_init(void)
Initializes the EET library.
Definition eet_lib.c:543
 
EAPI int eet_shutdown(void)
Shuts down the EET library.
Definition eet_lib.c:597
 
EINA_API double eina_convert_strtod_c(const char *nptr, char **endptr)
Converts a string to a floating point number.
Definition eina_convert.c:472
 
EINA_API Eina_List * eina_list_append(Eina_List *list, const void *data)
Appends the given data to the given linked list.
Definition eina_list.c:584
 
#define EINA_LIST_FOREACH(list, l, _data)
Definition for the macro to iterate over a list.
Definition eina_list.h:1415
 
#define EINA_LIST_FREE(list, data)
Definition for the macro to remove each list node while having access to each node's data.
Definition eina_list.h:1629
 
EINA_API int eina_shutdown(void)
Shuts down the Eina library.
Definition eina_main.c:379
 
EINA_API int eina_init(void)
Initializes the Eina library.
Definition eina_main.c:291
 
EINA_API size_t eina_strlcpy(char *dst, const char *src, size_t siz)
Copies a c-string to another.
Definition eina_str.c:317
 
EINA_API Eina_Stringshare * eina_stringshare_add(const char *str)
Retrieves an instance of a string for use in a program.
Definition eina_stringshare.c:606
 
EINA_API void eina_stringshare_del(Eina_Stringshare *str)
Notes that the given string has lost an instance.
Definition eina_stringshare.c:533
 
#define EINA_TRUE
boolean value TRUE (numerical value 1)
Definition eina_types.h:539
 
#define EINA_FALSE
boolean value FALSE (numerical value 0)
Definition eina_types.h:533