lib: add bt_field_class_variant_borrow_option_by_{index,name}()
[babeltrace.git] / src / lib / trace-ir / field-class.c
index f1dd23955d95937991f650d2395b114a147dbb85..78e30f4dc0109e916a921b5f24e07e2832418c2e 100644 (file)
@@ -64,6 +64,88 @@ void init_field_class(struct bt_field_class *fc, enum bt_field_class_type type,
        fc->type = type;
 }
 
+static
+void destroy_bit_array_field_class(struct bt_object *obj)
+{
+       BT_ASSERT(obj);
+       BT_LIB_LOGD("Destroying bit array field class object: %!+F", obj);
+       g_free(obj);
+}
+
+struct bt_field_class *bt_field_class_bit_array_create(
+               struct bt_trace_class *trace_class, uint64_t length)
+{
+       struct bt_field_class_bit_array *ba_fc = NULL;
+
+       BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class");
+       BT_ASSERT_PRE(length > 0 && length <= 64,
+               "Unsupported length for bit array field class "
+               "(minimum is 1, maximum is 64): length=%" PRIu64, length);
+       BT_LOGD("Creating default bit array field class object.");
+       ba_fc = g_new0(struct bt_field_class_bit_array, 1);
+       if (!ba_fc) {
+               BT_LIB_LOGE_APPEND_CAUSE(
+                       "Failed to allocate one bit array field class.");
+               goto error;
+       }
+
+       init_field_class((void *) ba_fc, BT_FIELD_CLASS_TYPE_BIT_ARRAY,
+               destroy_bit_array_field_class);
+       ba_fc->length = length;
+       BT_LIB_LOGD("Created bit array field class object: %!+F", ba_fc);
+       goto end;
+
+error:
+       BT_OBJECT_PUT_REF_AND_RESET(ba_fc);
+
+end:
+       return (void *) ba_fc;
+}
+
+uint64_t bt_field_class_bit_array_get_length(const struct bt_field_class *fc)
+{
+       const struct bt_field_class_bit_array *ba_fc = (const void *) fc;
+
+       BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class");
+       BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_BIT_ARRAY,
+               "Field class");
+       return ba_fc->length;
+}
+
+static
+void destroy_bool_field_class(struct bt_object *obj)
+{
+       BT_ASSERT(obj);
+       BT_LIB_LOGD("Destroying boolean field class object: %!+F", obj);
+       g_free(obj);
+}
+
+struct bt_field_class *bt_field_class_bool_create(
+               bt_trace_class *trace_class)
+{
+       struct bt_field_class_bool *bool_fc = NULL;
+
+       BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class");
+       BT_LOGD("Creating default boolean field class object.");
+       bool_fc = g_new0(struct bt_field_class_bool, 1);
+       if (!bool_fc) {
+               BT_LIB_LOGE_APPEND_CAUSE(
+                       "Failed to allocate one boolean field class.");
+               goto error;
+       }
+
+       init_field_class((void *) bool_fc, BT_FIELD_CLASS_TYPE_BOOL,
+               destroy_bool_field_class);
+       BT_LIB_LOGD("Created boolean field class object: %!+F", bool_fc);
+       goto end;
+
+error:
+       BT_OBJECT_PUT_REF_AND_RESET(bool_fc);
+
+end:
+       return (void *) bool_fc;
+}
+
 static
 void init_integer_field_class(struct bt_field_class_integer *fc,
                enum bt_field_class_type type,
@@ -512,7 +594,7 @@ add_mapping_to_enumeration_field_class(struct bt_field_class *fc,
 
        BT_ASSERT(fc);
        BT_ASSERT_PRE_NON_NULL(label, "Label");
-       BT_ASSERT_PRE_NON_NULL(range_set, "Range set");
+       BT_ASSERT_PRE_NON_NULL(range_set, "Integer range set");
        BT_ASSERT_PRE(!enumeration_field_class_has_mapping_with_label(
                enum_fc, label),
                "Duplicate mapping name in enumeration field class: "
@@ -985,6 +1067,86 @@ bt_field_class_structure_member_borrow_field_class_const(
        return named_fc->fc;
 }
 
+static
+void destroy_option_field_class(struct bt_object *obj)
+{
+       struct bt_field_class_option *fc = (void *) obj;
+
+       BT_ASSERT(fc);
+       BT_LIB_LOGD("Destroying option field class object: %!+F", fc);
+       BT_LOGD_STR("Putting content field class.");
+       BT_OBJECT_PUT_REF_AND_RESET(fc->content_fc);
+       BT_LOGD_STR("Putting selector field path.");
+       BT_OBJECT_PUT_REF_AND_RESET(fc->selector_field_path);
+       BT_LOGD_STR("Putting selector field class.");
+       BT_OBJECT_PUT_REF_AND_RESET(fc->selector_fc);
+       g_free(fc);
+}
+
+struct bt_field_class *bt_field_class_option_create(bt_trace_class *trace_class,
+               bt_field_class *content_fc, bt_field_class *selector_fc)
+{
+       struct bt_field_class_option *opt_fc = NULL;
+
+       BT_ASSERT_PRE_NON_NULL(trace_class, "Trace class");
+       BT_ASSERT_PRE_NON_NULL(content_fc, "Content field class");
+       BT_LIB_LOGD("Creating option field class: "
+               "%![content-fc-]+F, %![sel-fc-]+F", content_fc, selector_fc);
+       opt_fc = g_new0(struct bt_field_class_option, 1);
+       if (!opt_fc) {
+               BT_LIB_LOGE_APPEND_CAUSE(
+                       "Failed to allocate one option field class.");
+               goto error;
+       }
+
+       init_field_class((void *) opt_fc, BT_FIELD_CLASS_TYPE_OPTION,
+               destroy_option_field_class);
+       opt_fc->content_fc = content_fc;
+       bt_object_get_no_null_check(opt_fc->content_fc);
+       bt_field_class_freeze(opt_fc->content_fc);
+
+       if (selector_fc) {
+               BT_ASSERT_PRE_FC_HAS_ID(selector_fc, BT_FIELD_CLASS_TYPE_BOOL,
+                       "Selector field class");
+               opt_fc->selector_fc = selector_fc;
+               bt_object_get_no_null_check(opt_fc->selector_fc);
+               bt_field_class_freeze(selector_fc);
+       }
+
+       BT_LIB_LOGD("Created option field class object: "
+               "%![opt-fc-]+F, %![sel-fc-]+F", opt_fc, selector_fc);
+       goto end;
+
+error:
+       BT_OBJECT_PUT_REF_AND_RESET(opt_fc);
+
+end:
+       return (void *) opt_fc;
+}
+
+const struct bt_field_class *bt_field_class_option_borrow_field_class_const(
+                       const struct bt_field_class *fc)
+{
+       struct bt_field_class_option *opt_fc = (void *) fc;
+
+       BT_ASSERT_PRE_NON_NULL(fc, "Field class");
+       BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_OPTION,
+               "Field class");
+       return opt_fc->content_fc;
+}
+
+const struct bt_field_path *
+bt_field_class_option_borrow_selector_field_path_const(
+               const struct bt_field_class *fc)
+{
+       struct bt_field_class_option *opt_fc = (void *) fc;
+
+       BT_ASSERT_PRE_NON_NULL(fc, "Field class");
+       BT_ASSERT_PRE_DEV_FC_HAS_ID(fc, BT_FIELD_CLASS_TYPE_OPTION,
+               "Field class");
+       return opt_fc->selector_field_path;
+}
+
 static
 void finalize_variant_field_class(struct bt_field_class_variant *var_fc)
 {
@@ -1226,10 +1388,10 @@ int append_option_to_variant_with_selector_field_class(
        BT_ASSERT_PRE_NON_NULL(fc, "Field class");
        BT_ASSERT_PRE_NON_NULL(name, "Name");
        BT_ASSERT_PRE_NON_NULL(option_fc, "Option field class");
-       BT_ASSERT_PRE_NON_NULL(range_set, "Range set");
+       BT_ASSERT_PRE_NON_NULL(range_set, "Integer range set");
        BT_ASSERT_PRE_FC_HAS_ID(fc, expected_type, "Field class");
        BT_ASSERT_PRE(range_set->ranges->len > 0,
-               "Range set is empty: addr=%p", range_set);
+               "Integer range set is empty: %!+R", range_set);
        status = ranges_overlap(var_fc->common.common.named_fcs, range_set,
                expected_type == BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR,
                &has_overlap);
@@ -1239,8 +1401,8 @@ int append_option_to_variant_with_selector_field_class(
        }
 
        BT_ASSERT_PRE(!has_overlap,
-               "Range set's ranges and existing ranges have an overlap: "
-               "addr=%p", range_set);
+               "Integer range set's ranges and existing ranges have an overlap: "
+               "%!+R", range_set);
        opt = create_variant_with_selector_option(name, option_fc, range_set);
        if (!opt) {
                /* create_variant_with_selector_option() logs errors */
@@ -1316,6 +1478,28 @@ bt_field_class_variant_borrow_option_by_index_const(
                        (void *) fc, index);
 }
 
+struct bt_field_class_variant_option *
+bt_field_class_variant_borrow_option_by_name(
+               struct bt_field_class *fc, const char *name)
+{
+       BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class");
+       BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc, "Field class");
+       return (void *)
+               borrow_named_field_class_from_container_field_class_by_name(
+                       (void *) fc, name);
+}
+
+struct bt_field_class_variant_option *
+bt_field_class_variant_borrow_option_by_index(
+               struct bt_field_class *fc, uint64_t index)
+{
+       BT_ASSERT_PRE_DEV_NON_NULL(fc, "Field class");
+       BT_ASSERT_PRE_DEV_FC_IS_VARIANT(fc, "Field class");
+       return (void *)
+               borrow_named_field_class_from_container_field_class_at_index(
+                       (void *) fc, index);
+}
+
 const struct bt_field_class_variant_with_selector_unsigned_option *
 bt_field_class_variant_with_selector_unsigned_borrow_option_by_name_const(
                const struct bt_field_class *fc, const char *name)
This page took 0.026012 seconds and 4 git commands to generate.