From 7cdad180da9dfb6378697bbaa17f86e95bc621bb Mon Sep 17 00:00:00 2001 From: Max Wash Date: Mon, 25 May 2026 17:21:27 +0100 Subject: [PATCH] fx: add interface for performing arithmetic operations on values --- fx/include/fx/operable.h | 45 ++++++++++++++++++++++++++++++++++++++++ fx/operable.c | 15 ++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 fx/include/fx/operable.h create mode 100644 fx/operable.c diff --git a/fx/include/fx/operable.h b/fx/include/fx/operable.h new file mode 100644 index 0000000..8dbf1f9 --- /dev/null +++ b/fx/include/fx/operable.h @@ -0,0 +1,45 @@ +#ifndef FX_OPERABLE_H_ +#define FX_OPERABLE_H_ + +#include +#include +#include + +FX_DECLS_BEGIN; + +#define FX_TYPE_OPERABLE (fx_operable_get_type()) + +FX_DECLARE_TYPE(fx_operable); + +FX_TYPE_CLASS_DECLARATION_BEGIN(fx_operable) + fx_status (*op_add)( + const fx_value *left, + const fx_value *right, + fx_value *out); + fx_status (*op_subtract)( + const fx_value *left, + const fx_value *right, + fx_value *out); + fx_status (*op_multiply)( + const fx_value *left, + const fx_value *right, + fx_value *out); + fx_status (*op_divide)( + const fx_value *left, + const fx_value *right, + fx_value *out); + fx_status (*op_increment)(fx_value *value); + fx_status (*op_decrement)(fx_value *value); + fx_status (*op_add_in_place)(fx_value *left, const fx_value *right); + fx_status ( + *op_subtract_in_place)(fx_value *left, const fx_value *right); + fx_status ( + *op_multiply_in_place)(fx_value *left, const fx_value *right); + fx_status (*op_divide_in_place)(fx_value *left, const fx_value *right); +FX_TYPE_CLASS_DECLARATION_END(fx_operable) + +FX_API fx_type_id fx_operable_get_type(void); + +FX_DECLS_END; + +#endif diff --git a/fx/operable.c b/fx/operable.c new file mode 100644 index 0000000..65ac3e6 --- /dev/null +++ b/fx/operable.c @@ -0,0 +1,15 @@ +#include +#include + +FX_TYPE_CLASS_BEGIN(fx_operable) + FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) + FX_INTERFACE_ENTRY(to_string) = NULL; + FX_TYPE_VTABLE_INTERFACE_END(fx_object, FX_TYPE_OBJECT) +FX_TYPE_CLASS_END(fx_operable) + +FX_TYPE_DEFINITION_BEGIN(fx_operable) + FX_TYPE_FLAGS(FX_TYPE_F_ABSTRACT); + FX_TYPE_ID(0x90a346c8, 0x0c34, 0x4189, 0xbc05, 0xf778637d8015); + FX_TYPE_NAME("fx.operable"); + FX_TYPE_CLASS(fx_operable_class); +FX_TYPE_DEFINITION_END(fx_operable)