[geany/geany-plugins] d3b344: scope - added scp_tree_store_traverse()
Dimitar Zhekov
git-noreply at xxxxx
Thu May 16 18:12:25 UTC 2013
Branch: refs/heads/master
Author: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date: Thu, 16 May 2013 18:12:25 UTC
Commit: d3b344de660620ce85847b1ed72a75587735d485
https://github.com/geany/geany-plugins/commit/d3b344de660620ce85847b1ed72a75587735d485
Log Message:
-----------
scope - added scp_tree_store_traverse()
Modified Paths:
--------------
scope/ChangeLog
scope/src/store/ChangeLog
scope/src/store/scptreestore.c
scope/src/store/scptreestore.h
scope/src/store/scptreestore.html
scope/src/views.c
scope/src/views.h
Modified: scope/ChangeLog
8 files changed, 7 insertions(+), 1 deletions(-)
===================================================================
@@ -1,3 +1,9 @@
+2013-05-16 Dimitar Zhekov <dimitar.zhekov at gmail.com>
+
+ * src/store/ChangeLog:
+ Separate change log for ScpTreeStore - initial release.
+
+
2013-05-08 Dimitar Zhekov <dimitar.zhekov at gmail.com>
* src/conterm.c:
@@ -8,7 +14,7 @@
* src/view.c:
Small improvements.
* docs/scope.html, src/scope.c:
- Increased version to 0.87.
+ Increased version to 0.88.
2013-05-04 Dimitar Zhekov <dimitar.zhekov at gmail.com>
Modified: scope/src/store/ChangeLog
9 files changed, 9 insertions(+), 0 deletions(-)
===================================================================
@@ -0,0 +1,9 @@
+2013-05-16 Dimitar Zhekov <dimitar.zhekov at gmail.com>
+
+ * scptreestore.c, scptreestore.h:
+ Added scp_tree_store_traverse().
+ Moved scp_tree_store_iter_tell() from Extra to Store, it's required
+ to insert before/after and move.
+ * scptreestore.html:
+ Documentation and speed test results for scp_tree_store_traverse().
+ Increased version to 0.84.
Modified: scope/src/store/scptreestore.c
84 files changed, 75 insertions(+), 9 deletions(-)
===================================================================
@@ -821,6 +821,15 @@ void scp_tree_store_move(ScpTreeStore *store, GtkTreeIter *iter, gint position)
scp_move_element(store, array, iter, position, TRUE);
}
+gint scp_tree_store_iter_tell(VALIDATE_ONLY ScpTreeStore *store, GtkTreeIter *iter)
+{
+ g_return_val_if_fail(SCP_IS_TREE_STORE(store), -1);
+ g_return_val_if_fail(VALID_ITER(iter, store), -1);
+ g_return_val_if_fail((guint) ITER_INDEX(iter) < ITER_ARRAY(iter)->len, -1);
+
+ return ITER_INDEX(iter);
+}
+
/* Model */
static gint scp_ptr_array_find(GPtrArray *array, AElem *elem)
@@ -1531,15 +1540,6 @@ gboolean scp_tree_store_iter_seek(VALIDATE_ONLY ScpTreeStore *store, GtkTreeIter
return TRUE;
}
-gint scp_tree_store_iter_tell(VALIDATE_ONLY ScpTreeStore *store, GtkTreeIter *iter)
-{
- g_return_val_if_fail(SCP_IS_TREE_STORE(store), -1);
- g_return_val_if_fail(VALID_ITER(iter, store), -1);
- g_return_val_if_fail((guint) ITER_INDEX(iter) < ITER_ARRAY(iter)->len, -1);
-
- return ITER_INDEX(iter);
-}
-
static gint scp_collate_data(const gchar *key, const gchar *data)
{
gchar *key1 = g_utf8_collate_key(data, -1);
@@ -1663,6 +1663,72 @@ gboolean scp_tree_store_search(ScpTreeStore *store, gboolean sublevels, gboolean
return found;
}
+static gboolean scp_traverse(ScpTreeStore *store, GPtrArray *array, GtkTreeIter *iter,
+ gboolean sublevels, ScpTreeStoreTraverseFunc func, gpointer gdata)
+{
+ if (array)
+ {
+ guint i = 0;
+
+ iter->user_data = array;
+ iter->user_data2 = GINT_TO_POINTER(0);
+
+ while (i < array->len)
+ {
+ gint result = func(store, iter, gdata);
+
+ if (result > 0)
+ return TRUE;
+
+ if (!result)
+ {
+ if (sublevels)
+ {
+ if (scp_traverse(store, ((AElem *) array->pdata[i])->children,
+ iter, TRUE, func, gdata) > 0)
+ {
+ return TRUE;
+ }
+
+ iter->user_data = array;
+ }
+
+ iter->user_data2 = GINT_TO_POINTER(++i);
+ }
+ else
+ scp_tree_store_remove(store, iter);
+ }
+ }
+
+ return FALSE;
+}
+
+gboolean scp_tree_store_traverse(ScpTreeStore *store, gboolean sublevels, GtkTreeIter *iter,
+ GtkTreeIter *parent, ScpTreeStoreTraverseFunc func, gpointer gdata)
+{
+ ScpTreeStorePrivate *priv = store->priv;
+ GtkTreeIter iter1;
+
+ g_return_val_if_fail(SCP_IS_TREE_STORE(store), FALSE);
+ g_return_val_if_fail(VALID_ITER_OR_NULL(parent, store), FALSE);
+ g_return_val_if_fail(sublevels == FALSE || priv->sublevels == TRUE, FALSE);
+ g_return_val_if_fail(func != NULL, FALSE);
+
+ if (!iter)
+ iter = &iter1;
+
+ iter->stamp = priv->stamp;
+
+ if (!scp_traverse(store, (parent ? ITER_ELEM(parent) : priv->root)->children, iter,
+ sublevels, func, gdata))
+ {
+ iter->stamp = 0;
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
/* Class */
static void scp_tree_store_tree_model_init(GtkTreeModelIface *iface)
Modified: scope/src/store/scptreestore.h
6 files changed, 5 insertions(+), 1 deletions(-)
===================================================================
@@ -98,6 +98,7 @@ void scp_tree_store_clear_children(ScpTreeStore *store, GtkTreeIter *parent,
void scp_tree_store_reorder(ScpTreeStore *store, GtkTreeIter *parent, gint *new_order);
void scp_tree_store_swap(ScpTreeStore *store, GtkTreeIter *a, GtkTreeIter *b);
void scp_tree_store_move(ScpTreeStore *store, GtkTreeIter *iter, gint position);
+gint scp_tree_store_iter_tell(ScpTreeStore *store, GtkTreeIter *iter);
/* Model */
GtkTreeModelFlags scp_tree_store_get_flags(ScpTreeStore *store);
@@ -149,9 +150,12 @@ void scp_tree_store_set_allocation(ScpTreeStore *store, guint toplevel_reserved,
gint scp_tree_store_compare_func(ScpTreeStore *store, GtkTreeIter *a, GtkTreeIter *b,
gpointer data);
gboolean scp_tree_store_iter_seek(ScpTreeStore *store, GtkTreeIter *iter, gint position);
-gint scp_tree_store_iter_tell(ScpTreeStore *store, GtkTreeIter *iter);
gboolean scp_tree_store_search(ScpTreeStore *store, gboolean sublevels, gboolean linear_order,
GtkTreeIter *iter, GtkTreeIter *parent, gint column, ...);
+typedef gint (*ScpTreeStoreTraverseFunc)(ScpTreeStore *store, GtkTreeIter *iter,
+ gpointer gdata);
+gboolean scp_tree_store_traverse(ScpTreeStore *store, gboolean sublevels, GtkTreeIter *iter,
+ GtkTreeIter *parent, ScpTreeStoreTraverseFunc func, gpointer gdata);
G_END_DECLS
Modified: scope/src/store/scptreestore.html
65 files changed, 55 insertions(+), 10 deletions(-)
===================================================================
@@ -55,9 +55,9 @@
#include "scptreestore.h"</p>
<p>/* Store */<br>
-ScpTreeStore *<a href="scp_tree_store_new">scp_tree_store_new</a>(gboolean sublevels, gint
+ScpTreeStore *<a href="#scp_tree_store_new">scp_tree_store_new</a>(gboolean sublevels, gint
n_columns, ...);<br>
-ScpTreeStore *<a href="scp_tree_store_newv">scp_tree_store_newv</a>(gboolean sublevels, gint
+ScpTreeStore *<a href="#scp_tree_store_newv">scp_tree_store_newv</a>(gboolean sublevels, gint
n_columns, GType *types);<br>
gboolean scp_tree_store_set_column_types(ScpTreeStore *store, gint n_columns, GType *types);<br>
#define scp_tree_store_set_utf8_collate(store, utf8_collate)
@@ -85,16 +85,16 @@
*parent, gint position, ...);<br>
#define scp_tree_store_prepend_with_values(store, iter, parent, ...)<br>
#define scp_tree_store_append_with_values(store, iter, parent, ...)<br>
-void <a href="scp_tree_store_get_valist">scp_tree_store_get_valist</a>(ScpTreeStore *store,
+void <a href="#scp_tree_store_get_valist">scp_tree_store_get_valist</a>(ScpTreeStore *store,
GtkTreeIter *iter, va_list var_args);<br>
-void <a href="scp_tree_store_get">scp_tree_store_get</a>(ScpTreeStore *store, GtkTreeIter
+void <a href="#scp_tree_store_get">scp_tree_store_get</a>(ScpTreeStore *store, GtkTreeIter
*iter, ...);<br>
gboolean scp_tree_store_is_ancestor(ScpTreeStore *store, GtkTreeIter *iter, GtkTreeIter
*descendant);<br>
gint scp_tree_store_iter_depth(ScpTreeStore *store, GtkTreeIter *iter);<br>
-void <a href="scp_tree_store_clear_children">scp_tree_store_clear_children</a>(ScpTreeStore
+void <a href="#scp_tree_store_clear_children">scp_tree_store_clear_children</a>(ScpTreeStore
*store, GtkTreeIter *parent, gboolean emit_subsignals);<br>
-#define <a href="scp_tree_store_clear">scp_tree_store_clear(store)</a><br>
+#define <a href="#scp_tree_store_clear">scp_tree_store_clear(store)</a><br>
gboolean scp_tree_store_iter_is_valid(ScpTreeStore *store, GtkTreeIter *iter);<br>
void scp_tree_store_reorder(ScpTreeStore *store, GtkTreeIter *parent, gint *new_order);<br>
void scp_tree_store_swap(ScpTreeStore *store, GtkTreeIter *a, GtkTreeIter *b);<br>
@@ -148,7 +148,7 @@
</p>
<p>/* Extra */<br>
-void <a href="scp_tree_store_set_allocation">scp_tree_store_set_allocation</a>(ScpTreeStore
+void <a href="#scp_tree_store_set_allocation">scp_tree_store_set_allocation</a>(ScpTreeStore
*store, guint toplevel_reserved, guint sublevel_reserved, gboolean sublevel_discard);<br>
gint <a href="#scp_tree_store_compare_func">scp_tree_store_compare_func</a>(ScpTreeStore *store,
GtkTreeIter *a, GtkTreeIter *b, gpointer data);<br>
@@ -157,7 +157,12 @@
gint scp_tree_store_iter_tell(ScpTreeStore *store, GtkTreeIter *iter);<br>
gboolean <a href="#scp_tree_store_search">scp_tree_store_search</a>(ScpTreeStore *store,
gboolean sublevels, gboolean linear_order, GtkTreeIter *iter, GtkTreeIter *parent, gint column,
-...);
+...);<br>
+typedef gint (*<a href="#ScpTreeStoreTraverseFunc">ScpTreeStoreTraverseFunc</a>)(ScpTreeStore
+*store, GtkTreeIter *iter, gpointer gdata);<br>
+gboolean <a href="#scp_tree_store_traverse">scp_tree_store_traverse</a>(ScpTreeStore *store,
+gboolean sublevels, GtkTreeIter *iter, GtkTreeIter *parent, ScpTreeStoreTraverseFunc func,
+gpointer gdata);
</p>
<hr>
@@ -331,6 +336,30 @@
compare function is ignored, because it requires an iterator, not a value. For string columns,
utf8_collate is taken into account.</p>
+<h3><a name="ScpTreeStoreTraverseFunc">ScpTreeStoreTraverseFunc()</a></h3>
+
+<p><b>gint ScpTreeStoreTraverseFunc(ScpTreeStore *store, GtkTreeIter *iter, gpointer gdata);
+</b></p>
+
+<div>The callback function type for scp_tree_store_traverse(). Return values:</div>
+<div class="tab"><tt>TRUE</tt> (or another positive value): stop iterating<br>
+<tt>FALSE</tt>: continue iterating<br>
+<tt>-1</tt> (or another negative value): remove the current element and continue.</div>
+
+<h3><a name="scp_tree_store_traverse">scp_tree_store_traverse()</a></h3>
+
+<p><b>gboolean scp_tree_store_traverse(ScpTreeStore *store, gboolean sublevels, GtkTreeIter
+*iter, GtkTreeIter *parent, ScpTreeStoreTraverseFunc func, gpointer gdata);</b></p>
+
+<div>Traverse the rows under parent.</div>
+<div class="tab">iter: optional, may be NULL<br>
+parent = NULL: traverse the top-level rows.</div>
+<br>
+<div>Return values:</div>
+<div class="tab"><tt>TRUE</tt> and valid iter if func returns <tt>TRUE</tt> (or
+another positive value)<br>
+<tt>FALSE</tt> and invalid iter otherwise.</div><br>
+
<hr>
<h3><a name="properties">Properties</a></h3>
@@ -404,6 +433,8 @@
<tr><td>top-level iter search string</td><td>25</td><td>0.003</td><td>0.002</td><td>25</td></tr>
<tr><td>top-level linear search double</td><td>25</td><td>n/a</td><td>0.000</td><td>25</td></tr>
<tr><td>top-level linear search string</td><td>25</td><td>n/a</td><td>0.001</td><td>25</td></tr>
+<tr><td>both levels model foreach</td><td>25</td><td>0.000</td><td>0.000</td><td>25</td></tr>
+<tr><td>both levels store traverse</td><td>25</td><td>n/a</td><td>0.000</td><td>25</td></tr>
<tr><td>top-level quick sort double</td><td>25</td><td>0.000</td><td>0.000</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>25</td><td>0.001</td><td>0.000</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>25</td><td>0.000</td><td>0.000</td><td></td></tr>
@@ -422,6 +453,8 @@
<tr><td>top-level iter search string</td><td>100</td><td>0.034</td><td>0.027</td><td>100</td></tr>
<tr><td>top-level linear search double</td><td>100</td><td>n/a</td><td>0.000</td><td>100</td></tr>
<tr><td>top-level linear search string</td><td>100</td><td>n/a</td><td>0.015</td><td>100</td></tr>
+<tr><td>both levels model foreach</td><td>100</td><td>0.003</td><td>0.003</td><td>100</td></tr>
+<tr><td>both levels store traverse</td><td>100</td><td>n/a</td><td>0.000</td><td>100</td></tr>
<tr><td>top-level quick sort double</td><td>100</td><td>0.000</td><td>0.000</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>100</td><td>0.003</td><td>0.002</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>100</td><td>0.000</td><td>0.000</td><td></td></tr>
@@ -440,6 +473,8 @@
<tr><td>top-level iter search string</td><td>250</td><td>0.224</td><td>0.183</td><td>250</td></tr>
<tr><td>top-level linear search double</td><td>250</td><td>n/a</td><td>0.001</td><td>250</td></tr>
<tr><td>top-level linear search string</td><td>250</td><td>n/a</td><td>0.109</td><td>250</td></tr>
+<tr><td>both levels model foreach</td><td>250</td><td>0.018</td><td>0.018</td><td>250</td></tr>
+<tr><td>both levels store traverse</td><td>250</td><td>n/a</td><td>0.001</td><td>250</td></tr>
<tr><td>top-level quick sort double</td><td>250</td><td>0.001</td><td>0.000</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>250</td><td>0.009</td><td>0.008</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>250</td><td>0.001</td><td>0.001</td><td></td></tr>
@@ -449,7 +484,7 @@
<tr><td>sublevel 1 quick sort double</td><td>250</td><td>0.002</td><td>0.000</td><td></td></tr>
<tr><td>sublevel 1 quick sort string</td><td>250</td><td>0.015</td><td>0.012</td><td></td></tr>
-<tr><td> </td><td>500</td><td></td><td></td><td></td></tr>
+<tr><td> </td><td></td><td></td><td></td><td></td></tr>
<tr><td>top-level insert</td><td>500</td><td>0.002</td><td>0.002</td><td></td></tr>
<tr><td>top-level set</td><td>500</td><td>0.003</td><td>0.002</td><td></td></tr>
<tr><td>top-level remove</td><td>500</td><td>0.002</td><td>0.001</td><td></td></tr>
@@ -458,6 +493,8 @@
<tr><td>top-level iter search string</td><td>500</td><td>0.909</td><td>0.722</td><td>500</td></tr>
<tr><td>top-level linear search double</td><td>500</td><td>n/a</td><td>0.005</td><td>500</td></tr>
<tr><td>top-level linear search string</td><td>500</td><td>n/a</td><td>0.443</td><td>500</td></tr>
+<tr><td>both levels model foreach</td><td>500</td><td>0.077</td><td>0.076</td><td>500</td></tr>
+<tr><td>both levels store traverse</td><td>500</td><td>n/a</td><td>0.003</td><td>500</td></tr>
<tr><td>top-level quick sort double</td><td>500</td><td>0.003</td><td>0.001</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>500</td><td>0.022</td><td>0.018</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>500</td><td>0.002</td><td>0.002</td><td></td></tr>
@@ -476,6 +513,8 @@
<tr><td>top-level iter search string</td><td>1000</td><td>0.370</td><td>0.273</td><td>100</td></tr>
<tr><td>top-level linear search double</td><td>1000</td><td>n/a</td><td>0.002</td><td>100</td></tr>
<tr><td>top-level linear search string</td><td>1000</td><td>n/a</td><td>0.182</td><td>100</td></tr>
+<tr><td>both levels model foreach</td><td>1000</td><td>0.033</td><td>0.030</td><td>100</td></tr>
+<tr><td>both levels store traverse</td><td>1000</td><td>n/a</td><td>0.001</td><td>100</td></tr>
<tr><td>top-level quick sort double</td><td>1000</td><td>0.007</td><td>0.002</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>1000</td><td>0.050</td><td>0.040</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>1000</td><td>0.006</td><td>0.004</td><td></td></tr>
@@ -494,6 +533,8 @@
<tr><td>top-level iter search string</td><td>2500</td><td>2.273</td><td>1.859</td><td>250</td></tr>
<tr><td>top-level linear search double</td><td>2500</td><td>n/a</td><td>0.015</td><td>250</td></tr>
<tr><td>top-level linear search string</td><td>2500</td><td>n/a</td><td>1.137</td><td>250</td></tr>
+<tr><td>both levels model foreach</td><td>2500</td><td>0.182</td><td>0.188</td><td>250</td></tr>
+<tr><td>both levels store traverse</td><td>2500</td><td>n/a</td><td>0.009</td><td>250</td></tr>
<tr><td>top-level quick sort double</td><td>2500</td><td>0.021</td><td>0.004</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>2500</td><td>0.146</td><td>0.117</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>2500</td><td>0.035</td><td>0.014</td><td></td></tr>
@@ -512,6 +553,8 @@
<tr><td>top-level iter search string</td><td>5000</td><td>8.775</td><td>7.787</td><td>500</td></tr>
<tr><td>top-level linear search double</td><td>5000</td><td>n/a</td><td>0.060</td><td>500</td></tr>
<tr><td>top-level linear search string</td><td>5000</td><td>n/a</td><td>4.351</td><td>500</td></tr>
+<tr><td>both levels model foreach</td><td>5000</td><td>0.741</td><td>0.754</td><td>500</td></tr>
+<tr><td>both levels store traverse</td><td>5000</td><td>n/a</td><td>0.042</td><td>500</td></tr>
<tr><td>top-level quick sort double</td><td>5000</td><td>0.046</td><td>0.010</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>5000</td><td>0.325</td><td>0.264</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>5000</td><td>0.168</td><td>0.040</td><td></td></tr>
@@ -530,6 +573,8 @@
<tr><td>top-level iter search string</td><td>10000</td><td>37.555</td><td>31.020</td><td>1000</td></tr>
<tr><td>top-level linear search double</td><td>10000</td><td>n/a</td><td>0.304</td><td>1000</td></tr>
<tr><td>top-level linear search string</td><td>10000</td><td>n/a</td><td>18.896</td><td>1000</td></tr>
+<tr><td>both levels model foreach</td><td>10000</td><td>2.969</td><td>3.136</td><td>1000</td></tr>
+<tr><td>both levels store traverse</td><td>10000</td><td>n/a</td><td>0.238</td><td>1000</td></tr>
<tr><td>top-level quick sort double</td><td>10000</td><td>0.112</td><td>0.022</td><td></td></tr>
<tr><td>top-level quick sort string</td><td>10000</td><td>0.720</td><td>0.580</td><td></td></tr>
<tr><td>sublevel 1 insert</td><td>10000</td><td>1.152</td><td>0.132</td><td></td></tr>
@@ -647,7 +692,7 @@
<p>ScpTreeStore was initially written for the Scope plugin of Geany light IDE, which relies
heavily on stores.</p>
-<p><b>ScpTreeStore 0.83, Copyright (C) 2013 Dimitar Toshkov Zhekov</b></p>
+<p><b>ScpTreeStore 0.84, Copyright (C) 2013 Dimitar Toshkov Zhekov</b></p>
<p>ScpTreeStore is distributed under the terms of the GNU General Public License as published
by the Free Software Foundation; either version 2 of the License, or (at your option) any
Modified: scope/src/views.c
6 files changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -263,7 +263,7 @@ static void on_display_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell,
}
GtkTreeView *view_connect(const char *name, ScpTreeStore **store, GtkTreeSelection **selection,
- const TreeCell *cell_info, const char *window, GObject **display)
+ const TreeCell *cell_info, const char *window, GObject **display_cell)
{
guint i;
GtkScrolledWindow *scrolled = GTK_SCROLLED_WINDOW(get_widget(window));
@@ -284,11 +284,11 @@ GtkTreeView *view_connect(const char *name, ScpTreeStore **store, GtkTreeSelecti
g_signal_connect(cell, "editing-started", G_CALLBACK(on_editing_started),
hadjustment);
- if (display && i == 0)
+ if (display_cell && i == 0)
{
g_signal_connect(cell, "editing-started",
G_CALLBACK(on_display_editing_started), *store);
- *display = G_OBJECT(cell);
+ *display_cell = G_OBJECT(cell);
}
}
else
Modified: scope/src/views.h
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -64,7 +64,7 @@ enum
GtkTreeView *view_create(const char *name, ScpTreeStore **store, GtkTreeSelection **selection);
GtkTreeView *view_connect(const char *name, ScpTreeStore **store, GtkTreeSelection **selection,
- const TreeCell *cell_info, const char *window, GObject **display);
+ const TreeCell *cell_info, const char *window, GObject **display_cell);
/* note: 2 references to column */
#define view_set_sort_func(store, column, compare) \
scp_tree_store_set_sort_func((store), (column), (GtkTreeIterCompareFunc) (compare), \
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list