[geany/geany] 9f06d4: Use union for StashTreeValue instead of void*

Nick Treleaven git-noreply at xxxxx
Thu Jul 26 00:03:54 UTC 2012


Branch:      refs/heads/document-messages
Author:      Nick Treleaven <nick.treleaven at btinternet.com>
Committer:   Nick Treleaven <nick.treleaven at btinternet.com>
Date:        Sat, 07 Apr 2012 17:09:28
Commit:      9f06d49f6f43aa54d00f7815a12bc8320dee8cfc
             https://github.com/geany/geany/commit/9f06d49f6f43aa54d00f7815a12bc8320dee8cfc

Log Message:
-----------
Use union for StashTreeValue instead of void*

This avoids many casts.


Modified Paths:
--------------
    src/stash.c

Modified: src/stash.c
42 files changed, 19 insertions(+), 23 deletions(-)
===================================================================
@@ -927,10 +927,14 @@ enum
 struct StashTreeValue
 {
 	GType setting_type;
-	gpointer setting;
 	const gchar *key_name;
 	const gchar *group_name;
 	StashPref *pref;
+	union
+	{
+		gchararray tree_string;
+		gint tree_int;
+	} data;
 };
 
 typedef struct StashTreeValue StashTreeValue;
@@ -953,17 +957,17 @@ static void stash_tree_renderer_set_data(GtkCellLayout *cell_layout, GtkCellRend
 		switch (value->setting_type)
 		{
 			case G_TYPE_BOOLEAN:
-				g_object_set(cell, "active", GPOINTER_TO_INT(value->setting), NULL);
+				g_object_set(cell, "active", value->data.tree_int, NULL);
 				break;
 			case G_TYPE_INT:
 			{
-				gchar *text = g_strdup_printf("%d", GPOINTER_TO_INT(value->setting));
+				gchar *text = g_strdup_printf("%d", value->data.tree_int);
 				g_object_set(cell, "text", text, NULL);
 				g_free(text);
 				break;
 			}
 			case G_TYPE_STRING:
-				g_object_set(cell, "text", (gchararray) value->setting, NULL);
+				g_object_set(cell, "text", value->data.tree_string, NULL);
 				break;
 		}
 	}
@@ -983,14 +987,13 @@ static void stash_tree_renderer_edited(gchar *path_str, gchar *new_text, GtkTree
 	switch (value->setting_type)
 	{
 		case G_TYPE_BOOLEAN:
-			value->setting = GINT_TO_POINTER(!GPOINTER_TO_INT(value->setting));
+			value->data.tree_int = !value->data.tree_int;
 			break;
 		case G_TYPE_INT:
-			value->setting = GINT_TO_POINTER(atoi(new_text));
+			value->data.tree_int = atoi(new_text);
 			break;
 		case G_TYPE_STRING:
-			g_free(value->setting);
-			value->setting = g_strdup(new_text);
+			SETPTR(value->data.tree_string, g_strdup(new_text));
 			break;
 	}
 
@@ -1020,7 +1023,7 @@ static gboolean stash_tree_discard_value(GtkTreeModel *model, GtkTreePath *path,
 
 	gtk_tree_model_get(model, iter, STASH_TREE_VALUE, &value, -1);
 	if (value->setting_type == G_TYPE_STRING)
-		g_free(value->setting);
+		g_free(value->data.tree_string);
 	g_free(value);
 
 	return FALSE;
@@ -1040,10 +1043,9 @@ static void stash_tree_append_pref(StashGroup *group, StashPref *entry, GtkListS
 	GtkTreeIter iter;
 	StashTreeValue *value;
 
-	value = g_new(StashTreeValue, 1);
+	value = g_new0(StashTreeValue, 1);
 
 	value->setting_type = entry->setting_type;
-	value->setting = NULL;
 	value->key_name = entry->key_name;
 	value->group_name = group->name;
 	value->pref = entry;
@@ -1132,17 +1134,14 @@ static void stash_tree_display_pref(StashTreeValue *value, StashPref *entry)
 	switch (entry->setting_type)
 	{
 		case G_TYPE_BOOLEAN:
-			value->setting = GINT_TO_POINTER(*(gboolean *) entry->setting);
+			value->data.tree_int = *(gboolean *) entry->setting;
 			break;
 		case G_TYPE_INT:
-			value->setting = GINT_TO_POINTER(*(gint *) entry->setting);
+			value->data.tree_int = *(gint *) entry->setting;
 			break;
 		case G_TYPE_STRING:
-		{
-			g_free(value->setting);
-			value->setting = g_strdup(*(gchararray *) entry->setting);
+			SETPTR(value->data.tree_string, g_strdup(*(gchararray *) entry->setting));
 			break;
-		}
 		default:
 			g_warning("Unhandled type for %s::%s in %s()!", value->group_name,
 				entry->key_name, G_STRFUNC);
@@ -1152,21 +1151,18 @@ static void stash_tree_display_pref(StashTreeValue *value, StashPref *entry)
 
 static void stash_tree_update_pref(StashTreeValue *value, StashPref *entry)
 {
-	gpointer *setting = value->setting;
-
 	switch (entry->setting_type)
 	{
 		case G_TYPE_BOOLEAN:
-			*(gboolean *) entry->setting = GPOINTER_TO_INT(setting);
+			*(gboolean *) entry->setting = value->data.tree_int;
 			break;
 		case G_TYPE_INT:
-			*(gint *) entry->setting = GPOINTER_TO_INT(setting);
+			*(gint *) entry->setting = value->data.tree_int;
 			break;
 		case G_TYPE_STRING:
 		{
 			gchararray *text = entry->setting;
-			g_free(*text);
-			*text = g_strdup((gchararray) setting);
+			SETPTR(*text, g_strdup(value->data.tree_string));
 			break;
 		}
 		default:


@@ Diff output truncated at 100000 characters. @@


--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).



More information about the Commits mailing list