fx: implement value conversion interface
This commit is contained in:
+88
-1
@@ -1,5 +1,9 @@
|
||||
#include "convert.h"
|
||||
|
||||
#include <fx/convertible.h>
|
||||
#include <fx/int.h>
|
||||
#include <fx/value-type.h>
|
||||
#include <fx/value.h>
|
||||
|
||||
/* clang-format off */
|
||||
#define SWAP64(v) \
|
||||
@@ -45,17 +49,100 @@ u64 fx_u64_stoh(u64 v)
|
||||
#endif
|
||||
}
|
||||
|
||||
HASH(u64)
|
||||
TO_STRING(u64, "%" PRIu64)
|
||||
|
||||
BOOL_CONVERT(u64)
|
||||
GENERIC_CONVERT(u64, i16, i16)
|
||||
GENERIC_CONVERT(u64, u16, u16)
|
||||
GENERIC_CONVERT(u64, i32, i32)
|
||||
GENERIC_CONVERT(u64, u32, u32)
|
||||
GENERIC_CONVERT(u64, i64, i64)
|
||||
GENERIC_CONVERT(u64, iptr, iptr)
|
||||
GENERIC_CONVERT(u64, uptr, uptr)
|
||||
GENERIC_CONVERT(u64, sbyte, sbyte)
|
||||
GENERIC_CONVERT(u64, byte, byte)
|
||||
GENERIC_CONVERT(u64, short, short)
|
||||
GENERIC_CONVERT(u64, ushort, unsigned short)
|
||||
GENERIC_CONVERT(u64, int, int)
|
||||
GENERIC_CONVERT(u64, uint, unsigned int)
|
||||
GENERIC_CONVERT(u64, long, long)
|
||||
GENERIC_CONVERT(u64, ulong, unsigned long)
|
||||
GENERIC_CONVERT(u64, longlong, long long)
|
||||
GENERIC_CONVERT(u64, ulonglong, unsigned long long)
|
||||
GENERIC_CONVERT(u64, size, size_t)
|
||||
GENERIC_CONVERT(u64, float, float)
|
||||
GENERIC_CONVERT(u64, double, double)
|
||||
|
||||
BINARY_OP(add, +, u64)
|
||||
BINARY_OP(subtract, -, u64)
|
||||
BINARY_OP(multiply, *, u64)
|
||||
BINARY_OP(divide, /, u64)
|
||||
PREFIX_OP(increment, ++, u64)
|
||||
PREFIX_OP(decrement, --, u64)
|
||||
IN_PLACE_OP(add_in_place, +=, u64)
|
||||
IN_PLACE_OP(subtract_in_place, -=, u64)
|
||||
IN_PLACE_OP(multiply_in_place, *=, u64)
|
||||
IN_PLACE_OP(divide_in_place, /=, u64)
|
||||
|
||||
COMPARE(u64, u64)
|
||||
|
||||
/*** CLASS DEFINITION *********************************************************/
|
||||
|
||||
FX_TYPE_CLASS_BEGIN(fx_u64)
|
||||
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT)
|
||||
FX_INTERFACE_ENTRY(to_string) = NULL;
|
||||
FX_INTERFACE_ENTRY(to_string) = to_string;
|
||||
FX_INTERFACE_ENTRY(hash) = hash;
|
||||
FX_TYPE_VTABLE_INTERFACE_END(fx_object, FX_TYPE_OBJECT)
|
||||
|
||||
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_comparable, FX_TYPE_COMPARABLE)
|
||||
FX_INTERFACE_ENTRY(c_compare) = compare;
|
||||
FX_TYPE_VTABLE_INTERFACE_END(fx_comparable, FX_TYPE_COMPARABLE)
|
||||
|
||||
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_operable, FX_TYPE_OPERABLE)
|
||||
FX_INTERFACE_ENTRY(op_add) = add;
|
||||
FX_INTERFACE_ENTRY(op_subtract) = subtract;
|
||||
FX_INTERFACE_ENTRY(op_multiply) = multiply;
|
||||
FX_INTERFACE_ENTRY(op_divide) = divide;
|
||||
FX_INTERFACE_ENTRY(op_increment) = increment;
|
||||
FX_INTERFACE_ENTRY(op_decrement) = decrement;
|
||||
FX_INTERFACE_ENTRY(op_add_in_place) = add_in_place;
|
||||
FX_INTERFACE_ENTRY(op_subtract_in_place) = subtract_in_place;
|
||||
FX_INTERFACE_ENTRY(op_multiply_in_place) = multiply_in_place;
|
||||
FX_INTERFACE_ENTRY(op_divide_in_place) = divide_in_place;
|
||||
FX_TYPE_VTABLE_INTERFACE_END(fx_operable, FX_TYPE_OPERABLE)
|
||||
|
||||
FX_TYPE_VTABLE_INTERFACE_BEGIN(fx_convertible, FX_TYPE_CONVERTIBLE)
|
||||
FX_INTERFACE_ENTRY(c_to_bool) = to_bool;
|
||||
FX_INTERFACE_ENTRY(c_to_i16) = to_i16;
|
||||
FX_INTERFACE_ENTRY(c_to_u16) = to_u16;
|
||||
FX_INTERFACE_ENTRY(c_to_i32) = to_i32;
|
||||
FX_INTERFACE_ENTRY(c_to_u32) = to_u32;
|
||||
FX_INTERFACE_ENTRY(c_to_i64) = to_i64;
|
||||
FX_INTERFACE_ENTRY(c_to_iptr) = to_iptr;
|
||||
FX_INTERFACE_ENTRY(c_to_uptr) = to_uptr;
|
||||
FX_INTERFACE_ENTRY(c_to_sbyte) = to_sbyte;
|
||||
FX_INTERFACE_ENTRY(c_to_byte) = to_byte;
|
||||
FX_INTERFACE_ENTRY(c_to_short) = to_short;
|
||||
FX_INTERFACE_ENTRY(c_to_ushort) = to_ushort;
|
||||
FX_INTERFACE_ENTRY(c_to_int) = to_int;
|
||||
FX_INTERFACE_ENTRY(c_to_uint) = to_uint;
|
||||
FX_INTERFACE_ENTRY(c_to_long) = to_long;
|
||||
FX_INTERFACE_ENTRY(c_to_ulong) = to_ulong;
|
||||
FX_INTERFACE_ENTRY(c_to_longlong) = to_longlong;
|
||||
FX_INTERFACE_ENTRY(c_to_ulonglong) = to_ulonglong;
|
||||
FX_INTERFACE_ENTRY(c_to_size) = to_size;
|
||||
FX_INTERFACE_ENTRY(c_to_float) = to_float;
|
||||
FX_INTERFACE_ENTRY(c_to_double) = to_double;
|
||||
FX_TYPE_VTABLE_INTERFACE_END(fx_convertible, FX_TYPE_CONVERTIBLE)
|
||||
FX_TYPE_CLASS_END(fx_u64)
|
||||
|
||||
FX_TYPE_DEFINITION_BEGIN(fx_u64)
|
||||
__FX_VALUE_TYPE_ID(U64);
|
||||
FX_TYPE_EXTENDS(FX_TYPE_VALUE_TYPE);
|
||||
FX_TYPE_IMPLEMENTS(FX_TYPE_CONVERTIBLE);
|
||||
FX_TYPE_IMPLEMENTS(FX_TYPE_OPERABLE);
|
||||
FX_TYPE_IMPLEMENTS(FX_TYPE_COMPARABLE);
|
||||
FX_TYPE_NAME("fx.u64");
|
||||
FX_TYPE_CLASS(fx_u64_class);
|
||||
FX_TYPE_INSTANCE_PRIVATE(u64);
|
||||
|
||||
Reference in New Issue
Block a user