-
Notifications
You must be signed in to change notification settings - Fork 2
Add registry for numerical type size and endianness #17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 3 commits
c3268d1
e121043
af66464
2b4c70d
66dda91
8614cd6
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -18,13 +18,15 @@ | |
|
|
||
| #include "numeric-types.h" | ||
|
|
||
| #include <glib.h> | ||
| #include <string.h> | ||
|
|
||
| #define DEFINE_NUMERIC(type) \ | ||
| G_DEFINE_BOXED_TYPE (numeric_##type, \ | ||
| numeric_##type, \ | ||
| numeric_##type##_copy, \ | ||
| numeric_##type##_free) \ | ||
| G_DEFINE_BOXED_TYPE_WITH_CODE (numeric_##type, \ | ||
| numeric_##type, \ | ||
| numeric_##type##_copy, \ | ||
| numeric_##type##_free, \ | ||
| numeric_type_register_static (g_define_type_id, G_STRINGIFY(type), sizeof (numeric_##type), G_BYTE_ORDER)) \ | ||
arteymix marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| \ | ||
| numeric_##type * \ | ||
| numeric_##type##_copy (numeric_##type *num) \ | ||
|
|
@@ -54,17 +56,6 @@ numeric_value_set_##type (GValue *val, numeric_##type x) \ | |
| g_value_set_boxed (val, ptr); \ | ||
| } | ||
|
|
||
| DEFINE_NUMERIC (int128) | ||
| DEFINE_NUMERIC (uint128) | ||
| DEFINE_NUMERIC (float80) | ||
| DEFINE_NUMERIC (float128) | ||
| DEFINE_NUMERIC (decimal32) | ||
| DEFINE_NUMERIC (decimal64) | ||
| DEFINE_NUMERIC (decimal128) | ||
| DEFINE_NUMERIC (complex) | ||
| DEFINE_NUMERIC (complex80) | ||
| DEFINE_NUMERIC (complex128) | ||
|
|
||
| #define DEFINE_NUMERIC_WITH_BYTESWAP(type,gtype,stype,routine,order) \ | ||
| DEFINE_NUMERIC (type) \ | ||
| numeric_##type \ | ||
|
|
@@ -93,6 +84,117 @@ numeric_##type##_to_##gtype (numeric_##type num) \ | |
| return data.v_##gtype; \ | ||
| } | ||
|
|
||
| GArray *TYPE_TABLE = NULL; | ||
|
||
|
|
||
| void | ||
| numeric_type_register_static (GType type, | ||
| const gchar *name, | ||
| gsize width, | ||
| gint byte_order) | ||
| { | ||
| if (TYPE_TABLE == NULL) | ||
| { | ||
| TYPE_TABLE = g_array_new (FALSE, FALSE, sizeof (NumericTypeInfo)); | ||
| } | ||
|
|
||
| /* make sure we don't register the same type twice */ | ||
| gint i; | ||
| for (i = 0; i < TYPE_TABLE->len; i++) | ||
| { | ||
| NumericTypeInfo* ti = &g_array_index (TYPE_TABLE, NumericTypeInfo, i); | ||
| if (ti->type == type) | ||
| return; | ||
| } | ||
|
|
||
| NumericTypeInfo ti = { | ||
| .type = type, | ||
| .name = g_strdup (name), | ||
| .width = width, | ||
| .byte_order = byte_order}; | ||
|
|
||
| g_array_append_val (TYPE_TABLE, | ||
| ti); | ||
| } | ||
|
Owner
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be great if we could enumerate these types at runtime so that the we could be forward compatibly if new types are defined in GLib. |
||
|
|
||
| const NumericTypeInfo * | ||
| numeric_get_type_info (GType type) | ||
| { | ||
| gint i; | ||
| for (i = 0; i < TYPE_TABLE->len; i++) | ||
| { | ||
| NumericTypeInfo* ti = &g_array_index (TYPE_TABLE, NumericTypeInfo, i); | ||
| if (ti->type == type) | ||
| { | ||
| return ti; | ||
| } | ||
| } | ||
|
|
||
| g_return_val_if_reached (NULL); | ||
| } | ||
|
|
||
| const NumericTypeInfo * | ||
| numeric_get_type_info_from_name (const gchar *name) | ||
| { | ||
| gint i; | ||
| for (i = 0; i < TYPE_TABLE->len; i++) | ||
| { | ||
| const NumericTypeInfo* ti = &g_array_index (TYPE_TABLE, NumericTypeInfo, i); | ||
| if (g_strcmp0 (ti->name, name) == 0) | ||
| { | ||
| return ti; | ||
| } | ||
| } | ||
|
|
||
| g_return_val_if_reached (NULL); | ||
| } | ||
|
|
||
| /** | ||
| * numeric_type_get_name: | ||
| * Obtain the number of bytes occupied by @numeric_type. | ||
| */ | ||
| const gchar * | ||
| numeric_type_get_name (GType numeric_type) | ||
| { | ||
| const NumericTypeInfo *type_info; | ||
| type_info = numeric_get_type_info (numeric_type); | ||
arteymix marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return type_info->name; | ||
| } | ||
|
|
||
| /** | ||
| * numeric_type_get_width: | ||
| * Obtain the number of bytes occupied by @numeric_type. | ||
| */ | ||
| gsize | ||
| numeric_type_get_width (GType numeric_type) | ||
| { | ||
| const NumericTypeInfo *type_info; | ||
| type_info = numeric_get_type_info (numeric_type); | ||
| return type_info->width; | ||
| } | ||
|
|
||
| /** | ||
| * numeric_type_get_byte_order: | ||
| * Obtain the byte order of @numeric_type. | ||
| */ | ||
| gint | ||
| numeric_type_get_byte_order (GType numeric_type) | ||
| { | ||
| const NumericTypeInfo *type_info; | ||
| type_info = numeric_get_type_info (numeric_type); | ||
| return type_info->byte_order; | ||
| } | ||
|
|
||
| DEFINE_NUMERIC (int128) | ||
| DEFINE_NUMERIC (uint128) | ||
| DEFINE_NUMERIC (float80) | ||
| DEFINE_NUMERIC (float128) | ||
| DEFINE_NUMERIC (decimal32) | ||
| DEFINE_NUMERIC (decimal64) | ||
| DEFINE_NUMERIC (decimal128) | ||
| DEFINE_NUMERIC (complex) | ||
| DEFINE_NUMERIC (complex80) | ||
| DEFINE_NUMERIC (complex128) | ||
|
|
||
| DEFINE_NUMERIC_WITH_BYTESWAP (int_le, int, gint, GINT, LE) | ||
| DEFINE_NUMERIC_WITH_BYTESWAP (int_be, int, gint, GINT, BE) | ||
| DEFINE_NUMERIC_WITH_BYTESWAP (uint_le, uint, guint, GUINT, LE) | ||
|
|
@@ -112,11 +214,25 @@ DEFINE_NUMERIC_WITH_BYTESWAP (double_be, double, gint32, GINT64, BE) | |
|
|
||
| #if HAVE_LIBDFP | ||
| extern void register_printf_dfp (void); | ||
| #endif | ||
|
|
||
| __attribute__ ((constructor)) | ||
| static void | ||
| numeric_types_init (void) | ||
| { | ||
| // register all GLib numerical types | ||
| numeric_type_register_static (G_TYPE_CHAR, "char", sizeof (gchar), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_UCHAR, "uchar", sizeof (guchar), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_INT, "int", sizeof (gint), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_UINT, "uint", sizeof (guint), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_LONG, "long", sizeof (glong), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_ULONG, "ulong", sizeof (gulong), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_INT64, "int64", sizeof (gint64), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_UINT64, "uint64", sizeof (guint64), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_FLOAT, "float", sizeof (gfloat), G_BYTE_ORDER); | ||
| numeric_type_register_static (G_TYPE_DOUBLE, "double", sizeof (gdouble), G_BYTE_ORDER); | ||
|
||
|
|
||
| #if HAVE_LIBDFP | ||
arteymix marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| register_printf_dfp (); | ||
| } | ||
| #endif | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These functions should be defined within the
TypeInfoclass as static.