+
+static
+void bt_ctf_field_enumeration_set_is_frozen_recursive(
+ struct bt_field_common *field, bool is_frozen)
+{
+ struct bt_ctf_field_enumeration *enumeration = (void *) field;
+
+ if (enumeration->container) {
+ bt_field_common_set_is_frozen_recursive(
+ (void *) enumeration->container, is_frozen);
+ }
+
+ bt_field_common_generic_set_is_frozen((void *) field, is_frozen);
+}
+
+static
+int bt_ctf_field_enumeration_validate_recursive(struct bt_field_common *field)
+{
+ int ret = -1;
+ struct bt_ctf_field_enumeration *enumeration = (void *) field;
+
+ if (enumeration->container) {
+ ret = bt_field_common_validate_recursive(
+ (void *) enumeration->container);
+ }
+
+ return ret;
+}
+
+static
+bt_bool bt_ctf_field_enumeration_is_set_recursive(struct bt_field_common *field)
+{
+ bt_bool is_set = BT_FALSE;
+ struct bt_ctf_field_enumeration *enumeration = (void *) field;
+
+ if (enumeration->container) {
+ is_set = bt_field_common_is_set_recursive(
+ (void *) enumeration->container);
+ }
+
+ return is_set;
+}
+
+static
+void bt_ctf_field_enumeration_reset_recursive(struct bt_field_common *field)
+{
+ struct bt_ctf_field_enumeration *enumeration = (void *) field;
+
+ if (enumeration->container) {
+ bt_field_common_reset_recursive(
+ (void *) enumeration->container);
+ }
+
+ bt_field_common_generic_reset((void *) field);
+}
+
+static
+void bt_ctf_field_variant_set_is_frozen_recursive(
+ struct bt_field_common *field, bool is_frozen)
+{
+ struct bt_ctf_field_variant *variant = (void *) field;
+
+ if (variant->tag) {
+ bt_field_common_set_is_frozen_recursive(
+ (void *) variant->tag, is_frozen);
+ }
+
+ bt_field_common_variant_set_is_frozen_recursive((void *) field,
+ is_frozen);
+}
+
+static
+int bt_ctf_field_variant_validate_recursive(struct bt_field_common *field)
+{
+ int ret;
+ struct bt_ctf_field_variant *variant = (void *) field;
+
+ if (variant->tag) {
+ ret = bt_field_common_validate_recursive(
+ (void *) variant->tag);
+ if (ret) {
+ goto end;
+ }
+ }
+
+ ret = bt_field_common_variant_validate_recursive((void *) field);
+
+end:
+ return ret;
+}
+
+static
+bt_bool bt_ctf_field_variant_is_set_recursive(struct bt_field_common *field)
+{
+ bt_bool is_set;
+ struct bt_ctf_field_variant *variant = (void *) field;
+
+ if (variant->tag) {
+ is_set = bt_field_common_is_set_recursive(
+ (void *) variant->tag);
+ if (is_set) {
+ goto end;
+ }
+ }
+
+ is_set = bt_field_common_variant_is_set_recursive((void *) field);
+
+end:
+ return is_set;
+}
+
+static
+void bt_ctf_field_variant_reset_recursive(struct bt_field_common *field)
+{
+ struct bt_ctf_field_variant *variant = (void *) field;
+
+ if (variant->tag) {
+ bt_field_common_reset_recursive(
+ (void *) variant->tag);
+ }
+
+ bt_field_common_variant_reset_recursive((void *) field);
+}
+
+BT_ASSERT_PRE_FUNC
+static inline bool field_to_set_has_expected_type(
+ struct bt_field_common *struct_field,
+ const char *name, struct bt_field_common *value)
+{
+ bool ret = true;
+ struct bt_field_type_common *expected_field_type = NULL;
+
+ expected_field_type =
+ bt_field_type_common_structure_borrow_field_type_by_name(
+ struct_field->type, name);
+
+ if (bt_field_type_common_compare(expected_field_type, value->type)) {
+ BT_ASSERT_PRE_MSG("Value field's type is different from the expected field type: "
+ "%![value-ft-]+_F, %![expected-ft-]+_F", value->type,
+ expected_field_type);
+ ret = false;
+ goto end;
+ }
+
+end:
+ return ret;
+}
+
+BT_HIDDEN
+int bt_ctf_field_structure_set_field_by_name(struct bt_ctf_field *field,
+ const char *name, struct bt_ctf_field *value)
+{
+ int ret = 0;
+ GQuark field_quark;
+ struct bt_field_common *common_field = (void *) field;
+ struct bt_field_common_structure *structure =
+ BT_FROM_COMMON(common_field);
+ struct bt_field_common *common_value = (void *) value;
+ size_t index;
+ GHashTable *field_name_to_index;
+ struct bt_field_type_common_structure *structure_ft;
+
+ BT_ASSERT_PRE_NON_NULL(field, "Parent field");
+ BT_ASSERT_PRE_NON_NULL(name, "Field name");
+ BT_ASSERT_PRE_NON_NULL(value, "Value field");
+ BT_ASSERT_PRE_FIELD_COMMON_HAS_TYPE_ID(common_field,
+ BT_FIELD_TYPE_ID_STRUCT, "Parent field");
+ BT_ASSERT_PRE(field_to_set_has_expected_type(common_field,
+ name, common_value),
+ "Value field's type is different from the expected field type.");
+ field_quark = g_quark_from_string(name);
+ structure_ft = BT_FROM_COMMON(common_field->type);
+ field_name_to_index = structure_ft->field_name_to_index;
+ if (!g_hash_table_lookup_extended(field_name_to_index,
+ GUINT_TO_POINTER(field_quark), NULL,
+ (gpointer *) &index)) {
+ BT_LOGV("Invalid parameter: no such field in structure field's type: "
+ "struct-field-addr=%p, struct-ft-addr=%p, "
+ "field-ft-addr=%p, name=\"%s\"",
+ field, common_field->type, common_value->type, name);
+ ret = -1;
+ goto end;
+ }
+ bt_get(value);
+ BT_MOVE(structure->fields->pdata[index], value);
+
+end:
+ return ret;
+}