summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJuan Pablo Ugarte <juanpablougarte@gmail.com>2013-12-11 17:25:02 -0300
committerJuan Pablo Ugarte <juanpablougarte@gmail.com>2013-12-11 17:56:42 -0300
commit16e1768bbee5d39e724a218db02be6bb8e072000 (patch)
treee102fc60a398e9d95cfee3bb7d55ffbb15202557
parent5eea8b51b009db4694671469cb63e16482db1287 (diff)
downloadglade-16e1768bbee5d39e724a218db02be6bb8e072000.tar.gz
_glade_tsort() simplyfied api by using a GList for edges instead of a
custom linked struct since we do not need the marginal speedup now that dependencies are only between toplevels. This allow us to easily sort edges alphabetically. tests/toplevel-order: Updated to new _glade_tsort() api
-rw-r--r--gladeui/glade-tsort.c62
-rw-r--r--gladeui/glade-tsort.h13
-rw-r--r--tests/toplevel-order.c6
-rw-r--r--tests/toplevel_order_test6.glade2
4 files changed, 42 insertions, 41 deletions
diff --git a/gladeui/glade-tsort.c b/gladeui/glade-tsort.c
index 439da33e..5d43f702 100644
--- a/gladeui/glade-tsort.c
+++ b/gladeui/glade-tsort.c
@@ -34,8 +34,8 @@
*
* Returns: the new start of the node list.
*/
-_NodeEdge *
-_node_edge_prepend (_NodeEdge *node,
+GList *
+_node_edge_prepend (GList *list,
gpointer predecessor,
gpointer successor)
{
@@ -43,34 +43,44 @@ _node_edge_prepend (_NodeEdge *node,
edge->predecessor = predecessor;
edge->successor = successor;
- edge->next = node;
- return edge;
+ return g_list_prepend (list, edge);
+}
+
+static void
+_node_edge_free (gpointer data)
+{
+ g_slice_free (_NodeEdge, data);
}
void
-_node_edge_free (_NodeEdge *node)
+_node_edge_list_free (GList *list)
{
- g_slice_free_chain (_NodeEdge, node, next);
+ g_list_free_full (list, _node_edge_free);
}
static inline void
-tsort_remove_non_start_nodes (GList **nodes, _NodeEdge *edges)
+tsort_remove_non_start_nodes (GList **nodes, GList *edges)
{
- _NodeEdge *edge;
+ GList *l;
- for (edge = edges; edge; edge = edge->next)
- *nodes = g_list_remove (*nodes, edge->successor);
+ for (l = edges; l; l = g_list_next (l))
+ {
+ _NodeEdge *edge = l->data;
+ *nodes = g_list_remove (*nodes, edge->successor);
+ }
}
static inline gboolean
-tsort_node_has_no_incoming_edge (gpointer node, _NodeEdge *edges)
+tsort_node_has_no_incoming_edge (gpointer node, GList *edges)
{
- _NodeEdge *edge;
+ GList *l;
- for (edge = edges; edge; edge = edge->next)
+ for (l = edges; l; l = g_list_next (l))
{
+ _NodeEdge *edge = l->data;
+
if (node == edge->successor)
return FALSE;
}
@@ -106,7 +116,7 @@ tsort_node_has_no_incoming_edge (gpointer node, _NodeEdge *edges)
* Returns: a new list sorted by dependency including nodes only present in @edges
*/
GList *
-_glade_tsort (GList **nodes, _NodeEdge **edges)
+_glade_tsort (GList **nodes, GList **edges)
{
GList *sorted_nodes;
@@ -119,7 +129,7 @@ _glade_tsort (GList **nodes, _NodeEdge **edges)
/* while S is non-empty do */
while (*nodes)
{
- _NodeEdge *edge, *next, *prev = NULL;
+ GList *l, *next;
gpointer n;
/* remove a node n from S */
@@ -128,23 +138,20 @@ _glade_tsort (GList **nodes, _NodeEdge **edges)
/* insert n into L */
/*if (!glade_widget_get_parent (n)) this would be a specific optimization */
- sorted_nodes = g_list_prepend (sorted_nodes, n);
+ sorted_nodes = g_list_prepend (sorted_nodes, n);
/* for each node m ... */
- for (edge = *edges; edge; edge = next)
+ for (l = *edges; l; l = next)
{
- next = edge->next;
+ _NodeEdge *edge = l->data;
+
+ next = g_list_next (l);
/* ... with an edge e from n to m do */
if (edge->predecessor == n)
{
/* remove edge e from the graph */
- if (prev)
- prev->next = (prev->next) ? prev->next->next : NULL;
- else
- /* edge is the first element in the list so we only need to
- * change the start of the list */
- *edges = next;
+ *edges = g_list_delete_link (*edges, l);
/* if m has no other incoming edges then */
if (tsort_node_has_no_incoming_edge (edge->successor, *edges))
@@ -153,11 +160,6 @@ _glade_tsort (GList **nodes, _NodeEdge **edges)
g_slice_free (_NodeEdge, edge);
}
- else
- /* Keep a pointer to the previous node in the iteration to make
- * things easier when removing a node
- */
- prev = edge;
}
}
@@ -166,7 +168,7 @@ _glade_tsort (GList **nodes, _NodeEdge **edges)
if (*edges)
{
g_list_free (sorted_nodes);
- g_slice_free_chain (_NodeEdge, *edges, next);
+ _node_edge_list_free (*edges);
*edges = NULL;
return NULL;
}
diff --git a/gladeui/glade-tsort.h b/gladeui/glade-tsort.h
index 3026e2d5..28ed6e48 100644
--- a/gladeui/glade-tsort.h
+++ b/gladeui/glade-tsort.h
@@ -34,17 +34,16 @@ struct __NodeEdge
{
gpointer predecessor;
gpointer successor;
- _NodeEdge *next;
};
-_NodeEdge *_node_edge_prepend (_NodeEdge *node,
- gpointer predecessor,
- gpointer successor);
+GList *_node_edge_prepend (GList *list,
+ gpointer predecessor,
+ gpointer successor);
-void _node_edge_free (_NodeEdge *node);
+void _node_edge_list_free (GList *list);
-GList *_glade_tsort (GList **nodes,
- _NodeEdge **edges);
+GList *_glade_tsort (GList **nodes,
+ GList **edges);
G_END_DECLS
diff --git a/tests/toplevel-order.c b/tests/toplevel-order.c
index 64a0c76d..9011c012 100644
--- a/tests/toplevel-order.c
+++ b/tests/toplevel-order.c
@@ -8,7 +8,7 @@
typedef struct
{
GList *nodes;
- _NodeEdge *edges;
+ GList *edges;
gchar **orig_nodes;
} TsortData;
@@ -17,7 +17,7 @@ tsort_data_free (gpointer udata)
{
TsortData *data = udata;
g_list_free (data->nodes);
- _node_edge_free (data->edges);
+ _node_edge_list_free (data->edges);
g_free (data);
}
@@ -129,7 +129,7 @@ static gchar *order_test5[] = {"toplevel_order_test5.glade",
/* Commonly used widgets with dependencies */
static gchar *order_test6[] = {"toplevel_order_test6.glade",
- "iconfactory", "label_a", "label_b", "asizegroup", "label_c", "xaction",
+ "ziconfactory", "label_a", "label_b", "asizegroup", "label_c", "xaction",
"xactiongroup", "anotherwindow", "xentrybuffer", "xliststore", "treeview",
"zaccelgroup", "awindow", NULL };
diff --git a/tests/toplevel_order_test6.glade b/tests/toplevel_order_test6.glade
index 8f8cac91..af061399 100644
--- a/tests/toplevel_order_test6.glade
+++ b/tests/toplevel_order_test6.glade
@@ -2,7 +2,6 @@
<!-- Generated with glade 3.16.0 on Fri Nov 1 11:43:04 2013 -->
<interface>
<!-- interface-requires gtk+ 3.10 -->
- <object class="GtkIconFactory" id="iconfactory"/>
<object class="GtkLabel" id="label_a">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -114,4 +113,5 @@
</object>
</child>
</object>
+ <object class="GtkIconFactory" id="ziconfactory"/>
</interface>