diff --git a/fx/bool.c b/fx/bool.c new file mode 100644 index 0000000..5152b06 --- /dev/null +++ b/fx/bool.c @@ -0,0 +1,84 @@ +#include +#include + +/*** PRIVATE DATA *************************************************************/ + +struct fx_bool_p { + bool b_value; +}; + +/*** PRIVATE FUNCTIONS ********************************************************/ + +static void bool_set_value(struct fx_bool_p *i, bool v) +{ + i->b_value = v; +} + +static bool bool_get_value(struct fx_bool_p *i) +{ + return i->b_value; +} + +/*** PUBLIC FUNCTIONS *********************************************************/ + +fx_bool *fx_bool_create(bool value) +{ + fx_bool *i = fx_object_create(FX_TYPE_BOOL); + if (!i) { + return NULL; + } + + struct fx_bool_p *p = fx_object_get_private(i, FX_TYPE_BOOL); + p->b_value = value; + + return i; +} + +void fx_bool_set_value(fx_bool *i, bool v) +{ + FX_CLASS_DISPATCH_STATIC_V(FX_TYPE_BOOL, bool_set_value, i, v); +} + +bool fx_bool_get_value(const fx_bool *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_BOOL, bool_get_value, i); +} + +/*** VIRTUAL FUNCTIONS ********************************************************/ + +static void bool_init(fx_object *obj, void *priv) +{ + struct fx_bool_p *i = priv; + + i->b_value = false; +} + +static void bool_fini(fx_object *obj, void *priv) +{ +} + +static void bool_to_string(const fx_object *obj, fx_stream *out) +{ + struct fx_bool_p *i = fx_object_get_private(obj, FX_TYPE_BOOL); + if (i->b_value == false) { + fx_stream_write_cstr(out, "false", NULL); + } else { + fx_stream_write_cstr(out, "true", NULL); + } +} + +/*** CLASS DEFINITION *********************************************************/ + +FX_TYPE_CLASS_DEFINITION_BEGIN(fx_bool) + FX_TYPE_CLASS_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) + FX_INTERFACE_ENTRY(to_string) = bool_to_string; + FX_TYPE_CLASS_INTERFACE_END(fx_object, FX_TYPE_OBJECT) +FX_TYPE_CLASS_DEFINITION_END(fx_bool) + +FX_TYPE_DEFINITION_BEGIN(fx_bool) + FX_TYPE_ID(0x9c8453bf, 0xfc92, 0x4b0a, 0xbcaf, 0xd0c6cdba9310); + FX_TYPE_CLASS(fx_bool_class); + FX_TYPE_INSTANCE_PRIVATE(struct fx_bool_p); + FX_TYPE_INSTANCE_INIT(bool_init); + FX_TYPE_INSTANCE_FINI(bool_fini); +FX_TYPE_DEFINITION_END(fx_bool) diff --git a/fx/double.c b/fx/double.c new file mode 100644 index 0000000..88b2b32 --- /dev/null +++ b/fx/double.c @@ -0,0 +1,280 @@ +#include +#include +#include +#include + +/*** PRIVATE DATA *************************************************************/ + +enum double_type { + DOUBLE_REGULAR = 0, + DOUBLE_INF_POSITIVE, + DOUBLE_INF_NEGATIVE, + DOUBLE_NAN_POSITIVE, + DOUBLE_NAN_NEGATIVE, +}; + +struct fx_double_p { + enum double_type i_type; + double i_value; +}; + +/*** PRIVATE FUNCTIONS ********************************************************/ + +static bool double_get_value(const struct fx_double_p *i) +{ + return i->i_value; +} + +static void double_set_value(struct fx_double_p *i, double v) +{ + i->i_type = DOUBLE_REGULAR; + i->i_value = v; +} + +static void double_set_value_nan(struct fx_double_p *i) +{ + i->i_type = DOUBLE_NAN_POSITIVE; + i->i_value = 0; +} + +static void double_set_value_nan_negative(struct fx_double_p *i) +{ + i->i_type = DOUBLE_NAN_NEGATIVE; + i->i_value = 0; +} + +static void double_set_value_inf(struct fx_double_p *i) +{ + i->i_type = DOUBLE_INF_POSITIVE; + i->i_value = 0; +} + +static void double_set_value_inf_negative(struct fx_double_p *i) +{ + i->i_type = DOUBLE_INF_NEGATIVE; + i->i_value = 0; +} + +static bool double_is_nan(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_NAN_POSITIVE + || i->i_type == DOUBLE_NAN_NEGATIVE; +} + +static bool double_is_nan_positive(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_NAN_POSITIVE; +} + +static bool double_is_nan_negative(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_NAN_NEGATIVE; +} + +static bool double_is_inf(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_INF_POSITIVE + || i->i_type == DOUBLE_INF_NEGATIVE; +} + +static bool double_is_inf_positive(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_INF_POSITIVE; +} + +static bool double_is_inf_negative(struct fx_double_p *i) +{ + return i->i_type == DOUBLE_INF_NEGATIVE; +} + +/*** PUBLIC FUNCTIONS *********************************************************/ + +fx_double *fx_double_create(double value) +{ + fx_double *i = fx_object_create(FX_TYPE_DOUBLE); + if (!i) { + return NULL; + } + + struct fx_double_p *p = fx_object_get_private(i, FX_TYPE_DOUBLE); + p->i_type = DOUBLE_REGULAR; + p->i_value = value; + + return i; +} + +fx_double *fx_double_create_nan(void) +{ + fx_double *i = fx_object_create(FX_TYPE_DOUBLE); + if (!i) { + return NULL; + } + + struct fx_double_p *p = fx_object_get_private(i, FX_TYPE_DOUBLE); + p->i_type = DOUBLE_NAN_POSITIVE; + p->i_value = 0; + + return i; +} + +fx_double *fx_double_create_nan_negative(void) +{ + fx_double *i = fx_object_create(FX_TYPE_DOUBLE); + if (!i) { + return NULL; + } + + struct fx_double_p *p = fx_object_get_private(i, FX_TYPE_DOUBLE); + p->i_type = DOUBLE_NAN_NEGATIVE; + p->i_value = 0; + + return i; +} + +fx_double *fx_double_create_inf(void) +{ + fx_double *i = fx_object_create(FX_TYPE_DOUBLE); + if (!i) { + return NULL; + } + + struct fx_double_p *p = fx_object_get_private(i, FX_TYPE_DOUBLE); + p->i_type = DOUBLE_INF_POSITIVE; + p->i_value = 0; + + return i; +} + +fx_double *fx_double_create_inf_negative(void) +{ + fx_double *i = fx_object_create(FX_TYPE_DOUBLE); + if (!i) { + return NULL; + } + + struct fx_double_p *p = fx_object_get_private(i, FX_TYPE_DOUBLE); + p->i_type = DOUBLE_INF_NEGATIVE; + p->i_value = 0; + + return i; +} + +double fx_double_get_value(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_get_value, i); +} + +void fx_double_set_value(fx_double *i, double v) +{ + FX_CLASS_DISPATCH_STATIC_V(FX_TYPE_DOUBLE, double_set_value, i, v); +} + +void fx_double_set_value_nan(fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_DOUBLE, double_set_value_nan, i); +} + +void fx_double_set_value_nan_negative(fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_V0( + FX_TYPE_DOUBLE, + double_set_value_nan_negative, + i); +} + +void fx_double_set_value_inf(fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_DOUBLE, double_set_value_inf, i); +} + +void fx_double_set_value_inf_negative(fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_V0( + FX_TYPE_DOUBLE, + double_set_value_inf_negative, + i); +} + +bool fx_double_is_nan(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_nan, i); +} + +bool fx_double_is_nan_positive(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_nan_positive, i); +} + +bool fx_double_is_nan_negative(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_nan_negative, i); +} + +bool fx_double_is_inf(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_inf, i); +} + +bool fx_double_is_inf_positive(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_inf_positive, i); +} + +bool fx_double_is_inf_negative(const fx_double *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_DOUBLE, double_is_inf_negative, i); +} + +/*** VIRTUAL FUNCTIONS ********************************************************/ + +static void double_init(fx_object *obj, void *priv) +{ + struct fx_double_p *i = priv; + + i->i_type = DOUBLE_REGULAR; + i->i_value = 0; +} + +static void double_fini(fx_object *obj, void *priv) +{ +} + +static void double_to_string(const fx_object *obj, fx_stream *out) +{ + struct fx_double_p *i = fx_object_get_private(obj, FX_TYPE_DOUBLE); + switch (i->i_type) { + case DOUBLE_REGULAR: + fx_stream_write_fmt(out, NULL, "%" PRIdPTR, i->i_value); + break; + case DOUBLE_INF_POSITIVE: + fx_stream_write_cstr(out, "inf", NULL); + break; + case DOUBLE_INF_NEGATIVE: + fx_stream_write_cstr(out, "-inf", NULL); + break; + case DOUBLE_NAN_POSITIVE: + fx_stream_write_cstr(out, "NaN", NULL); + break; + case DOUBLE_NAN_NEGATIVE: + fx_stream_write_cstr(out, "-NaN", NULL); + break; + default: + break; + } +} + +/*** CLASS DEFINITION *********************************************************/ + +FX_TYPE_CLASS_DEFINITION_BEGIN(fx_double) + FX_TYPE_CLASS_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) + FX_INTERFACE_ENTRY(to_string) = double_to_string; + FX_TYPE_CLASS_INTERFACE_END(fx_object, FX_TYPE_OBJECT) +FX_TYPE_CLASS_DEFINITION_END(fx_double) + +FX_TYPE_DEFINITION_BEGIN(fx_double) + FX_TYPE_ID(0x3b20f57a, 0x2ddf, 0x4682, 0x81c4, 0x4fe404a6524e); + FX_TYPE_CLASS(fx_double_class); + FX_TYPE_INSTANCE_PRIVATE(struct fx_double_p); + FX_TYPE_INSTANCE_INIT(double_init); + FX_TYPE_INSTANCE_FINI(double_fini); +FX_TYPE_DEFINITION_END(fx_double) diff --git a/fx/include/fx/bool.h b/fx/include/fx/bool.h new file mode 100644 index 0000000..e66fdb3 --- /dev/null +++ b/fx/include/fx/bool.h @@ -0,0 +1,25 @@ +#ifndef FX_BOOL_H_ +#define FX_BOOL_H_ + +#include + +FX_DECLS_BEGIN; + +#define FX_TYPE_BOOL (fx_bool_get_type()) + +FX_DECLARE_TYPE(fx_bool); + +FX_TYPE_CLASS_DECLARATION_BEGIN(fx_bool) +FX_TYPE_CLASS_DECLARATION_END(fx_bool) + +FX_API fx_type fx_bool_get_type(void); + +FX_API fx_bool *fx_bool_create(bool value); + +FX_API void fx_bool_set_value(fx_bool *i, bool v); + +FX_API bool fx_bool_get_value(const fx_bool *i); + +FX_DECLS_END; + +#endif diff --git a/fx/include/fx/double.h b/fx/include/fx/double.h new file mode 100644 index 0000000..92b2ac9 --- /dev/null +++ b/fx/include/fx/double.h @@ -0,0 +1,40 @@ +#ifndef FX_DOUBLE_H_ +#define FX_DOUBLE_H_ + +#include + +FX_DECLS_BEGIN; + +#define FX_TYPE_DOUBLE (fx_double_get_type()) + +FX_DECLARE_TYPE(fx_double); + +FX_TYPE_CLASS_DECLARATION_BEGIN(fx_double) +FX_TYPE_CLASS_DECLARATION_END(fx_double) + +FX_API fx_type fx_double_get_type(void); + +FX_API fx_double *fx_double_create(double value); +FX_API fx_double *fx_double_create_nan(void); +FX_API fx_double *fx_double_create_nan_negative(void); +FX_API fx_double *fx_double_create_inf(void); +FX_API fx_double *fx_double_create_inf_negative(void); + +FX_API void fx_double_set_value(fx_double *i, double v); +FX_API void fx_double_set_value_nan(fx_double *i); +FX_API void fx_double_set_value_nan_negative(fx_double *i); +FX_API void fx_double_set_value_inf(fx_double *i); +FX_API void fx_double_set_value_inf_negative(fx_double *i); + +FX_API bool fx_double_is_nan(const fx_double *i); +FX_API bool fx_double_is_nan_positive(const fx_double *i); +FX_API bool fx_double_is_nan_negative(const fx_double *i); +FX_API bool fx_double_is_inf(const fx_double *i); +FX_API bool fx_double_is_inf_positive(const fx_double *i); +FX_API bool fx_double_is_inf_negative(const fx_double *i); + +FX_API double fx_double_get_value(const fx_double *i); + +FX_DECLS_END; + +#endif diff --git a/fx/include/fx/int.h b/fx/include/fx/int.h new file mode 100644 index 0000000..54b8ac0 --- /dev/null +++ b/fx/include/fx/int.h @@ -0,0 +1,40 @@ +#ifndef FX_INT_H_ +#define FX_INT_H_ + +#include + +FX_DECLS_BEGIN; + +#define FX_TYPE_INT (fx_int_get_type()) + +FX_DECLARE_TYPE(fx_int); + +FX_TYPE_CLASS_DECLARATION_BEGIN(fx_int) +FX_TYPE_CLASS_DECLARATION_END(fx_int) + +FX_API fx_type fx_int_get_type(void); + +FX_API fx_int *fx_int_create(intptr_t value); +FX_API fx_int *fx_int_create_nan(void); +FX_API fx_int *fx_int_create_nan_negative(void); +FX_API fx_int *fx_int_create_inf(void); +FX_API fx_int *fx_int_create_inf_negative(void); + +FX_API void fx_int_set_value(fx_int *i, intptr_t v); +FX_API void fx_int_set_value_nan(fx_int *i); +FX_API void fx_int_set_value_nan_negative(fx_int *i); +FX_API void fx_int_set_value_inf(fx_int *i); +FX_API void fx_int_set_value_inf_negative(fx_int *i); + +FX_API bool fx_int_is_nan(const fx_int *i); +FX_API bool fx_int_is_nan_positive(const fx_int *i); +FX_API bool fx_int_is_nan_negative(const fx_int *i); +FX_API bool fx_int_is_inf(const fx_int *i); +FX_API bool fx_int_is_inf_positive(const fx_int *i); +FX_API bool fx_int_is_inf_negative(const fx_int *i); + +FX_API intptr_t fx_int_get_value(const fx_int *i); + +FX_DECLS_END; + +#endif diff --git a/fx/include/fx/number.h b/fx/include/fx/number.h deleted file mode 100644 index 0c20bc3..0000000 --- a/fx/include/fx/number.h +++ /dev/null @@ -1,256 +0,0 @@ -#ifndef FX_DS_NUMBER_H -#define FX_DS_NUMBER_H - -#include -#include - -FX_DECLS_BEGIN; - -#define FX_INT8(v) (fx_number_create_int8(v)) -#define FX_INT16(v) (fx_number_create_int16(v)) -#define FX_INT32(v) (fx_number_create_int32(v)) -#define FX_INT64(v) (fx_number_create_int64(v)) -#define FX_FLOAT32(v) (fx_number_create_float32(v)) -#define FX_FLOAT64(v) (fx_number_create_float64(v)) -#define FX_CHAR(v) (fx_number_create_char(v)) -#define FX_SHORT(v) (fx_number_create_short(v)) -#define FX_INT(v) (fx_number_create_int(v)) -#define FX_LONG(v) (fx_number_create_long(v)) -#define FX_LONGLONG(v) (fx_number_create_longlong(v)) -#define FX_FLOAT(v) (fx_number_create_float(v)) -#define FX_DOUBLE(v) (fx_number_create_double(v)) -#define FX_SIZE_T(v) (fx_number_create_size_t(v)) - -#define FX_RV_INT8(v) FX_RV(fx_number_create_int8(v)) -#define FX_RV_INT16(v) FX_RV(fx_number_create_int16(v)) -#define FX_RV_INT32(v) FX_RV(fx_number_create_int32(v)) -#define FX_RV_INT64(v) FX_RV(fx_number_create_int64(v)) -#define FX_RV_FLOAT32(v) FX_RV(fx_number_create_float32(v)) -#define FX_RV_FLOAT64(v) FX_RV(fx_number_create_float64(v)) -#define FX_RV_CHAR(v) FX_RV(fx_number_create_char(v)) -#define FX_RV_SHORT(v) FX_RV(fx_number_create_short(v)) -#define FX_RV_INT(v) FX_RV(fx_number_create_int(v)) -#define FX_RV_LONG(v) FX_RV(fx_number_create_long(v)) -#define FX_RV_LONGLONG(v) FX_RV(fx_number_create_longlong(v)) -#define FX_RV_FLOAT(v) FX_RV(fx_number_create_float(v)) -#define FX_RV_DOUBLE(v) FX_RV(fx_number_create_double(v)) -#define FX_RV_SIZE_T(v) FX_RV(fx_number_create_size_t(v)) - -#define FX_NUMBER_IVAL(p) (fx_number_get_size_t(p)) -#define FX_NUMBER_FVAL(p) (fx_number_get_double(p)) - -#define FX_TYPE_NUMBER (fx_number_get_type()) - -FX_DECLARE_TYPE(fx_number); - -FX_TYPE_CLASS_DECLARATION_BEGIN(fx_number) -FX_TYPE_CLASS_DECLARATION_END(fx_number) - -typedef enum fx_number_type { - FX_NUMBER_INT8, - FX_NUMBER_INT16, - FX_NUMBER_INT32, - FX_NUMBER_INT64, - FX_NUMBER_FLOAT32, - FX_NUMBER_FLOAT64, - FX_NUMBER_CHAR, - FX_NUMBER_SHORT, - FX_NUMBER_INT, - FX_NUMBER_LONG, - FX_NUMBER_LONGLONG, - FX_NUMBER_FLOAT, - FX_NUMBER_DOUBLE, - FX_NUMBER_SIZE_T, - FX_NUMBER_HANDLE, - FX_NUMBER_TYPE_COUNT, - - FX_NUMBER_BYTE = FX_NUMBER_INT8, - FX_NUMBER_WORD = FX_NUMBER_INT16, - FX_NUMBER_DWORD = FX_NUMBER_INT32, - FX_NUMBER_QWORD = FX_NUMBER_INT64, -} fx_number_type; - -FX_API fx_type fx_number_get_type(void); - -FX_API fx_number *fx_number_create(fx_number_type type, void *value_ptr); - -static inline fx_number *fx_number_create_int8(int8_t value) -{ - return fx_number_create(FX_NUMBER_INT8, &value); -} -static inline fx_number *fx_number_create_int16(int16_t value) -{ - return fx_number_create(FX_NUMBER_INT16, &value); -} -static inline fx_number *fx_number_create_int32(int32_t value) -{ - return fx_number_create(FX_NUMBER_INT32, &value); -} -static inline fx_number *fx_number_create_int64(int64_t value) -{ - return fx_number_create(FX_NUMBER_INT64, &value); -} -static inline fx_number *fx_number_create_float32(float value) -{ - return fx_number_create(FX_NUMBER_FLOAT32, &value); -} -static inline fx_number *fx_number_create_float64(double value) -{ - return fx_number_create(FX_NUMBER_FLOAT64, &value); -} -static inline fx_number *fx_number_create_char(char value) -{ - return fx_number_create(FX_NUMBER_CHAR, &value); -} -static inline fx_number *fx_number_create_short(short value) -{ - return fx_number_create(FX_NUMBER_SHORT, &value); -} -static inline fx_number *fx_number_create_int(int value) -{ - return fx_number_create(FX_NUMBER_INT, &value); -} -static inline fx_number *fx_number_create_long(long value) -{ - return fx_number_create(FX_NUMBER_LONG, &value); -} -static inline fx_number *fx_number_create_longlong(long long value) -{ - return fx_number_create(FX_NUMBER_LONGLONG, &value); -} -static inline fx_number *fx_number_create_float(float value) -{ - return fx_number_create(FX_NUMBER_FLOAT, &value); -} -static inline fx_number *fx_number_create_double(double value) -{ - return fx_number_create(FX_NUMBER_DOUBLE, &value); -} -static inline fx_number *fx_number_create_size_t(size_t value) -{ - return fx_number_create(FX_NUMBER_SIZE_T, &value); -} - -FX_API fx_number_type fx_number_get_number_type(const fx_number *number); -FX_API int fx_number_get_value( - const fx_number *number, - fx_number_type type, - void *value_ptr); - -static inline int8_t fx_number_get_int8(const fx_number *number) -{ - int8_t v; - fx_number_get_value(number, FX_NUMBER_INT8, &v); - return v; -} - -static inline int16_t fx_number_get_int16(const fx_number *number) -{ - int16_t v; - fx_number_get_value(number, FX_NUMBER_INT16, &v); - return v; -} - -static inline int32_t fx_number_get_int32(const fx_number *number) -{ - int32_t v; - fx_number_get_value(number, FX_NUMBER_INT32, &v); - return v; -} - -static inline int64_t fx_number_get_int64(const fx_number *number) -{ - int64_t v; - fx_number_get_value(number, FX_NUMBER_INT64, &v); - return v; -} - -static inline float fx_number_get_float32(const fx_number *number) -{ - float v; - fx_number_get_value(number, FX_NUMBER_FLOAT32, &v); - return v; -} - -static inline double fx_number_get_float64(const fx_number *number) -{ - double v; - fx_number_get_value(number, FX_NUMBER_FLOAT64, &v); - return v; -} - -static inline char fx_number_get_char(const fx_number *number) -{ - char v; - fx_number_get_value(number, FX_NUMBER_CHAR, &v); - return v; -} - -static inline short fx_number_get_short(const fx_number *number) -{ - short v; - fx_number_get_value(number, FX_NUMBER_SHORT, &v); - return v; -} - -static inline int fx_number_get_int(const fx_number *number) -{ - int v; - fx_number_get_value(number, FX_NUMBER_INT, &v); - return v; -} - -static inline long fx_number_get_long(const fx_number *number) -{ - long v; - fx_number_get_value(number, FX_NUMBER_LONG, &v); - return v; -} - -static inline long long fx_number_get_longlong(const fx_number *number) -{ - long long v; - fx_number_get_value(number, FX_NUMBER_LONGLONG, &v); - return v; -} - -static inline float fx_number_get_float(const fx_number *number) -{ - float v; - fx_number_get_value(number, FX_NUMBER_FLOAT, &v); - return v; -} - -static inline double fx_number_get_double(const fx_number *number) -{ - double v; - fx_number_get_value(number, FX_NUMBER_DOUBLE, &v); - return v; -} - -static inline size_t fx_number_get_size_t(const fx_number *number) -{ - size_t v; - fx_number_get_value(number, FX_NUMBER_SIZE_T, &v); - return v; -} - -FX_API bool fx_number_is_integer(const fx_number *number); -FX_API bool fx_number_is_float(const fx_number *number); -FX_API bool fx_number_is_inf(const fx_number *number); -FX_API bool fx_number_is_inf_positive(const fx_number *number); -FX_API bool fx_number_is_inf_negative(const fx_number *number); -FX_API bool fx_number_is_nan(const fx_number *number); -FX_API bool fx_number_is_nan_positive(const fx_number *number); -FX_API bool fx_number_is_nan_negative(const fx_number *number); - -FX_API void fx_number_set_inf_positive(fx_number *number, bool v); -FX_API void fx_number_set_inf_negative(fx_number *number, bool v); -FX_API void fx_number_set_nan_positive(fx_number *number, bool v); -FX_API void fx_number_set_nan_negative(fx_number *number, bool v); - -FX_API size_t fx_number_data_size(const fx_number *number); - -FX_DECLS_END; - -#endif diff --git a/fx/include/fx/uint.h b/fx/include/fx/uint.h new file mode 100644 index 0000000..fb360cb --- /dev/null +++ b/fx/include/fx/uint.h @@ -0,0 +1,32 @@ +#ifndef FX_UINT_H_ +#define FX_UINT_H_ + +#include + +FX_DECLS_BEGIN; + +#define FX_TYPE_UINT (fx_uint_get_type()) + +FX_DECLARE_TYPE(fx_uint); + +FX_TYPE_CLASS_DECLARATION_BEGIN(fx_uint) +FX_TYPE_CLASS_DECLARATION_END(fx_uint) + +FX_API fx_type fx_uint_get_type(void); + +FX_API fx_uint *fx_uint_create(uintptr_t value); +FX_API fx_uint *fx_uint_create_nan(void); +FX_API fx_uint *fx_uint_create_inf(void); + +FX_API void fx_uint_set_value(fx_uint *i, uintptr_t v); +FX_API void fx_uint_set_value_nan(fx_uint *i); +FX_API void fx_uint_set_value_inf(fx_uint *i); + +FX_API bool fx_uint_is_nan(const fx_uint *i); +FX_API bool fx_uint_is_inf(const fx_uint *i); + +FX_API uintptr_t fx_uint_get_value(const fx_uint *i); + +FX_DECLS_END; + +#endif diff --git a/fx/int.c b/fx/int.c new file mode 100644 index 0000000..df38e5e --- /dev/null +++ b/fx/int.c @@ -0,0 +1,272 @@ +#include +#include +#include +#include + +/*** PRIVATE DATA *************************************************************/ + +enum int_type { + INT_REGULAR = 0, + INT_INF_POSITIVE, + INT_INF_NEGATIVE, + INT_NAN_POSITIVE, + INT_NAN_NEGATIVE, +}; + +struct fx_int_p { + enum int_type i_type; + intptr_t i_value; +}; + +/*** PRIVATE FUNCTIONS ********************************************************/ + +static bool int_get_value(const struct fx_int_p *i) +{ + return i->i_value; +} + +static void int_set_value(struct fx_int_p *i, intptr_t v) +{ + i->i_type = INT_REGULAR; + i->i_value = v; +} + +static void int_set_value_nan(struct fx_int_p *i) +{ + i->i_type = INT_NAN_POSITIVE; + i->i_value = 0; +} + +static void int_set_value_nan_negative(struct fx_int_p *i) +{ + i->i_type = INT_NAN_NEGATIVE; + i->i_value = 0; +} + +static void int_set_value_inf(struct fx_int_p *i) +{ + i->i_type = INT_INF_POSITIVE; + i->i_value = 0; +} + +static void int_set_value_inf_negative(struct fx_int_p *i) +{ + i->i_type = INT_INF_NEGATIVE; + i->i_value = 0; +} + +static bool int_is_nan(struct fx_int_p *i) +{ + return i->i_type == INT_NAN_POSITIVE || i->i_type == INT_NAN_NEGATIVE; +} + +static bool int_is_nan_positive(struct fx_int_p *i) +{ + return i->i_type == INT_NAN_POSITIVE; +} + +static bool int_is_nan_negative(struct fx_int_p *i) +{ + return i->i_type == INT_NAN_NEGATIVE; +} + +static bool int_is_inf(struct fx_int_p *i) +{ + return i->i_type == INT_INF_POSITIVE || i->i_type == INT_INF_NEGATIVE; +} + +static bool int_is_inf_positive(struct fx_int_p *i) +{ + return i->i_type == INT_INF_POSITIVE; +} + +static bool int_is_inf_negative(struct fx_int_p *i) +{ + return i->i_type == INT_INF_NEGATIVE; +} + +/*** PUBLIC FUNCTIONS *********************************************************/ + +fx_int *fx_int_create(intptr_t value) +{ + fx_int *i = fx_object_create(FX_TYPE_INT); + if (!i) { + return NULL; + } + + struct fx_int_p *p = fx_object_get_private(i, FX_TYPE_INT); + p->i_type = INT_REGULAR; + p->i_value = value; + + return i; +} + +fx_int *fx_int_create_nan(void) +{ + fx_int *i = fx_object_create(FX_TYPE_INT); + if (!i) { + return NULL; + } + + struct fx_int_p *p = fx_object_get_private(i, FX_TYPE_INT); + p->i_type = INT_NAN_POSITIVE; + p->i_value = 0; + + return i; +} + +fx_int *fx_int_create_nan_negative(void) +{ + fx_int *i = fx_object_create(FX_TYPE_INT); + if (!i) { + return NULL; + } + + struct fx_int_p *p = fx_object_get_private(i, FX_TYPE_INT); + p->i_type = INT_NAN_NEGATIVE; + p->i_value = 0; + + return i; +} + +fx_int *fx_int_create_inf(void) +{ + fx_int *i = fx_object_create(FX_TYPE_INT); + if (!i) { + return NULL; + } + + struct fx_int_p *p = fx_object_get_private(i, FX_TYPE_INT); + p->i_type = INT_INF_POSITIVE; + p->i_value = 0; + + return i; +} + +fx_int *fx_int_create_inf_negative(void) +{ + fx_int *i = fx_object_create(FX_TYPE_INT); + if (!i) { + return NULL; + } + + struct fx_int_p *p = fx_object_get_private(i, FX_TYPE_INT); + p->i_type = INT_INF_NEGATIVE; + p->i_value = 0; + + return i; +} + +intptr_t fx_int_get_value(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_get_value, i); +} + +void fx_int_set_value(fx_int *i, intptr_t v) +{ + FX_CLASS_DISPATCH_STATIC_V(FX_TYPE_INT, int_set_value, i, v); +} + +void fx_int_set_value_nan(fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_INT, int_set_value_nan, i); +} + +void fx_int_set_value_nan_negative(fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_INT, int_set_value_nan_negative, i); +} + +void fx_int_set_value_inf(fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_INT, int_set_value_inf, i); +} + +void fx_int_set_value_inf_negative(fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_INT, int_set_value_inf_negative, i); +} + +bool fx_int_is_nan(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_nan, i); +} + +bool fx_int_is_nan_positive(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_nan_positive, i); +} + +bool fx_int_is_nan_negative(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_nan_negative, i); +} + +bool fx_int_is_inf(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_inf, i); +} + +bool fx_int_is_inf_positive(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_inf_positive, i); +} + +bool fx_int_is_inf_negative(const fx_int *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_INT, int_is_inf_negative, i); +} + +/*** VIRTUAL FUNCTIONS ********************************************************/ + +static void int_init(fx_object *obj, void *priv) +{ + struct fx_int_p *i = priv; + + i->i_type = INT_REGULAR; + i->i_value = 0; +} + +static void int_fini(fx_object *obj, void *priv) +{ +} + +static void int_to_string(const fx_object *obj, fx_stream *out) +{ + struct fx_int_p *i = fx_object_get_private(obj, FX_TYPE_INT); + switch (i->i_type) { + case INT_REGULAR: + fx_stream_write_fmt(out, NULL, "%" PRIdPTR, i->i_value); + break; + case INT_INF_POSITIVE: + fx_stream_write_cstr(out, "inf", NULL); + break; + case INT_INF_NEGATIVE: + fx_stream_write_cstr(out, "-inf", NULL); + break; + case INT_NAN_POSITIVE: + fx_stream_write_cstr(out, "NaN", NULL); + break; + case INT_NAN_NEGATIVE: + fx_stream_write_cstr(out, "-NaN", NULL); + break; + default: + break; + } +} + +/*** CLASS DEFINITION *********************************************************/ + +FX_TYPE_CLASS_DEFINITION_BEGIN(fx_int) + FX_TYPE_CLASS_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) + FX_INTERFACE_ENTRY(to_string) = int_to_string; + FX_TYPE_CLASS_INTERFACE_END(fx_object, FX_TYPE_OBJECT) +FX_TYPE_CLASS_DEFINITION_END(fx_int) + +FX_TYPE_DEFINITION_BEGIN(fx_int) + FX_TYPE_ID(0x3b20f57a, 0x2ddf, 0x4682, 0x81c4, 0x4fe404a6524e); + FX_TYPE_CLASS(fx_int_class); + FX_TYPE_INSTANCE_PRIVATE(struct fx_int_p); + FX_TYPE_INSTANCE_INIT(int_init); + FX_TYPE_INSTANCE_FINI(int_fini); +FX_TYPE_DEFINITION_END(fx_int) diff --git a/fx/number.c b/fx/number.c deleted file mode 100644 index 3a8909c..0000000 --- a/fx/number.c +++ /dev/null @@ -1,2499 +0,0 @@ -#include -#include -#include -#include -#include - -/*** PRIVATE DATA *************************************************************/ - -enum fx_number_flags { - NUMBER_F_INF = 0x01u, - NUMBER_F_NAN = 0x02u, -}; - -struct fx_number_p { - fx_number_type n_type; - enum fx_number_flags n_flags; - union { - int8_t v_int8; - int16_t v_int16; - int32_t v_int32; - int64_t v_int64; - float v_float32; - double v_float64; - char v_char; - short v_short; - int v_int; - long v_long; - long long v_longlong; - float v_float; - double v_double; - size_t v_size_t; - } n_value; -}; - -typedef int (*number_converter_t)(const struct fx_number_p *, void *); - -static number_converter_t converters[FX_NUMBER_TYPE_COUNT] - [FX_NUMBER_TYPE_COUNT]; - -/*** PRIVATE FUNCTIONS ********************************************************/ - -static fx_number_type number_get_number_type(const struct fx_number_p *number) -{ - return number->n_type; -} - -static int number_get_value( - const struct fx_number_p *number, - fx_number_type type, - void *value_ptr) -{ - fx_number_type srb_type = number->n_type; - fx_number_type dest_type = type; - - number_converter_t converter = converters[srb_type][dest_type]; - if (!converter) { - return -1; - } - - return converter(number, value_ptr); -} - -static bool number_is_integer(const struct fx_number_p *number) -{ - switch (number->n_type) { - case FX_NUMBER_INT8: - case FX_NUMBER_INT16: - case FX_NUMBER_INT32: - case FX_NUMBER_INT64: - case FX_NUMBER_SIZE_T: - case FX_NUMBER_CHAR: - case FX_NUMBER_SHORT: - case FX_NUMBER_INT: - case FX_NUMBER_LONG: - case FX_NUMBER_LONGLONG: - case FX_NUMBER_HANDLE: - return true; - default: - return false; - } -} - -static bool number_is_float(const struct fx_number_p *number) -{ - switch (number->n_type) { - case FX_NUMBER_FLOAT: - case FX_NUMBER_DOUBLE: - case FX_NUMBER_FLOAT32: - case FX_NUMBER_FLOAT64: - return true; - default: - return false; - } -} - -static bool number_is_inf(const struct fx_number_p *number) -{ - return (number->n_flags & NUMBER_F_INF) != 0; -} - -static bool number_is_inf_positive(const struct fx_number_p *number) -{ - if (!(number->n_flags & NUMBER_F_INF)) { - return false; - } - - switch (number->n_type) { - case FX_NUMBER_INT8: - return number->n_value.v_int8 >= 0; - case FX_NUMBER_INT16: - return number->n_value.v_int16 >= 0; - case FX_NUMBER_INT32: - return number->n_value.v_int32 >= 0; - case FX_NUMBER_INT64: - return number->n_value.v_int64 >= 0; - case FX_NUMBER_FLOAT32: - return number->n_value.v_float32 >= 0; - case FX_NUMBER_FLOAT64: - return number->n_value.v_float64 >= 0; - case FX_NUMBER_CHAR: - return number->n_value.v_char >= 0; - case FX_NUMBER_SHORT: - return number->n_value.v_short >= 0; - case FX_NUMBER_INT: - return number->n_value.v_int >= 0; - case FX_NUMBER_LONG: - return number->n_value.v_long >= 0; - case FX_NUMBER_LONGLONG: - return number->n_value.v_longlong >= 0; - case FX_NUMBER_FLOAT: - return number->n_value.v_float >= 0; - case FX_NUMBER_DOUBLE: - return number->n_value.v_double >= 0; - case FX_NUMBER_SIZE_T: - return number->n_value.v_size_t >= 0; - default: - return true; - } -} - -static bool number_is_inf_negative(const struct fx_number_p *number) -{ - if (!(number->n_flags & NUMBER_F_INF)) { - return false; - } - - switch (number->n_type) { - case FX_NUMBER_INT8: - return number->n_value.v_int8 < 0; - case FX_NUMBER_INT16: - return number->n_value.v_int16 < 0; - case FX_NUMBER_INT32: - return number->n_value.v_int32 < 0; - case FX_NUMBER_INT64: - return number->n_value.v_int64 < 0; - case FX_NUMBER_FLOAT32: - return number->n_value.v_float32 < 0; - case FX_NUMBER_FLOAT64: - return number->n_value.v_float64 < 0; - case FX_NUMBER_CHAR: - return number->n_value.v_char < 0; - case FX_NUMBER_SHORT: - return number->n_value.v_short < 0; - case FX_NUMBER_INT: - return number->n_value.v_int < 0; - case FX_NUMBER_LONG: - return number->n_value.v_long < 0; - case FX_NUMBER_LONGLONG: - return number->n_value.v_longlong < 0; - case FX_NUMBER_FLOAT: - return number->n_value.v_float < 0; - case FX_NUMBER_DOUBLE: - return number->n_value.v_double < 0; - case FX_NUMBER_SIZE_T: - return number->n_value.v_size_t < 0; - default: - return false; - } -} - -static bool number_is_nan(const struct fx_number_p *number) -{ - return (number->n_flags & NUMBER_F_NAN) != 0; -} - -static bool number_is_nan_positive(const struct fx_number_p *number) -{ - if (!(number->n_flags & NUMBER_F_NAN)) { - return false; - } - - switch (number->n_type) { - case FX_NUMBER_INT8: - return number->n_value.v_int8 >= 0; - case FX_NUMBER_INT16: - return number->n_value.v_int16 >= 0; - case FX_NUMBER_INT32: - return number->n_value.v_int32 >= 0; - case FX_NUMBER_INT64: - return number->n_value.v_int64 >= 0; - case FX_NUMBER_FLOAT32: - return number->n_value.v_float32 >= 0; - case FX_NUMBER_FLOAT64: - return number->n_value.v_float64 >= 0; - case FX_NUMBER_CHAR: - return number->n_value.v_char >= 0; - case FX_NUMBER_SHORT: - return number->n_value.v_short >= 0; - case FX_NUMBER_INT: - return number->n_value.v_int >= 0; - case FX_NUMBER_LONG: - return number->n_value.v_long >= 0; - case FX_NUMBER_LONGLONG: - return number->n_value.v_longlong >= 0; - case FX_NUMBER_FLOAT: - return number->n_value.v_float >= 0; - case FX_NUMBER_DOUBLE: - return number->n_value.v_double >= 0; - case FX_NUMBER_SIZE_T: - return number->n_value.v_size_t >= 0; - default: - return true; - } -} - -static bool number_is_nan_negative(const struct fx_number_p *number) -{ - if (!(number->n_flags & NUMBER_F_NAN)) { - return false; - } - - switch (number->n_type) { - case FX_NUMBER_INT8: - return number->n_value.v_int8 < 0; - case FX_NUMBER_INT16: - return number->n_value.v_int16 < 0; - case FX_NUMBER_INT32: - return number->n_value.v_int32 < 0; - case FX_NUMBER_INT64: - return number->n_value.v_int64 < 0; - case FX_NUMBER_FLOAT32: - return number->n_value.v_float32 < 0; - case FX_NUMBER_FLOAT64: - return number->n_value.v_float64 < 0; - case FX_NUMBER_CHAR: - return number->n_value.v_char < 0; - case FX_NUMBER_SHORT: - return number->n_value.v_short < 0; - case FX_NUMBER_INT: - return number->n_value.v_int < 0; - case FX_NUMBER_LONG: - return number->n_value.v_long < 0; - case FX_NUMBER_LONGLONG: - return number->n_value.v_longlong < 0; - case FX_NUMBER_FLOAT: - return number->n_value.v_float < 0; - case FX_NUMBER_DOUBLE: - return number->n_value.v_double < 0; - case FX_NUMBER_SIZE_T: - return number->n_value.v_size_t < 0; - default: - return false; - } -} - -static void number_set_inf_positive(struct fx_number_p *number, bool v) -{ - if (!v) { - number->n_flags &= ~NUMBER_F_INF; - return; - } - - number->n_flags &= ~NUMBER_F_NAN; - number->n_flags |= NUMBER_F_INF; - - switch (number->n_type) { - case FX_NUMBER_INT8: - number->n_value.v_int8 = 0; - break; - case FX_NUMBER_INT16: - number->n_value.v_int16 = 0; - break; - case FX_NUMBER_INT32: - number->n_value.v_int32 = 0; - break; - case FX_NUMBER_INT64: - number->n_value.v_int64 = 0; - break; - case FX_NUMBER_FLOAT32: - number->n_value.v_float32 = 0; - break; - case FX_NUMBER_FLOAT64: - number->n_value.v_float64 = 0; - break; - case FX_NUMBER_CHAR: - number->n_value.v_char = 0; - break; - case FX_NUMBER_SHORT: - number->n_value.v_short = 0; - break; - case FX_NUMBER_INT: - number->n_value.v_int = 0; - break; - case FX_NUMBER_LONG: - number->n_value.v_long = 0; - break; - case FX_NUMBER_LONGLONG: - number->n_value.v_longlong = 0; - break; - case FX_NUMBER_FLOAT: - number->n_value.v_float = 0; - break; - case FX_NUMBER_DOUBLE: - number->n_value.v_double = 0; - break; - case FX_NUMBER_SIZE_T: - number->n_value.v_size_t = 0; - break; - default: - break; - } -} - -static void number_set_inf_negative(struct fx_number_p *number, bool v) -{ - if (!v) { - number->n_flags &= ~NUMBER_F_INF; - return; - } - - number->n_flags &= ~NUMBER_F_NAN; - number->n_flags |= NUMBER_F_INF; - - switch (number->n_type) { - case FX_NUMBER_INT8: - number->n_value.v_int8 = -1; - break; - case FX_NUMBER_INT16: - number->n_value.v_int16 = -1; - break; - case FX_NUMBER_INT32: - number->n_value.v_int32 = -1; - break; - case FX_NUMBER_INT64: - number->n_value.v_int64 = -1; - break; - case FX_NUMBER_FLOAT32: - number->n_value.v_float32 = -1; - break; - case FX_NUMBER_FLOAT64: - number->n_value.v_float64 = -1; - break; - case FX_NUMBER_CHAR: - number->n_value.v_char = -1; - break; - case FX_NUMBER_SHORT: - number->n_value.v_short = -1; - break; - case FX_NUMBER_INT: - number->n_value.v_int = -1; - break; - case FX_NUMBER_LONG: - number->n_value.v_long = -1; - break; - case FX_NUMBER_LONGLONG: - number->n_value.v_longlong = -1; - break; - case FX_NUMBER_FLOAT: - number->n_value.v_float = -1; - break; - case FX_NUMBER_DOUBLE: - number->n_value.v_double = -1; - break; - case FX_NUMBER_SIZE_T: - number->n_value.v_size_t = -1; - break; - default: - break; - } -} - -static void number_set_nan_positive(struct fx_number_p *number, bool v) -{ - if (!v) { - number->n_flags &= ~NUMBER_F_NAN; - return; - } - - number->n_flags &= ~NUMBER_F_INF; - number->n_flags |= NUMBER_F_NAN; - - switch (number->n_type) { - case FX_NUMBER_INT8: - number->n_value.v_int8 = 0; - break; - case FX_NUMBER_INT16: - number->n_value.v_int16 = 0; - break; - case FX_NUMBER_INT32: - number->n_value.v_int32 = 0; - break; - case FX_NUMBER_INT64: - number->n_value.v_int64 = 0; - break; - case FX_NUMBER_FLOAT32: - number->n_value.v_float32 = 0; - break; - case FX_NUMBER_FLOAT64: - number->n_value.v_float64 = 0; - break; - case FX_NUMBER_CHAR: - number->n_value.v_char = 0; - break; - case FX_NUMBER_SHORT: - number->n_value.v_short = 0; - break; - case FX_NUMBER_INT: - number->n_value.v_int = 0; - break; - case FX_NUMBER_LONG: - number->n_value.v_long = 0; - break; - case FX_NUMBER_LONGLONG: - number->n_value.v_longlong = 0; - break; - case FX_NUMBER_FLOAT: - number->n_value.v_float = 0; - break; - case FX_NUMBER_DOUBLE: - number->n_value.v_double = 0; - break; - case FX_NUMBER_SIZE_T: - number->n_value.v_size_t = 0; - break; - default: - break; - } -} - -static void number_set_nan_negative(struct fx_number_p *number, bool v) -{ - if (!v) { - number->n_flags &= ~NUMBER_F_NAN; - return; - } - - number->n_flags &= ~NUMBER_F_INF; - number->n_flags |= NUMBER_F_NAN; - - switch (number->n_type) { - case FX_NUMBER_INT8: - number->n_value.v_int8 = -1; - break; - case FX_NUMBER_INT16: - number->n_value.v_int16 = -1; - break; - case FX_NUMBER_INT32: - number->n_value.v_int32 = -1; - break; - case FX_NUMBER_INT64: - number->n_value.v_int64 = -1; - break; - case FX_NUMBER_FLOAT32: - number->n_value.v_float32 = -1; - break; - case FX_NUMBER_FLOAT64: - number->n_value.v_float64 = -1; - break; - case FX_NUMBER_CHAR: - number->n_value.v_char = -1; - break; - case FX_NUMBER_SHORT: - number->n_value.v_short = -1; - break; - case FX_NUMBER_INT: - number->n_value.v_int = -1; - break; - case FX_NUMBER_LONG: - number->n_value.v_long = -1; - break; - case FX_NUMBER_LONGLONG: - number->n_value.v_longlong = -1; - break; - case FX_NUMBER_FLOAT: - number->n_value.v_float = -1; - break; - case FX_NUMBER_DOUBLE: - number->n_value.v_double = -1; - break; - case FX_NUMBER_SIZE_T: - number->n_value.v_size_t = -1; - break; - default: - break; - } -} - -static size_t number_data_size(const struct fx_number_p *number) -{ - switch (number->n_type) { - case FX_NUMBER_INT8: - return sizeof number->n_value.v_int8; - case FX_NUMBER_INT16: - return sizeof number->n_value.v_int16; - case FX_NUMBER_INT32: - return sizeof number->n_value.v_int32; - case FX_NUMBER_INT64: - return sizeof number->n_value.v_int64; - case FX_NUMBER_FLOAT32: - return sizeof number->n_value.v_float32; - case FX_NUMBER_FLOAT64: - return sizeof number->n_value.v_float64; - case FX_NUMBER_CHAR: - return sizeof number->n_value.v_char; - case FX_NUMBER_SHORT: - return sizeof number->n_value.v_short; - case FX_NUMBER_INT: - return sizeof number->n_value.v_int; - case FX_NUMBER_LONG: - return sizeof number->n_value.v_long; - case FX_NUMBER_LONGLONG: - return sizeof number->n_value.v_longlong; - case FX_NUMBER_FLOAT: - return sizeof number->n_value.v_float; - case FX_NUMBER_DOUBLE: - return sizeof number->n_value.v_double; - case FX_NUMBER_SIZE_T: - return sizeof number->n_value.v_size_t; - default: - return 0; - } -} - -static void print_inf(const struct fx_number_p *n, fx_stream *out) -{ - switch (n->n_type) { - case FX_NUMBER_INT8: - fx_stream_write_cstr( - out, - n->n_value.v_int8 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT16: - fx_stream_write_cstr( - out, - n->n_value.v_int16 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT32: - fx_stream_write_cstr( - out, - n->n_value.v_int32 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT64: - fx_stream_write_cstr( - out, - n->n_value.v_int64 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT32: - fx_stream_write_cstr( - out, - n->n_value.v_float32 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT64: - fx_stream_write_cstr( - out, - n->n_value.v_float64 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_CHAR: - fx_stream_write_cstr( - out, - n->n_value.v_char < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_SHORT: - fx_stream_write_cstr( - out, - n->n_value.v_short < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT: - fx_stream_write_cstr( - out, - n->n_value.v_int < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_LONG: - fx_stream_write_cstr( - out, - n->n_value.v_long < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_LONGLONG: - fx_stream_write_cstr( - out, - n->n_value.v_longlong < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT: - fx_stream_write_cstr( - out, - n->n_value.v_float < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_DOUBLE: - fx_stream_write_cstr( - out, - n->n_value.v_double < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_SIZE_T: - fx_stream_write_cstr( - out, - n->n_value.v_size_t < 0 ? "-" : "", - NULL); - break; - default: - break; - } - - fx_stream_write_cstr(out, "INF", NULL); -} - -static void print_nan(const struct fx_number_p *n, fx_stream *out) -{ - switch (n->n_type) { - case FX_NUMBER_INT8: - fx_stream_write_cstr( - out, - n->n_value.v_int8 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT16: - fx_stream_write_cstr( - out, - n->n_value.v_int16 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT32: - fx_stream_write_cstr( - out, - n->n_value.v_int32 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT64: - fx_stream_write_cstr( - out, - n->n_value.v_int64 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT32: - fx_stream_write_cstr( - out, - n->n_value.v_float32 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT64: - fx_stream_write_cstr( - out, - n->n_value.v_float64 < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_CHAR: - fx_stream_write_cstr( - out, - n->n_value.v_char < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_SHORT: - fx_stream_write_cstr( - out, - n->n_value.v_short < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_INT: - fx_stream_write_cstr( - out, - n->n_value.v_int < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_LONG: - fx_stream_write_cstr( - out, - n->n_value.v_long < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_LONGLONG: - fx_stream_write_cstr( - out, - n->n_value.v_longlong < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_FLOAT: - fx_stream_write_cstr( - out, - n->n_value.v_float < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_DOUBLE: - fx_stream_write_cstr( - out, - n->n_value.v_double < 0 ? "-" : "", - NULL); - break; - case FX_NUMBER_SIZE_T: - fx_stream_write_cstr( - out, - n->n_value.v_size_t < 0 ? "-" : "", - NULL); - break; - default: - break; - } - - fx_stream_write_cstr(out, "NaN", NULL); -} - -/*** PUBLIC FUNCTIONS *********************************************************/ - -fx_number *fx_number_create(fx_number_type type, void *value_ptr) -{ - fx_number *n = fx_object_create(FX_TYPE_NUMBER); - if (!n) { - return NULL; - } - - struct fx_number_p *p = fx_object_get_private(n, FX_TYPE_NUMBER); - - p->n_type = type; - - if (!value_ptr) { - return n; - } - - switch (p->n_type) { - case FX_NUMBER_INT8: - memcpy(&p->n_value.v_int8, value_ptr, sizeof p->n_value.v_int8); - break; - case FX_NUMBER_INT16: - memcpy(&p->n_value.v_int16, - value_ptr, - sizeof p->n_value.v_int16); - break; - case FX_NUMBER_INT32: - memcpy(&p->n_value.v_int32, - value_ptr, - sizeof p->n_value.v_int32); - break; - case FX_NUMBER_INT64: - memcpy(&p->n_value.v_int64, - value_ptr, - sizeof p->n_value.v_int64); - break; - case FX_NUMBER_FLOAT32: - memcpy(&p->n_value.v_float32, - value_ptr, - sizeof p->n_value.v_float32); - break; - case FX_NUMBER_FLOAT64: - memcpy(&p->n_value.v_float64, - value_ptr, - sizeof p->n_value.v_float64); - break; - case FX_NUMBER_CHAR: - memcpy(&p->n_value.v_char, value_ptr, sizeof p->n_value.v_char); - break; - case FX_NUMBER_SHORT: - memcpy(&p->n_value.v_short, - value_ptr, - sizeof p->n_value.v_short); - break; - case FX_NUMBER_INT: - memcpy(&p->n_value.v_int, value_ptr, sizeof p->n_value.v_int); - break; - case FX_NUMBER_LONG: - memcpy(&p->n_value.v_long, value_ptr, sizeof p->n_value.v_long); - break; - case FX_NUMBER_LONGLONG: - memcpy(&p->n_value.v_longlong, - value_ptr, - sizeof p->n_value.v_longlong); - break; - case FX_NUMBER_FLOAT: - memcpy(&p->n_value.v_float, - value_ptr, - sizeof p->n_value.v_float); - break; - case FX_NUMBER_DOUBLE: - memcpy(&p->n_value.v_double, - value_ptr, - sizeof p->n_value.v_double); - break; - case FX_NUMBER_SIZE_T: - memcpy(&p->n_value.v_size_t, - value_ptr, - sizeof p->n_value.v_size_t); - break; - default: - break; - } - - return n; -} - -fx_number_type fx_number_get_number_type(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0( - FX_TYPE_NUMBER, - number_get_number_type, - number); -} - -int fx_number_get_value( - const fx_number *number, - fx_number_type type, - void *value_ptr) -{ - FX_CLASS_DISPATCH_STATIC( - FX_TYPE_NUMBER, - number_get_value, - number, - type, - value_ptr); -} - -bool fx_number_is_integer(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_NUMBER, number_is_integer, number); -} - -bool fx_number_is_float(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_NUMBER, number_is_float, number); -} - -bool fx_number_is_inf(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_NUMBER, number_is_inf, number); -} - -bool fx_number_is_inf_positive(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0( - FX_TYPE_NUMBER, - number_is_inf_positive, - number); -} - -bool fx_number_is_inf_negative(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0( - FX_TYPE_NUMBER, - number_is_inf_negative, - number); -} - -bool fx_number_is_nan(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_NUMBER, number_is_nan, number); -} - -bool fx_number_is_nan_positive(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0( - FX_TYPE_NUMBER, - number_is_nan_positive, - number); -} - -bool fx_number_is_nan_negative(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0( - FX_TYPE_NUMBER, - number_is_nan_negative, - number); -} - -void fx_number_set_inf_positive(fx_number *number, bool v) -{ - FX_CLASS_DISPATCH_STATIC( - FX_TYPE_NUMBER, - number_set_inf_positive, - number, - v); -} - -void fx_number_set_inf_negative(fx_number *number, bool v) -{ - FX_CLASS_DISPATCH_STATIC( - FX_TYPE_NUMBER, - number_set_inf_negative, - number, - v); -} - -void fx_number_set_nan_positive(fx_number *number, bool v) -{ - FX_CLASS_DISPATCH_STATIC( - FX_TYPE_NUMBER, - number_set_nan_positive, - number, - v); -} - -void fx_number_set_nan_negative(fx_number *number, bool v) -{ - FX_CLASS_DISPATCH_STATIC( - FX_TYPE_NUMBER, - number_set_nan_negative, - number, - v); -} - -size_t fx_number_data_size(const fx_number *number) -{ - FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_NUMBER, number_data_size, number); -} - -/*** VIRTUAL FUNCTIONS ********************************************************/ - -static void number_init(fx_object *obj, void *priv) -{ - struct fx_number_p *number = priv; -} - -static void number_fini(fx_object *obj, void *priv) -{ - struct fx_number_p *number = priv; -} - -static void number_to_string(const fx_object *obj, fx_stream *out) -{ - struct fx_number_p *number = fx_object_get_private(obj, FX_TYPE_NUMBER); - - if (number->n_flags & NUMBER_F_INF) { - print_inf(number, out); - return; - } - - if (number->n_flags & NUMBER_F_NAN) { - print_nan(number, out); - return; - } - - switch (number->n_type) { - case FX_NUMBER_INT8: - fx_stream_write_fmt( - out, - NULL, - "%" PRIu8, - number->n_value.v_int8); - break; - case FX_NUMBER_INT16: - fx_stream_write_fmt( - out, - NULL, - "%" PRIu16, - number->n_value.v_int16); - break; - case FX_NUMBER_INT32: - fx_stream_write_fmt( - out, - NULL, - "%" PRIu32, - number->n_value.v_int32); - break; - case FX_NUMBER_INT64: - fx_stream_write_fmt( - out, - NULL, - "%" PRIu64, - number->n_value.v_int64); - break; - case FX_NUMBER_FLOAT32: - fx_stream_write_fmt(out, NULL, "%f", number->n_value.v_float32); - break; - case FX_NUMBER_FLOAT64: - fx_stream_write_fmt( - out, - NULL, - "%lf", - number->n_value.v_float64); - break; - case FX_NUMBER_CHAR: - fx_stream_write_fmt(out, NULL, "%d", number->n_value.v_char); - break; - case FX_NUMBER_SHORT: - fx_stream_write_fmt(out, NULL, "%d", number->n_value.v_short); - break; - case FX_NUMBER_INT: - fx_stream_write_fmt(out, NULL, "%d", number->n_value.v_int); - break; - case FX_NUMBER_LONG: - fx_stream_write_fmt(out, NULL, "%ld", number->n_value.v_long); - break; - case FX_NUMBER_LONGLONG: - fx_stream_write_fmt( - out, - NULL, - "%lld", - number->n_value.v_longlong); - break; - case FX_NUMBER_FLOAT: - fx_stream_write_fmt(out, NULL, "%f", number->n_value.v_float); - break; - case FX_NUMBER_DOUBLE: - fx_stream_write_fmt(out, NULL, "%lf", number->n_value.v_double); - break; - case FX_NUMBER_SIZE_T: - fx_stream_write_fmt(out, NULL, "%zu", number->n_value.v_size_t); - break; - case FX_NUMBER_HANDLE: - fx_stream_write_fmt( - out, - NULL, - "%016" PRIx64, - number->n_value.v_size_t); - break; - default: - break; - } -} - -/*** CLASS DEFINITION *********************************************************/ - -FX_TYPE_CLASS_DEFINITION_BEGIN(fx_number) - FX_TYPE_CLASS_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) - FX_INTERFACE_ENTRY(to_string) = number_to_string; - FX_TYPE_CLASS_INTERFACE_END(fx_object, FX_TYPE_OBJECT) -FX_TYPE_CLASS_DEFINITION_END(fx_number) - -FX_TYPE_DEFINITION_BEGIN(fx_number) - FX_TYPE_ID(0xa713b0ea, 0x240f, 0x4bc5, 0xbe73, 0xbc3e56401bd3); - FX_TYPE_CLASS(fx_number_class); - FX_TYPE_INSTANCE_PRIVATE(struct fx_number_p); - FX_TYPE_INSTANCE_INIT(number_init); - FX_TYPE_INSTANCE_FINI(number_fini); -FX_TYPE_DEFINITION_END(fx_number) - -/*** MISC FUNCTIONS ***********************************************************/ - -/* ++++++++++++++++++ int8 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int int8_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = (int16_t)number->n_value.v_int8; - return 0; -} - -static int int8_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = (int32_t)number->n_value.v_int8; - return 0; -} - -static int int8_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = (int64_t)number->n_value.v_int8; - return 0; -} - -static int int8_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = (short)number->n_value.v_int8; - return 0; -} - -static int int8_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = (int)number->n_value.v_int8; - return 0; -} - -static int int8_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = (long)number->n_value.v_int8; - return 0; -} - -static int int8_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = (long long)number->n_value.v_int8; - return 0; -} - -static int int8_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int8; - return 0; -} - -static int int8_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = (size_t)number->n_value.v_int8; - return 0; -} - -/* ++++++++++++++++++ int16 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int int16_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = (int8_t)number->n_value.v_int16; - return 0; -} - -static int int16_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = (char)number->n_value.v_int16; - return 0; -} - -static int int16_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int16; - return 0; -} - -static int int16_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_int16; - return 0; -} - -/* ++++++++++++++++++ int32 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int int32_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = (int8_t)number->n_value.v_int32; - return 0; -} - -static int int32_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = (int16_t)number->n_value.v_int32; - return 0; -} - -static int int32_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = (float)number->n_value.v_int32; - return 0; -} - -static int int32_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = (char)number->n_value.v_int32; - return 0; -} - -static int int32_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = (short)number->n_value.v_int32; - return 0; -} - -static int int32_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = (float)number->n_value.v_int32; - return 0; -} - -static int int32_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int32; - return 0; -} - -static int int32_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_int32; - return 0; -} - -/* ++++++++++++++++++ int64 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int int64_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = (int8_t)number->n_value.v_int64; - return 0; -} - -static int int64_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = (int16_t)number->n_value.v_int64; - return 0; -} - -static int int64_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = (int32_t)number->n_value.v_int64; - return 0; -} - -static int int64_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_int64; - return 0; -} - -static int int64_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = (float)number->n_value.v_int64; - return 0; -} - -static int int64_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = (double)number->n_value.v_int64; - return 0; -} - -static int int64_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = (char)number->n_value.v_int64; - return 0; -} - -static int int64_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = (short)number->n_value.v_int64; - return 0; -} - -static int int64_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = (int)number->n_value.v_int64; - return 0; -} - -static int int64_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_int64; - return 0; -} - -static int int64_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_int64; - return 0; -} - -static int int64_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = (float)number->n_value.v_int64; - return 0; -} - -static int int64_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = (double)number->n_value.v_int64; - return 0; -} - -static int int64_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_int64; - return 0; -} - -/* ++++++++++++++++++ float32 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int float32_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = (int8_t)number->n_value.v_float32; - return 0; -} - -static int float32_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = (int16_t)number->n_value.v_float32; - return 0; -} - -static int float32_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = (int32_t)number->n_value.v_float32; - return 0; -} - -static int float32_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = (int64_t)number->n_value.v_float32; - return 0; -} - -static int float32_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = (char)number->n_value.v_float32; - return 0; -} - -static int float32_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = (short)number->n_value.v_float32; - return 0; -} - -static int float32_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = (int)number->n_value.v_float32; - return 0; -} - -static int float32_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_longlong( - const struct fx_number_p *number, - void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float32; - return 0; -} - -static int float32_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_float32; - return 0; -} - -/* ++++++++++++++++++ float64 -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int float64_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_longlong( - const struct fx_number_p *number, - void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float64; - return 0; -} - -static int float64_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_float64; - return 0; -} - -/* ++++++++++++++++++ char -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int char_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_char; - return 0; -} - -static int char_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_char; - return 0; -} - -/* ++++++++++++++++++ short -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int short_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_short; - return 0; -} - -static int short_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_short; - return 0; -} - -/* ++++++++++++++++++ int -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int int_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_int; - return 0; -} - -static int int_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_int; - return 0; -} - -/* ++++++++++++++++++ long -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int long_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_long; - return 0; -} - -static int long_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_long; - return 0; -} - -/* ++++++++++++++++++ longlong -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int longlong_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_float32( - const struct fx_number_p *number, - void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_float64( - const struct fx_number_p *number, - void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_longlong( - const struct fx_number_p *number, - void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_longlong; - return 0; -} - -static int longlong_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_longlong; - return 0; -} - -/* ++++++++++++++++++ float -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int float_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_float; - return 0; -} - -static int float_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_float; - return 0; -} - -/* ++++++++++++++++++ double -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int double_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_double; - return 0; -} - -static int double_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_double; - return 0; -} - -/* ++++++++++++++++++ size_t -> xyz CONVERTER CALLBACKS ++++++++++++++++++ */ - -static int size_t_to_int8(const struct fx_number_p *number, void *value_ptr) -{ - *(int8_t *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_int16(const struct fx_number_p *number, void *value_ptr) -{ - *(int16_t *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_int32(const struct fx_number_p *number, void *value_ptr) -{ - *(int32_t *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_int64(const struct fx_number_p *number, void *value_ptr) -{ - *(int64_t *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_float32(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_float64(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_char(const struct fx_number_p *number, void *value_ptr) -{ - *(char *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_short(const struct fx_number_p *number, void *value_ptr) -{ - *(short *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_int(const struct fx_number_p *number, void *value_ptr) -{ - *(int *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_long(const struct fx_number_p *number, void *value_ptr) -{ - *(long *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_longlong(const struct fx_number_p *number, void *value_ptr) -{ - *(long long *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_float(const struct fx_number_p *number, void *value_ptr) -{ - *(float *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_double(const struct fx_number_p *number, void *value_ptr) -{ - *(double *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static int size_t_to_size_t(const struct fx_number_p *number, void *value_ptr) -{ - *(size_t *)value_ptr = number->n_value.v_size_t; - return 0; -} - -static number_converter_t converters[FX_NUMBER_TYPE_COUNT][FX_NUMBER_TYPE_COUNT] = { - /* int8_t -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_INT8] = { - [FX_NUMBER_INT8] = int8_to_int8, - [FX_NUMBER_INT16] = int8_to_int16, - [FX_NUMBER_INT32] = int8_to_int32, - [FX_NUMBER_INT64] = int8_to_int64, - [FX_NUMBER_FLOAT32] = int8_to_float32, - [FX_NUMBER_FLOAT64] = int8_to_float64, - [FX_NUMBER_CHAR] = int8_to_char, - [FX_NUMBER_SHORT] = int8_to_short, - [FX_NUMBER_INT] = int8_to_int, - [FX_NUMBER_LONG] = int8_to_long, - [FX_NUMBER_LONGLONG] = int8_to_longlong, - [FX_NUMBER_FLOAT] = int8_to_float, - [FX_NUMBER_DOUBLE] = int8_to_double, - [FX_NUMBER_SIZE_T] = int8_to_size_t, - }, - /* int16 -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_INT16] = { - [FX_NUMBER_INT8] = int16_to_int8, - [FX_NUMBER_INT16] = int16_to_int16, - [FX_NUMBER_INT32] = int16_to_int32, - [FX_NUMBER_INT64] = int16_to_int64, - [FX_NUMBER_FLOAT32] = int16_to_float32, - [FX_NUMBER_FLOAT64] = int16_to_float64, - [FX_NUMBER_CHAR] = int16_to_char, - [FX_NUMBER_SHORT] = int16_to_short, - [FX_NUMBER_INT] = int16_to_int, - [FX_NUMBER_LONG] = int16_to_long, - [FX_NUMBER_LONGLONG] = int16_to_longlong, - [FX_NUMBER_FLOAT] = int16_to_float, - [FX_NUMBER_DOUBLE] = int16_to_double, - [FX_NUMBER_SIZE_T] = int16_to_size_t, - }, - /* int32 -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_INT32] = { - [FX_NUMBER_INT8] = int32_to_int8, - [FX_NUMBER_INT16] = int32_to_int16, - [FX_NUMBER_INT32] = int32_to_int32, - [FX_NUMBER_INT64] = int32_to_int64, - [FX_NUMBER_FLOAT32] = int32_to_float32, - [FX_NUMBER_FLOAT64] = int32_to_float64, - [FX_NUMBER_CHAR] = int32_to_char, - [FX_NUMBER_SHORT] = int32_to_short, - [FX_NUMBER_INT] = int32_to_int, - [FX_NUMBER_LONG] = int32_to_long, - [FX_NUMBER_LONGLONG] = int32_to_longlong, - [FX_NUMBER_FLOAT] = int32_to_float, - [FX_NUMBER_DOUBLE] = int32_to_double, - [FX_NUMBER_SIZE_T] = int32_to_size_t, - }, - /* int64 -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_INT64] = { - [FX_NUMBER_INT8] = int64_to_int8, - [FX_NUMBER_INT16] = int64_to_int16, - [FX_NUMBER_INT32] = int64_to_int32, - [FX_NUMBER_INT64] = int64_to_int64, - [FX_NUMBER_FLOAT32] = int64_to_float32, - [FX_NUMBER_FLOAT64] = int64_to_float64, - [FX_NUMBER_CHAR] = int64_to_char, - [FX_NUMBER_SHORT] = int64_to_short, - [FX_NUMBER_INT] = int64_to_int, - [FX_NUMBER_LONG] = int64_to_long, - [FX_NUMBER_LONGLONG] = int64_to_longlong, - [FX_NUMBER_FLOAT] = int64_to_float, - [FX_NUMBER_DOUBLE] = int64_to_double, - [FX_NUMBER_SIZE_T] = int64_to_size_t, - }, - /* float32 -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_FLOAT32] = { - [FX_NUMBER_INT8] = float32_to_int8, - [FX_NUMBER_INT16] = float32_to_int16, - [FX_NUMBER_INT32] = float32_to_int32, - [FX_NUMBER_INT64] = float32_to_int64, - [FX_NUMBER_FLOAT32] = float32_to_float32, - [FX_NUMBER_FLOAT64] = float32_to_float64, - [FX_NUMBER_CHAR] = float32_to_char, - [FX_NUMBER_SHORT] = float32_to_short, - [FX_NUMBER_INT] = float32_to_int, - [FX_NUMBER_LONG] = float32_to_long, - [FX_NUMBER_LONGLONG] = float32_to_longlong, - [FX_NUMBER_FLOAT] = float32_to_float, - [FX_NUMBER_DOUBLE] = float32_to_double, - [FX_NUMBER_SIZE_T] = float32_to_size_t, - }, - /* float64 -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_FLOAT64] = { - [FX_NUMBER_INT8] = float64_to_int8, - [FX_NUMBER_INT16] = float64_to_int16, - [FX_NUMBER_INT32] = float64_to_int32, - [FX_NUMBER_INT64] = float64_to_int64, - [FX_NUMBER_FLOAT32] = float64_to_float32, - [FX_NUMBER_FLOAT64] = float64_to_float64, - [FX_NUMBER_CHAR] = float64_to_char, - [FX_NUMBER_SHORT] = float64_to_short, - [FX_NUMBER_INT] = float64_to_int, - [FX_NUMBER_LONG] = float64_to_long, - [FX_NUMBER_LONGLONG] = float64_to_longlong, - [FX_NUMBER_FLOAT] = float64_to_float, - [FX_NUMBER_DOUBLE] = float64_to_double, - [FX_NUMBER_SIZE_T] = float64_to_size_t, - }, - /* char > xyz CONVERTER CALLBACKS */ - [FX_NUMBER_CHAR] = { - [FX_NUMBER_INT8] = char_to_int8, - [FX_NUMBER_INT16] = char_to_int16, - [FX_NUMBER_INT32] = char_to_int32, - [FX_NUMBER_INT64] = char_to_int64, - [FX_NUMBER_FLOAT32] = char_to_float32, - [FX_NUMBER_FLOAT64] = char_to_float64, - [FX_NUMBER_CHAR] = char_to_char, - [FX_NUMBER_SHORT] = char_to_short, - [FX_NUMBER_INT] = char_to_int, - [FX_NUMBER_LONG] = char_to_long, - [FX_NUMBER_LONGLONG] = char_to_longlong, - [FX_NUMBER_FLOAT] = char_to_float, - [FX_NUMBER_DOUBLE] = char_to_double, - [FX_NUMBER_SIZE_T] = char_to_size_t, - }, - /* short -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_SHORT] = { - [FX_NUMBER_INT8] = short_to_int8, - [FX_NUMBER_INT16] = short_to_int16, - [FX_NUMBER_INT32] = short_to_int32, - [FX_NUMBER_INT64] = short_to_int64, - [FX_NUMBER_FLOAT32] = short_to_float32, - [FX_NUMBER_FLOAT64] = short_to_float64, - [FX_NUMBER_CHAR] = short_to_char, - [FX_NUMBER_SHORT] = short_to_short, - [FX_NUMBER_INT] = short_to_int, - [FX_NUMBER_LONG] = short_to_long, - [FX_NUMBER_LONGLONG] = short_to_longlong, - [FX_NUMBER_FLOAT] = short_to_float, - [FX_NUMBER_DOUBLE] = short_to_double, - [FX_NUMBER_SIZE_T] = short_to_size_t, - }, - /* int -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_INT] = { - [FX_NUMBER_INT8] = int_to_int8, - [FX_NUMBER_INT16] = int_to_int16, - [FX_NUMBER_INT32] = int_to_int32, - [FX_NUMBER_INT64] = int_to_int64, - [FX_NUMBER_FLOAT32] = int_to_float32, - [FX_NUMBER_FLOAT64] = int_to_float64, - [FX_NUMBER_CHAR] = int_to_char, - [FX_NUMBER_SHORT] = int_to_short, - [FX_NUMBER_INT] = int_to_int, - [FX_NUMBER_LONG] = int_to_long, - [FX_NUMBER_LONGLONG] = int_to_longlong, - [FX_NUMBER_FLOAT] = int_to_float, - [FX_NUMBER_DOUBLE] = int_to_double, - [FX_NUMBER_SIZE_T] = int_to_size_t, - }, - /* long -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_LONG] = { - [FX_NUMBER_INT8] = long_to_int8, - [FX_NUMBER_INT16] = long_to_int16, - [FX_NUMBER_INT32] = long_to_int32, - [FX_NUMBER_INT64] = long_to_int64, - [FX_NUMBER_FLOAT32] = long_to_float32, - [FX_NUMBER_FLOAT64] = long_to_float64, - [FX_NUMBER_CHAR] = long_to_char, - [FX_NUMBER_SHORT] = long_to_short, - [FX_NUMBER_INT] = long_to_int, - [FX_NUMBER_LONG] = long_to_long, - [FX_NUMBER_LONGLONG] = long_to_longlong, - [FX_NUMBER_FLOAT] = long_to_float, - [FX_NUMBER_DOUBLE] = long_to_double, - [FX_NUMBER_SIZE_T] = long_to_size_t, - }, - /* longlong -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_LONGLONG] = { - [FX_NUMBER_INT8] = longlong_to_int8, - [FX_NUMBER_INT16] = longlong_to_int16, - [FX_NUMBER_INT32] = longlong_to_int32, - [FX_NUMBER_INT64] = longlong_to_int64, - [FX_NUMBER_FLOAT32] = longlong_to_float32, - [FX_NUMBER_FLOAT64] = longlong_to_float64, - [FX_NUMBER_CHAR] = longlong_to_char, - [FX_NUMBER_SHORT] = longlong_to_short, - [FX_NUMBER_INT] = longlong_to_int, - [FX_NUMBER_LONG] = longlong_to_long, - [FX_NUMBER_LONGLONG] = longlong_to_longlong, - [FX_NUMBER_FLOAT] = longlong_to_float, - [FX_NUMBER_DOUBLE] = longlong_to_double, - [FX_NUMBER_SIZE_T] = longlong_to_size_t, - }, - /* float -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_FLOAT] = { - [FX_NUMBER_INT8] = float_to_int8, - [FX_NUMBER_INT16] = float_to_int16, - [FX_NUMBER_INT32] = float_to_int32, - [FX_NUMBER_INT64] = float_to_int64, - [FX_NUMBER_FLOAT32] = float_to_float32, - [FX_NUMBER_FLOAT64] = float_to_float64, - [FX_NUMBER_CHAR] = float_to_char, - [FX_NUMBER_SHORT] = float_to_short, - [FX_NUMBER_INT] = float_to_int, - [FX_NUMBER_LONG] = float_to_long, - [FX_NUMBER_LONGLONG] = float_to_longlong, - [FX_NUMBER_FLOAT] = float_to_float, - [FX_NUMBER_DOUBLE] = float_to_double, - [FX_NUMBER_SIZE_T] = float_to_size_t, - }, - /* double -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_DOUBLE] = { - [FX_NUMBER_INT8] = double_to_int8, - [FX_NUMBER_INT16] = double_to_int16, - [FX_NUMBER_INT32] = double_to_int32, - [FX_NUMBER_INT64] = double_to_int64, - [FX_NUMBER_FLOAT32] = double_to_float32, - [FX_NUMBER_FLOAT64] = double_to_float64, - [FX_NUMBER_CHAR] = double_to_char, - [FX_NUMBER_SHORT] = double_to_short, - [FX_NUMBER_INT] = double_to_int, - [FX_NUMBER_LONG] = double_to_long, - [FX_NUMBER_LONGLONG] = double_to_longlong, - [FX_NUMBER_FLOAT] = double_to_float, - [FX_NUMBER_DOUBLE] = double_to_double, - [FX_NUMBER_SIZE_T] = double_to_size_t, - }, - /* size_t -> xyz CONVERTER CALLBACKS */ - [FX_NUMBER_SIZE_T] = { - [FX_NUMBER_INT8] = size_t_to_int8, - [FX_NUMBER_INT16] = size_t_to_int16, - [FX_NUMBER_INT32] = size_t_to_int32, - [FX_NUMBER_INT64] = size_t_to_int64, - [FX_NUMBER_FLOAT32] = size_t_to_float32, - [FX_NUMBER_FLOAT64] = size_t_to_float64, - [FX_NUMBER_CHAR] = size_t_to_char, - [FX_NUMBER_SHORT] = size_t_to_short, - [FX_NUMBER_INT] = size_t_to_int, - [FX_NUMBER_LONG] = size_t_to_long, - [FX_NUMBER_LONGLONG] = size_t_to_longlong, - [FX_NUMBER_FLOAT] = size_t_to_float, - [FX_NUMBER_DOUBLE] = size_t_to_double, - [FX_NUMBER_SIZE_T] = size_t_to_size_t, - }, -}; diff --git a/fx/uint.c b/fx/uint.c new file mode 100644 index 0000000..67fabb7 --- /dev/null +++ b/fx/uint.c @@ -0,0 +1,174 @@ +#include +#include +#include +#include + +/*** PRIVATE DATA *************************************************************/ + +enum uint_type { + UINT_REGULAR = 0, + UINT_INF, + UINT_NAN, +}; + +struct fx_uint_p { + enum uint_type i_type; + uintptr_t i_value; +}; + +/*** PRIVATE FUNCTIONS ********************************************************/ + +static uintptr_t uint_get_value(const struct fx_uint_p *i) +{ + return i->i_value; +} + +static void uint_set_value(struct fx_uint_p *i, uintptr_t v) +{ + i->i_type = UINT_REGULAR; + i->i_value = v; +} + +static void uint_set_value_nan(struct fx_uint_p *i) +{ + i->i_type = UINT_NAN; + i->i_value = 0; +} + +static void uint_set_value_inf(struct fx_uint_p *i) +{ + i->i_type = UINT_INF; + i->i_value = 0; +} + +static bool uint_is_nan(struct fx_uint_p *i) +{ + return i->i_type == UINT_NAN; +} + +static bool uint_is_inf(struct fx_uint_p *i) +{ + return i->i_type == UINT_INF; +} + +/*** PUBLIC FUNCTIONS *********************************************************/ + +fx_uint *fx_uint_create(uintptr_t value) +{ + fx_uint *i = fx_object_create(FX_TYPE_UINT); + if (!i) { + return NULL; + } + + struct fx_uint_p *p = fx_object_get_private(i, FX_TYPE_UINT); + p->i_type = UINT_REGULAR; + p->i_value = value; + + return i; +} + +fx_uint *fx_uint_create_nan(void) +{ + fx_uint *i = fx_object_create(FX_TYPE_UINT); + if (!i) { + return NULL; + } + + struct fx_uint_p *p = fx_object_get_private(i, FX_TYPE_UINT); + p->i_type = UINT_NAN; + p->i_value = 0; + + return i; +} + +fx_uint *fx_uint_create_inf(void) +{ + fx_uint *i = fx_object_create(FX_TYPE_UINT); + if (!i) { + return NULL; + } + + struct fx_uint_p *p = fx_object_get_private(i, FX_TYPE_UINT); + p->i_type = UINT_INF; + p->i_value = 0; + + return i; +} + +uintptr_t fx_uint_get_value(const fx_uint *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_UINT, uint_get_value, i); +} + +void fx_uint_set_value(fx_uint *i, uintptr_t v) +{ + FX_CLASS_DISPATCH_STATIC_V(FX_TYPE_UINT, uint_set_value, i, v); +} + +void fx_uint_set_value_nan(fx_uint *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_UINT, uint_set_value_nan, i); +} + +void fx_uint_set_value_inf(fx_uint *i) +{ + FX_CLASS_DISPATCH_STATIC_V0(FX_TYPE_UINT, uint_set_value_inf, i); +} + +bool fx_uint_is_nan(const fx_uint *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_UINT, uint_is_nan, i); +} + +bool fx_uint_is_inf(const fx_uint *i) +{ + FX_CLASS_DISPATCH_STATIC_0(FX_TYPE_UINT, uint_is_inf, i); +} + +/*** VIRTUAL FUNCTIONS ********************************************************/ + +static void uint_init(fx_object *obj, void *priv) +{ + struct fx_uint_p *i = priv; + + i->i_type = UINT_REGULAR; + i->i_value = 0; +} + +static void uint_fini(fx_object *obj, void *priv) +{ +} + +static void uint_to_string(const fx_object *obj, fx_stream *out) +{ + struct fx_uint_p *i = fx_object_get_private(obj, FX_TYPE_UINT); + switch (i->i_type) { + case UINT_REGULAR: + fx_stream_write_fmt(out, NULL, "%" PRIdPTR, i->i_value); + break; + case UINT_INF: + fx_stream_write_cstr(out, "inf", NULL); + break; + case UINT_NAN: + fx_stream_write_cstr(out, "NaN", NULL); + break; + default: + break; + } +} + +/*** CLASS DEFINITION *********************************************************/ + +FX_TYPE_CLASS_DEFINITION_BEGIN(fx_uint) + FX_TYPE_CLASS_INTERFACE_BEGIN(fx_object, FX_TYPE_OBJECT) + FX_INTERFACE_ENTRY(to_string) = uint_to_string; + FX_TYPE_CLASS_INTERFACE_END(fx_object, FX_TYPE_OBJECT) +FX_TYPE_CLASS_DEFINITION_END(fx_uint) + +FX_TYPE_DEFINITION_BEGIN(fx_uint) + FX_TYPE_ID(0x79aee484, 0x5dd5, 0x463a, 0xb0c8, 0x60873abdf088); + FX_TYPE_CLASS(fx_uint_class); + FX_TYPE_INSTANCE_PRIVATE(struct fx_uint_p); + FX_TYPE_INSTANCE_INIT(uint_init); + FX_TYPE_INSTANCE_FINI(uint_fini); +FX_TYPE_DEFINITION_END(fx_uint)