+
+BT_HIDDEN
+struct bt_ctf_field_path *bt_ctf_field_type_variant_get_tag_field_path(
+ struct bt_ctf_field_type *type)
+{
+ struct bt_ctf_field_type_variant *variant;
+
+ variant = container_of(type, struct bt_ctf_field_type_variant,
+ parent);
+
+ return variant->tag_path;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_variant_set_tag(struct bt_ctf_field_type *type,
+ struct bt_ctf_field_type *tag)
+{
+ int ret = 0;
+ struct bt_ctf_field_type_variant *variant;
+
+ if (!type || !tag || type->frozen ||
+ bt_ctf_field_type_get_type_id(tag) != CTF_TYPE_ENUM) {
+ ret = -1;
+ goto end;
+ }
+
+ variant = container_of(type, struct bt_ctf_field_type_variant,
+ parent);
+ bt_ctf_field_type_get(tag);
+ if (variant->tag) {
+ bt_ctf_field_type_put(&variant->tag->parent);
+ }
+ variant->tag = container_of(tag, struct bt_ctf_field_type_enumeration,
+ parent);
+end:
+ return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_type_variant_set_field_index(struct bt_ctf_field_type *type,
+ struct bt_ctf_field_type *field, int index)
+{
+ int ret = 0;
+ struct bt_ctf_field_type_variant *variant;
+
+ if (!type || !field ||
+ bt_ctf_field_type_get_type_id(type) != CTF_TYPE_VARIANT) {
+ ret = -1;
+ goto end;
+ }
+
+ variant = container_of(type, struct bt_ctf_field_type_variant,
+ parent);
+ if (index < 0 || index >= variant->fields->len) {
+ ret = -1;
+ goto end;
+ }
+
+ bt_ctf_field_type_get(field);
+ bt_ctf_field_type_put(((struct structure_field *)
+ g_ptr_array_index(variant->fields, index))->type);
+ ((struct structure_field *) variant->fields->pdata[index])->type =
+ field;
+end:
+ return ret;
+}
+