Implement bt_ctf_field_is_set()
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 17 Nov 2016 22:07:33 +0000 (17:07 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 27 May 2017 18:09:06 +0000 (14:09 -0400)
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
formats/ctf/ir/fields.c
include/babeltrace/ctf-ir/fields-internal.h

index 04fba5cf22492d0d0534668cf325d04edec07740..2df961f4b61e90bf049247717bb267bb0eb5ec00 100644 (file)
@@ -161,6 +161,19 @@ void bt_ctf_field_array_freeze(struct bt_ctf_field *);
 static
 void bt_ctf_field_sequence_freeze(struct bt_ctf_field *);
 
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *);
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *);
+
 static
 int increase_packet_size(struct ctf_stream_pos *pos);
 
@@ -254,6 +267,18 @@ void (* const field_freeze_funcs[])(struct bt_ctf_field *) = {
        [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_freeze,
 };
 
+static
+bool (* const field_is_set_funcs[])(struct bt_ctf_field *) = {
+       [BT_CTF_TYPE_ID_INTEGER] = bt_ctf_field_generic_is_set,
+       [BT_CTF_TYPE_ID_ENUM] = bt_ctf_field_enumeration_is_set,
+       [BT_CTF_TYPE_ID_FLOAT] = bt_ctf_field_generic_is_set,
+       [BT_CTF_TYPE_ID_STRUCT] = bt_ctf_field_structure_is_set,
+       [BT_CTF_TYPE_ID_VARIANT] = bt_ctf_field_variant_is_set,
+       [BT_CTF_TYPE_ID_ARRAY] = bt_ctf_field_array_is_set,
+       [BT_CTF_TYPE_ID_SEQUENCE] = bt_ctf_field_sequence_is_set,
+       [BT_CTF_TYPE_ID_STRING] = bt_ctf_field_generic_is_set,
+};
+
 struct bt_ctf_field *bt_ctf_field_create(struct bt_ctf_field_type *type)
 {
        struct bt_ctf_field *field = NULL;
@@ -1243,6 +1268,27 @@ end:
        return ret;
 }
 
+
+BT_HIDDEN
+bool bt_ctf_field_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       enum bt_ctf_type_id type_id;
+
+       if (!field) {
+               goto end;
+       }
+
+       type_id = bt_ctf_field_type_get_type_id(field->type);
+       if (type_id <= BT_CTF_TYPE_ID_UNKNOWN || type_id >= BT_CTF_NR_TYPE_IDS) {
+               goto end;
+       }
+
+       is_set = field_is_set_funcs[type_id](field);
+end:
+       return is_set;
+}
+
 struct bt_ctf_field *bt_ctf_field_copy(struct bt_ctf_field *field)
 {
        int ret;
@@ -2398,3 +2444,112 @@ void bt_ctf_field_freeze(struct bt_ctf_field *field)
 end:
        return;
 }
+
+static
+bool bt_ctf_field_generic_is_set(struct bt_ctf_field *field)
+{
+       return field && field->payload_set;
+}
+
+static
+bool bt_ctf_field_enumeration_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       struct bt_ctf_field_enumeration *enumeration;
+
+       if (!field) {
+               goto end;
+       }
+
+       enumeration = container_of(field, struct bt_ctf_field_enumeration,
+                       parent);
+       if (!enumeration->payload) {
+               goto end;
+       }
+
+       is_set = bt_ctf_field_is_set(enumeration->payload);
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_structure_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       size_t i;
+       struct bt_ctf_field_structure *structure;
+
+       if (!field) {
+               goto end;
+       }
+
+       structure = container_of(field, struct bt_ctf_field_structure, parent);
+       for (i = 0; i < structure->fields->len; i++) {
+               is_set = bt_ctf_field_is_set(structure->fields->pdata[i]);
+               if (!is_set) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_variant_is_set(struct bt_ctf_field *field)
+{
+       bool is_set = false;
+       struct bt_ctf_field_variant *variant;
+
+       if (!field) {
+               goto end;
+       }
+
+       variant = container_of(field, struct bt_ctf_field_variant, parent);
+       is_set = bt_ctf_field_is_set(variant->payload);
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_array_is_set(struct bt_ctf_field *field)
+{
+       size_t i;
+       bool is_set = false;
+       struct bt_ctf_field_array *array;
+
+       if (!field) {
+               goto end;
+       }
+
+       array = container_of(field, struct bt_ctf_field_array, parent);
+       for (i = 0; i < array->elements->len; i++) {
+               is_set = bt_ctf_field_validate(array->elements->pdata[i]);
+               if (!is_set) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
+
+static
+bool bt_ctf_field_sequence_is_set(struct bt_ctf_field *field)
+{
+       size_t i;
+       bool is_set = false;
+       struct bt_ctf_field_sequence *sequence;
+
+       if (!field) {
+               goto end;
+       }
+
+       sequence = container_of(field, struct bt_ctf_field_sequence, parent);
+       for (i = 0; i < sequence->elements->len; i++) {
+               is_set = bt_ctf_field_validate(sequence->elements->pdata[i]);
+               if (!is_set) {
+                       goto end;
+               }
+       }
+end:
+       return is_set;
+}
index a75120f3da2cde26f64956d46e5bd53a6e7215f3..4794e72d9945f06d4cabc51ae293466a3e8483e9 100644 (file)
@@ -106,4 +106,7 @@ int bt_ctf_field_serialize(struct bt_ctf_field *field,
 BT_HIDDEN
 void bt_ctf_field_freeze(struct bt_ctf_field *field);
 
+BT_HIDDEN
+bool bt_ctf_field_is_set(struct bt_ctf_field *field);
+
 #endif /* BABELTRACE_CTF_IR_FIELDS_INTERNAL_H */
This page took 0.02849 seconds and 4 git commands to generate.