+ 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_FC_HAS_ID(fc, expected_type, "Field class");
+ BT_ASSERT_PRE(range_set->ranges->len > 0,
+ "Range set is empty: addr=%p", 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);
+ if (status) {
+ /* ranges_overlap() logs errors */
+ goto end;
+ }
+
+ BT_ASSERT_PRE(!has_overlap,
+ "Range set's ranges and existing ranges have an overlap: "
+ "addr=%p", range_set);
+ opt = create_variant_with_selector_option(name, option_fc, range_set);
+ if (!opt) {
+ /* create_variant_with_selector_option() logs errors */
+ status = BT_FUNC_STATUS_MEMORY_ERROR;
+ goto end;
+ }
+
+ status = append_named_field_class_to_container_field_class((void *) fc,
+ &opt->common);
+ if (status == BT_FUNC_STATUS_OK) {
+ /* Moved to the container */
+ opt = NULL;
+ }
+
+end:
+ if (opt) {
+ destroy_variant_with_selector_option(opt);
+ }
+
+ return status;
+}
+
+enum bt_field_class_variant_with_selector_append_option_status
+bt_field_class_variant_with_selector_unsigned_append_option(
+ struct bt_field_class *fc, const char *name,
+ struct bt_field_class *option_fc,
+ const struct bt_integer_range_set_unsigned *range_set)
+{
+ return append_option_to_variant_with_selector_field_class(fc,
+ name, option_fc, (const void *) range_set,
+ BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_SELECTOR);
+}
+
+enum bt_field_class_variant_with_selector_append_option_status
+bt_field_class_variant_with_selector_signed_append_option(
+ struct bt_field_class *fc, const char *name,
+ struct bt_field_class *option_fc,
+ const struct bt_integer_range_set_signed *range_set)
+{
+ return append_option_to_variant_with_selector_field_class(fc,
+ name, option_fc, (const void *) range_set,
+ BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_SELECTOR);