summaryrefslogtreecommitdiff
path: root/rushs/tinyprintf/variant
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /rushs/tinyprintf/variant
add: graphs et rushs
Diffstat (limited to 'rushs/tinyprintf/variant')
-rw-r--r--rushs/tinyprintf/variant/variant.c96
-rw-r--r--rushs/tinyprintf/variant/variant.h35
2 files changed, 131 insertions, 0 deletions
diff --git a/rushs/tinyprintf/variant/variant.c b/rushs/tinyprintf/variant/variant.c
new file mode 100644
index 0000000..eb2f8a8
--- /dev/null
+++ b/rushs/tinyprintf/variant/variant.c
@@ -0,0 +1,96 @@
+#include "variant.h"
+
+#include <stdio.h>
+#include <string.h>
+
+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;
+}
diff --git a/rushs/tinyprintf/variant/variant.h b/rushs/tinyprintf/variant/variant.h
new file mode 100644
index 0000000..9983bc1
--- /dev/null
+++ b/rushs/tinyprintf/variant/variant.h
@@ -0,0 +1,35 @@
+#ifndef VARIANT_H
+#define VARIANT_H
+
+#include <stdbool.h>
+#include <stddef.h>
+
+enum type
+{
+ TYPE_INT,
+ TYPE_FLOAT,
+ TYPE_CHAR,
+ TYPE_STRING
+};
+
+union type_any
+{
+ int int_v;
+ float float_v;
+ char char_v;
+ const char *str_v;
+};
+
+struct variant
+{
+ enum type type;
+ union type_any value;
+};
+
+void variant_display(const struct variant *e);
+bool variant_equal(const struct variant *left, const struct variant *right);
+int variant_find(const struct variant *array, size_t len, enum type type,
+ union type_any value);
+float variant_sum(const struct variant *array, size_t len);
+
+#endif /* !VARIANT_H */