Update typealias behavior
[babeltrace.git] / include / babeltrace / types.h
index 0bcb8594dfe6e88b548feeefe7403b43480cacdb..ad28ac0912c85e98e8bc2c27acd0474e446e1d47 100644 (file)
@@ -90,6 +90,7 @@ struct definition;
 /* type scope */
 struct declaration_scope {
        /* Hash table mapping type name GQuark to "struct declaration" */
+       /* Used for both typedef and typealias. */
        GHashTable *typedef_declarations;
        /* Hash table mapping struct name GQuark to "struct declaration_struct" */
        GHashTable *struct_declarations;
@@ -105,6 +106,15 @@ struct definition_scope {
        /* Hash table mapping field name GQuark to "struct definition" */
        GHashTable *definitions;
        struct definition_scope *parent_scope;
+       /*
+        * Complete "path" leading to this definition scope.
+        * Includes dynamic scope name '.' field name '.' field name '.' ....
+        * Array of GQuark elements (which are each separated by dots).
+        * The dynamic scope name can contain dots, and is encoded into
+        * a single GQuark. Thus, scope_path[0] returns the GQuark
+        * identifying the dynamic scope.
+        */
+       GArray *scope_path;     /* array of GQuark */
 };
 
 enum ctf_type_id {
@@ -114,6 +124,7 @@ enum ctf_type_id {
        CTF_TYPE_ENUM,
        CTF_TYPE_STRING,
        CTF_TYPE_STRUCT,
+       CTF_TYPE_UNTAGGED_VARIANT,
        CTF_TYPE_VARIANT,
        CTF_TYPE_ARRAY,
        CTF_TYPE_SEQUENCE,
@@ -131,7 +142,8 @@ struct declaration {
        void (*declaration_free)(struct declaration *declaration);
        struct definition *
                (*definition_new)(struct declaration *declaration,
-                                 struct definition_scope *parent_scope);
+                                 struct definition_scope *parent_scope,
+                                 GQuark field_name, int index);
        /*
         * definition_free called with definition ref is decremented to 0.
         */
@@ -147,6 +159,7 @@ struct declaration {
 
 struct definition {
        struct declaration *declaration;
+       int index;              /* Position of the definition in its container */
        int ref;                /* number of references to the definition */
 };
 
@@ -274,15 +287,20 @@ struct definition_struct {
        GArray *fields;                 /* Array of struct field */
 };
 
-struct declaration_variant {
+struct declaration_untagged_variant {
        struct declaration p;
        GHashTable *fields_by_tag;      /* Tuples (field tag, field index) */
        struct declaration_scope *scope;
        GArray *fields;                 /* Array of declaration_field */
-       GQuark tag_name;                /* TODO */
-       /* Tag name must be nonzero and must exist when defining the variant */
 };
 
+struct declaration_variant {
+       struct declaration p;
+       struct declaration_untagged_variant *untagged_variant;
+       GArray *tag_name;               /* Array of GQuark */
+};
+
+/* A variant needs to be tagged to be defined. */
 struct definition_variant {
        struct definition p;
        struct declaration_variant *declaration;
@@ -360,13 +378,18 @@ void free_declaration_scope(struct declaration_scope *scope);
  * definition scopes.
  */
 struct definition *
-       lookup_field_definition(GQuark field_name,
-                               struct definition_scope *scope);
+       lookup_definition(GArray *cur_path,     /* array of GQuark */
+                         GArray *lookup_path,  /* array of GQuark */
+                         struct definition_scope *scope);
 int register_field_definition(GQuark field_name,
                              struct definition *definition,
                              struct definition_scope *scope);
 struct definition_scope *
-       new_definition_scope(struct definition_scope *parent_scope);
+       new_definition_scope(struct definition_scope *parent_scope,
+                            GQuark field_name);
+void set_dynamic_definition_scope(struct definition *definition,
+                                 struct definition_scope *scope,
+                                 const char *root_name);
 void free_definition_scope(struct definition_scope *scope);
 
 void declaration_ref(struct declaration *declaration);
@@ -452,12 +475,17 @@ struct_get_field_from_index(struct definition_struct *struct_definition,
  * from numeric values to a single tag. Overlapping tag value ranges are
  * therefore forbidden.
  */
-struct declaration_variant *variant_declaration_new(const char *name,
-                                     struct declaration_scope *parent_scope);
-void variant_declaration_add_field(struct declaration_variant *variant_declaration,
-                                  const char *tag_name, struct declaration *tag_declaration);
+struct declaration_untagged_variant *untagged_variant_declaration_new(const char *name,
+               struct declaration_scope *parent_scope);
+struct declaration_variant *variant_declaration_new(struct declaration_untagged_variant *untagged_variant,
+               const char *tag);
+
+void untagged_variant_declaration_add_field(struct declaration_untagged_variant *untagged_variant_declaration,
+               const char *field_name,
+               struct declaration *field_declaration);
 struct declaration_field *
-       variant_declaration_get_field_from_tag(struct declaration_variant *variant_declaration, GQuark tag);
+       untagged_variant_declaration_get_field_from_tag(struct declaration_untagged_variant *untagged_variant_declaration,
+               GQuark tag);
 /*
  * Returns 0 on success, -EPERM on error.
  */
@@ -477,8 +505,8 @@ struct field *variant_get_current_field(struct definition_variant *variant);
  */
 struct declaration_array *
        array_declaration_new(const char *name,
-                       size_t len, struct declaration *elem_declaration,
-                       struct declaration_scope *parent_scope);
+               size_t len, struct declaration *elem_declaration,
+               struct declaration_scope *parent_scope);
 
 /*
  * int_declaration and elem_declaration passed as parameter now belong
@@ -486,8 +514,13 @@ struct declaration_array *
  */
 struct declaration_sequence *
        sequence_declaration_new(const char *name,
-                       struct declaration_integer *len_declaration, 
-                       struct declaration *elem_declaration,
-                       struct declaration_scope *parent_scope);
+               struct declaration_integer *len_declaration, 
+               struct declaration *elem_declaration,
+               struct declaration_scope *parent_scope);
+
+/*
+ * in: path (dot separated), out: q (GArray of GQuark)
+ */
+void append_scope_path(const char *path, GArray *q);
 
 #endif /* _BABELTRACE_declarationS_H */
This page took 0.027156 seconds and 4 git commands to generate.