#include "variant.h" #include #include void variant_display(const struct variant *e) { switch (e->type) { case (TYPE_INT): printf("%d\n", e->value.int_v); break; case (TYPE_FLOAT): printf("%f\n", e->value.float_v); break; case (TYPE_CHAR): printf("%c\n", e->value.char_v); break; default: printf("%s\n", e->value.str_v); break; } } bool variant_equal(const struct variant *left, const struct variant *right) { if (left == NULL || right == NULL) { return true; } switch (left->type) { case (TYPE_INT): if (right->type != TYPE_INT) { return false; } return left->value.int_v == right->value.int_v; case (TYPE_FLOAT): if (right->type != TYPE_FLOAT) { return false; } return left->value.float_v == right->value.float_v; case (TYPE_CHAR): if (right->type != TYPE_CHAR) { return false; } return left->value.char_v == right->value.char_v; default: if (right->type != TYPE_STRING) { return false; } return strcmp(left->value.str_v, right->value.str_v) == 0; } } int variant_find(const struct variant *array, size_t len, enum type type, union type_any value) { size_t i; struct variant cmp = { type, value }; for (i = 0; i < len && variant_equal(array + i, &cmp) == false; i++) { continue; } if (i == len) { return -1; } return i; } float variant_sum(const struct variant *array, size_t len) { if (array == NULL) { return 0; } float sum = 0; for (size_t i = 0; i < len; i++) { if (array[i].type == TYPE_FLOAT) { sum += array[i].value.float_v; } else if (array[i].type == TYPE_INT) { sum += array[i].value.int_v; } } return sum; }