lib: use powers of two for object type enumerators
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 10 Oct 2019 16:03:36 +0000 (12:03 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 17 Oct 2019 16:13:27 +0000 (12:13 -0400)
For all object type enumerators, that is, enumerators containing
`_TYPE`, use powers of two instead of sequential values.

This makes it possible to test that a given object has one or more
given types with a single bitwise operation, for example:

    bt_field_class_type fc_type = bt_field_class_get_type(my_fc);

    if (fc_type &
            (BT_FIELD_CLASS_TYPE_STATIC_ARRAY |
             BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD |
             BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD)) {
        /* `my_fc` is an array */
    }

To make things easier, I'm also introducing one type enumerator per
"abstract" field class type. For example:

* `BT_FIELD_CLASS_TYPE_SIGNED_INTEGER`
* `BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION`
* `BT_FIELD_CLASS_TYPE_REAL`
* `BT_FIELD_CLASS_TYPE_ARRAY`
* `BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD`

No field class object has those exact types, but their type can have
those bits set. For example, all the integer field class types have
bit 2 set. Then, if you need to know if a given type is conceptually
a given type, use bt_field_class_type_is(), which
returns:

    (type & type_to_check) == type_to_check

Each `BT_FIELD_CLASS_TYPE_*` enumerator conceptually matches, more or
less, a field class `bt2` Python class. For example:

* `BT_FIELD_CLASS_TYPE_ARRAY` → `bt2._ArrayFieldClass`
* `BT_FIELD_CLASS_TYPE_REAL` → `bt2._RealFieldClass`

The C to Python equivalent expressions are:

Object has a specific type:
    C:

        bt_field_class_get_type(fc) == BT_FIELD_CLASS_TYPE_X

    Python:

        type(fc) is bt2._XFieldClassConst

Object is an instance of a conceptual type:
    C:

        bt_field_class_type_is(bt_field_class_get_type(obj),
                               BT_FIELD_CLASS_TYPE_ABC)

    Python:

        isinstance(fc, bt2._AbcFieldClassConst)

Of course it's more natural in Python, but Python was not developed in
1972.

All `BT_FIELD_CLASS_TYPE_*` enumerators are `unsigned long long` values
and the non-API `__BT_FIELD_CLASS_TYPE_BIG_VALUE` is `1ULL << 62`
because we could have more than 32 enumerators eventually so I want to
make sure the `bt_field_class_type` type is a 64-bit integer for ABI
compatibility reasons.

Because the enumerators are not sequential anymore, we can't use them
directly as the indexes of lookup tables. This is why bt_field_create()
and bt_field_destroy() now check the FC type explicitly instead of using
lookup tables. Those functions are not called often anyway as field
objects are always created and destroyed from object pools.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Change-Id: I1b5110f691e1eabc0ce9291c0281755a3c6a755b
Reviewed-on: https://review.lttng.org/c/babeltrace/+/2171
CI-Build: Simon Marchi <simon.marchi@efficios.com>
Reviewed-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Tested-by: jenkins <jenkins@lttng.org>
include/babeltrace2/error-cause-const.h
include/babeltrace2/graph/component-class-const.h
include/babeltrace2/graph/message-const.h
include/babeltrace2/graph/port-const.h
include/babeltrace2/trace-ir/field-class-const.h
include/babeltrace2/trace-ir/field-path-const.h
include/babeltrace2/value-const.h
src/lib/trace-ir/field.c
tests/cli/test_help

index 6771b0ad18efd7e4500b1ddeb0b8a9783cf33a25..004741fc614fb2e938eab752bc1f3461aa2bcb67 100644 (file)
@@ -38,10 +38,10 @@ extern "C" {
 #endif
 
 typedef enum bt_error_cause_actor_type {
-       BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN               = 0,
-       BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT             = 1,
-       BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS       = 2,
-       BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR      = 3,
+       BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN               = 1 << 0,
+       BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT             = 1 << 1,
+       BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS       = 1 << 2,
+       BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR      = 1 << 3,
 } bt_error_cause_actor_type;
 
 extern
index f265929a502ff9bbd50daad3113390da528690cb..da46d290cbfa6eaac47920bcbf0348eaea1e9234 100644 (file)
@@ -34,9 +34,9 @@ extern "C" {
 #endif
 
 typedef enum bt_component_class_type {
-       BT_COMPONENT_CLASS_TYPE_SOURCE = 0,
-       BT_COMPONENT_CLASS_TYPE_FILTER = 1,
-       BT_COMPONENT_CLASS_TYPE_SINK = 2,
+       BT_COMPONENT_CLASS_TYPE_SOURCE  = 1 << 0,
+       BT_COMPONENT_CLASS_TYPE_FILTER  = 1 << 1,
+       BT_COMPONENT_CLASS_TYPE_SINK    = 1 << 2,
 } bt_component_class_type;
 
 extern const char *bt_component_class_get_name(
index 080f377103274f04fd45b017d0241847908d891a..0612b3c88a2d2a40b06296a63689d9f1b20574ce 100644 (file)
@@ -37,14 +37,14 @@ extern "C" {
  * Message types. Unhandled message types should be ignored.
  */
 typedef enum bt_message_type {
-       BT_MESSAGE_TYPE_EVENT = 0,
-       BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY = 1,
-       BT_MESSAGE_TYPE_STREAM_BEGINNING = 2,
-       BT_MESSAGE_TYPE_STREAM_END = 3,
-       BT_MESSAGE_TYPE_PACKET_BEGINNING = 4,
-       BT_MESSAGE_TYPE_PACKET_END = 5,
-       BT_MESSAGE_TYPE_DISCARDED_EVENTS = 6,
-       BT_MESSAGE_TYPE_DISCARDED_PACKETS = 7,
+       BT_MESSAGE_TYPE_EVENT                           = 1 << 0,
+       BT_MESSAGE_TYPE_MESSAGE_ITERATOR_INACTIVITY     = 1 << 1,
+       BT_MESSAGE_TYPE_STREAM_BEGINNING                = 1 << 2,
+       BT_MESSAGE_TYPE_STREAM_END                      = 1 << 3,
+       BT_MESSAGE_TYPE_PACKET_BEGINNING                = 1 << 4,
+       BT_MESSAGE_TYPE_PACKET_END                      = 1 << 5,
+       BT_MESSAGE_TYPE_DISCARDED_EVENTS                = 1 << 6,
+       BT_MESSAGE_TYPE_DISCARDED_PACKETS               = 1 << 7,
 } bt_message_type;
 
 /**
index 5b22b884fe7f28aa2cc7085edaeb3c6dde18caec..eda9ccb9acff0d48cec54053db0b83c1bdc5166d 100644 (file)
@@ -36,8 +36,8 @@ extern "C" {
 #endif
 
 typedef enum bt_port_type {
-       BT_PORT_TYPE_INPUT = 0,
-       BT_PORT_TYPE_OUTPUT = 1,
+       BT_PORT_TYPE_INPUT      = 1 << 0,
+       BT_PORT_TYPE_OUTPUT     = 1 << 1,
 } bt_port_type;
 
 extern const char *bt_port_get_name(const bt_port *port);
index f88a007e8f17d112e426acb5232ddb5e25237216..2a5c88d64ee28b5cfeefb14685dcab8fab6510bc 100644 (file)
@@ -37,26 +37,45 @@ extern "C" {
 #endif
 
 typedef enum bt_field_class_type {
-       BT_FIELD_CLASS_TYPE_BOOL                                                = 0,
-       BT_FIELD_CLASS_TYPE_BIT_ARRAY                                           = 1,
-       BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER                                    = 2,
-       BT_FIELD_CLASS_TYPE_SIGNED_INTEGER                                      = 3,
-       BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION                                = 4,
-       BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION                                  = 5,
-       BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL                               = 6,
-       BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL                               = 7,
-       BT_FIELD_CLASS_TYPE_STRING                                              = 8,
-       BT_FIELD_CLASS_TYPE_STRUCTURE                                           = 9,
-       BT_FIELD_CLASS_TYPE_STATIC_ARRAY                                        = 10,
-       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD                  = 11,
-       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD                     = 12,
-       BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD                       = 13,
-       BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD                     = 14,
-       BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD         = 15,
-       BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD           = 16,
-       BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD                      = 17,
-       BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD        = 18,
-       BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD          = 19,
+       BT_FIELD_CLASS_TYPE_BOOL                                                = 1ULL << 0,
+       BT_FIELD_CLASS_TYPE_BIT_ARRAY                                           = 1ULL << 1,
+       BT_FIELD_CLASS_TYPE_INTEGER                                             = 1ULL << 2,
+       BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER                                    = (1ULL << 3) | BT_FIELD_CLASS_TYPE_INTEGER,
+       BT_FIELD_CLASS_TYPE_SIGNED_INTEGER                                      = (1ULL << 4) | BT_FIELD_CLASS_TYPE_INTEGER,
+       BT_FIELD_CLASS_TYPE_ENUMERATION                                         = 1ULL << 5,
+       BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION                                = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER,
+       BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION                                  = BT_FIELD_CLASS_TYPE_ENUMERATION | BT_FIELD_CLASS_TYPE_SIGNED_INTEGER,
+       BT_FIELD_CLASS_TYPE_REAL                                                = 1ULL << 6,
+       BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL                               = (1ULL << 7) | BT_FIELD_CLASS_TYPE_REAL,
+       BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL                               = (1ULL << 8) | BT_FIELD_CLASS_TYPE_REAL,
+       BT_FIELD_CLASS_TYPE_STRING                                              = 1ULL << 9,
+       BT_FIELD_CLASS_TYPE_STRUCTURE                                           = 1ULL << 10,
+       BT_FIELD_CLASS_TYPE_ARRAY                                               = 1ULL << 11,
+       BT_FIELD_CLASS_TYPE_STATIC_ARRAY                                        = (1ULL << 12) | BT_FIELD_CLASS_TYPE_ARRAY,
+       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY                                       = (1ULL << 13) | BT_FIELD_CLASS_TYPE_ARRAY,
+       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD                  = (1ULL << 14) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY,
+       BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD                     = (1ULL << 15) | BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY,
+       BT_FIELD_CLASS_TYPE_OPTION                                              = 1ULL << 16,
+       BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD                       = (1ULL << 17) | BT_FIELD_CLASS_TYPE_OPTION,
+       BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD                          = (1ULL << 18) | BT_FIELD_CLASS_TYPE_OPTION,
+       BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD                     = (1ULL << 19) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD                  = (1ULL << 20) | BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD         = (1ULL << 21) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD           = (1ULL << 22) | BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_VARIANT                                             = 1ULL << 23,
+       BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD                      = (1ULL << 24) | BT_FIELD_CLASS_TYPE_VARIANT,
+       BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD                         = (1ULL << 25) | BT_FIELD_CLASS_TYPE_VARIANT,
+       BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD                 = (1ULL << 26) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD        = (1ULL << 27) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD,
+       BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD          = (1ULL << 28) | BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD,
+
+       /*
+        * Make sure the enumeration type is a 64-bit integer in case
+        * the project needs field class types in the future.
+        *
+        * This is not part of the API.
+        */
+       __BT_FIELD_CLASS_TYPE_BIG_VALUE                                         = 1ULL << 62,
 } bt_field_class_type;
 
 typedef enum bt_field_class_integer_preferred_display_base {
@@ -69,6 +88,13 @@ typedef enum bt_field_class_integer_preferred_display_base {
 extern bt_field_class_type bt_field_class_get_type(
                const bt_field_class *field_class);
 
+static inline
+bt_bool bt_field_class_type_is(const bt_field_class_type type,
+               const bt_field_class_type type_to_check)
+{
+       return (type & type_to_check) == type_to_check;
+}
+
 extern const bt_value *bt_field_class_borrow_user_attributes_const(
                const bt_field_class *field_class);
 
index 0f44a63db7e4877925a974642aef875ee15bbf3e..06dfe052b1067100fda31b52c3006466badc189f 100644 (file)
@@ -36,9 +36,9 @@ extern "C" {
 #endif
 
 typedef enum bt_field_path_item_type {
-       BT_FIELD_PATH_ITEM_TYPE_INDEX                           = 0,
-       BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT           = 1,
-       BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT          = 2,
+       BT_FIELD_PATH_ITEM_TYPE_INDEX                           = 1 << 0,
+       BT_FIELD_PATH_ITEM_TYPE_CURRENT_ARRAY_ELEMENT           = 1 << 1,
+       BT_FIELD_PATH_ITEM_TYPE_CURRENT_OPTION_CONTENT          = 1 << 2,
 } bt_field_path_item_type;
 
 typedef enum bt_field_path_scope {
index 2f1ffe779b653bfdfc241f545b1de325fd15d366..0001ddd8d1e33e0a39e2621fb51f19aae489df58 100644 (file)
@@ -38,32 +38,41 @@ extern "C" {
 
 typedef enum bt_value_type {
        /// Null value object.
-       BT_VALUE_TYPE_NULL              = 0,
+       BT_VALUE_TYPE_NULL              = 1 << 0,
 
        /// Boolean value object (holds #BT_TRUE or #BT_FALSE).
-       BT_VALUE_TYPE_BOOL              = 1,
+       BT_VALUE_TYPE_BOOL              = 1 << 1,
+
+       BT_VALUE_TYPE_INTEGER           = 1 << 2,
 
        /// Unsigned integer value object (holds an unsigned 64-bit integer raw value).
-       BT_VALUE_TYPE_UNSIGNED_INTEGER  = 2,
+       BT_VALUE_TYPE_UNSIGNED_INTEGER  = (1 << 3) | BT_VALUE_TYPE_INTEGER,
 
        /// Signed integer value object (holds a signed 64-bit integer raw value).
-       BT_VALUE_TYPE_SIGNED_INTEGER    = 3,
+       BT_VALUE_TYPE_SIGNED_INTEGER    = (1 << 4) | BT_VALUE_TYPE_INTEGER,
 
        /// Floating point number value object (holds a \c double raw value).
-       BT_VALUE_TYPE_REAL              = 4,
+       BT_VALUE_TYPE_REAL              = 1 << 5,
 
        /// String value object.
-       BT_VALUE_TYPE_STRING            = 5,
+       BT_VALUE_TYPE_STRING            = 1 << 6,
 
        /// Array value object.
-       BT_VALUE_TYPE_ARRAY             = 6,
+       BT_VALUE_TYPE_ARRAY             = 1 << 7,
 
        /// Map value object.
-       BT_VALUE_TYPE_MAP               = 7,
+       BT_VALUE_TYPE_MAP               = 1 << 8,
 } bt_value_type;
 
 extern bt_value_type bt_value_get_type(const bt_value *object);
 
+static inline
+bt_bool bt_value_type_is(const bt_value_type type,
+               const bt_value_type type_to_check)
+{
+       return (type & type_to_check) == type_to_check;
+}
+
 static inline
 bt_bool bt_value_is_null(const bt_value *object)
 {
index ca7dbb20d64f32dd3635d40fba729b2c204b1d75..0b8529b28be98afe61ea70c7e3fbe07c6a3c81a7 100644 (file)
@@ -163,6 +163,7 @@ struct bt_field *create_string_field(struct bt_field_class *);
 
 static
 struct bt_field *create_structure_field(struct bt_field_class *);
+
 static
 struct bt_field *create_static_array_field(struct bt_field_class *);
 
@@ -175,30 +176,6 @@ struct bt_field *create_option_field(struct bt_field_class *);
 static
 struct bt_field *create_variant_field(struct bt_field_class *);
 
-static
-struct bt_field *(* const field_create_funcs[])(struct bt_field_class *) = {
-       [BT_FIELD_CLASS_TYPE_BOOL]                                      = create_bool_field,
-       [BT_FIELD_CLASS_TYPE_BIT_ARRAY]                                 = create_bit_array_field,
-       [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER]                          = create_integer_field,
-       [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER]                            = create_integer_field,
-       [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION]                      = create_integer_field,
-       [BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION]                        = create_integer_field,
-       [BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL]                     = create_real_field,
-       [BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL]                     = create_real_field,
-       [BT_FIELD_CLASS_TYPE_STRING]                                    = create_string_field,
-       [BT_FIELD_CLASS_TYPE_STRUCTURE]                                 = create_structure_field,
-       [BT_FIELD_CLASS_TYPE_STATIC_ARRAY]                              = create_static_array_field,
-       [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD]        = create_dynamic_array_field,
-       [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD]           = create_dynamic_array_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD]                     = create_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD]                   = create_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD]       = create_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = create_option_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD]                    = create_variant_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD]      = create_variant_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD]        = create_variant_field,
-};
-
 static
 void destroy_bool_field(struct bt_field *field);
 
@@ -226,30 +203,6 @@ void destroy_option_field(struct bt_field *field);
 static
 void destroy_variant_field(struct bt_field *field);
 
-static
-void (* const field_destroy_funcs[])(struct bt_field *) = {
-       [BT_FIELD_CLASS_TYPE_BOOL]                                      = destroy_bool_field,
-       [BT_FIELD_CLASS_TYPE_BIT_ARRAY]                                 = destroy_bit_array_field,
-       [BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER]                          = destroy_integer_field,
-       [BT_FIELD_CLASS_TYPE_SIGNED_INTEGER]                            = destroy_integer_field,
-       [BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION]                      = destroy_integer_field,
-       [BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION]                        = destroy_integer_field,
-       [BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL]                     = destroy_real_field,
-       [BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL]                     = destroy_real_field,
-       [BT_FIELD_CLASS_TYPE_STRING]                                    = destroy_string_field,
-       [BT_FIELD_CLASS_TYPE_STRUCTURE]                                 = destroy_structure_field,
-       [BT_FIELD_CLASS_TYPE_STATIC_ARRAY]                              = destroy_array_field,
-       [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD]        = destroy_array_field,
-       [BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD]           = destroy_array_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD]                     = destroy_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD]                   = destroy_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD]       = destroy_option_field,
-       [BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD] = destroy_option_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD]                    = destroy_variant_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD]      = destroy_variant_field,
-       [BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD]        = destroy_variant_field,
-};
-
 struct bt_field_class *bt_field_borrow_class(struct bt_field *field)
 {
        BT_ASSERT_PRE_DEV_NON_NULL(field, "Field");
@@ -275,7 +228,52 @@ struct bt_field *bt_field_create(struct bt_field_class *fc)
        struct bt_field *field = NULL;
 
        BT_ASSERT(fc);
-       field = field_create_funcs[fc->type](fc);
+
+       switch (fc->type) {
+       case BT_FIELD_CLASS_TYPE_BOOL:
+               field = create_bool_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_BIT_ARRAY:
+               field = create_bit_array_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
+       case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
+       case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
+       case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION:
+               field = create_integer_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL:
+       case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL:
+               field = create_real_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_STRING:
+               field = create_string_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_STRUCTURE:
+               field = create_structure_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
+               field = create_static_array_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD:
+       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD:
+               field = create_dynamic_array_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
+               field = create_option_field(fc);
+               break;
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
+               field = create_variant_field(fc);
+               break;
+       default:
+               abort();
+       }
+
        if (!field) {
                BT_LIB_LOGE_APPEND_CAUSE("Cannot create field object from field class: "
                        "%![fc-]+F", fc);
@@ -1325,7 +1323,49 @@ BT_HIDDEN
 void bt_field_destroy(struct bt_field *field)
 {
        BT_ASSERT(field);
-       field_destroy_funcs[field->class->type](field);
+
+       switch (field->class->type) {
+       case BT_FIELD_CLASS_TYPE_BOOL:
+               destroy_bool_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_BIT_ARRAY:
+               destroy_bit_array_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER:
+       case BT_FIELD_CLASS_TYPE_SIGNED_INTEGER:
+       case BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION:
+       case BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION:
+               destroy_integer_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL:
+       case BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL:
+               destroy_real_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_STRING:
+               destroy_string_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_STRUCTURE:
+               destroy_structure_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_STATIC_ARRAY:
+       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD:
+       case BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD:
+               destroy_array_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
+               destroy_option_field(field);
+               break;
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD:
+       case BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD:
+               destroy_variant_field(field);
+               break;
+       default:
+               abort();
+       }
 }
 
 static
index da6460b76bb0244eea77b8484bd26f3b0b2de310..2d620a3aa8e05b694af6ae335c3c0a51d71a6cd7 100755 (executable)
@@ -92,7 +92,7 @@ ok $? "help with unknown plugin name produces no output"
 bt_cli "${stdout}" "${stderr}" help src.ctf.bob
 isnt $? 0 "help with unknown component class name"
 
-grep --silent 'Cannot find component class: plugin-name="ctf", comp-cls-name="bob", comp-cls-type=0' "${stderr}"
+grep --silent 'Cannot find component class: plugin-name="ctf", comp-cls-name="bob", comp-cls-type=1' "${stderr}"
 ok $? "help with unknown component class name produces expected error"
 
 grep --silent 'Description: CTF input and output' "${stdout}"
This page took 0.033936 seconds and 4 git commands to generate.