mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-09 12:25:48 +01:00
Merge branch 'list-store-equal-full' into 'main'
gio: Add g_list_store_find_with_equal_func_full() Closes #2447 See merge request GNOME/glib!2549
This commit is contained in:
commit
e2426dd74d
@ -4765,6 +4765,7 @@ g_list_store_splice
|
|||||||
g_list_store_sort
|
g_list_store_sort
|
||||||
g_list_store_find
|
g_list_store_find
|
||||||
g_list_store_find_with_equal_func
|
g_list_store_find_with_equal_func
|
||||||
|
g_list_store_find_with_equal_func_full
|
||||||
<SUBSECTION Standard>
|
<SUBSECTION Standard>
|
||||||
G_TYPE_LIST_STORE
|
G_TYPE_LIST_STORE
|
||||||
<SUBSECTION Private>
|
<SUBSECTION Private>
|
||||||
|
@ -2875,6 +2875,7 @@ g_hash_table_new_full
|
|||||||
g_hash_table_new_similar
|
g_hash_table_new_similar
|
||||||
GHashFunc
|
GHashFunc
|
||||||
GEqualFunc
|
GEqualFunc
|
||||||
|
GEqualFuncFull
|
||||||
g_hash_table_insert
|
g_hash_table_insert
|
||||||
g_hash_table_replace
|
g_hash_table_replace
|
||||||
g_hash_table_add
|
g_hash_table_add
|
||||||
|
@ -495,6 +495,14 @@ g_list_store_splice (GListStore *store,
|
|||||||
g_list_store_items_changed (store, position, n_removals, n_additions);
|
g_list_store_items_changed (store, position, n_removals, n_additions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
simple_equal (gconstpointer a,
|
||||||
|
gconstpointer b,
|
||||||
|
gpointer equal_func)
|
||||||
|
{
|
||||||
|
return ((GEqualFunc) equal_func) (a, b);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* g_list_store_find_with_equal_func:
|
* g_list_store_find_with_equal_func:
|
||||||
* @store: a #GListStore
|
* @store: a #GListStore
|
||||||
@ -503,7 +511,7 @@ g_list_store_splice (GListStore *store,
|
|||||||
* @position: (out) (optional): the first position of @item, if it was found.
|
* @position: (out) (optional): the first position of @item, if it was found.
|
||||||
*
|
*
|
||||||
* Looks up the given @item in the list store by looping over the items and
|
* Looks up the given @item in the list store by looping over the items and
|
||||||
* comparing them with @compare_func until the first occurrence of @item which
|
* comparing them with @equal_func until the first occurrence of @item which
|
||||||
* matches. If @item was not found, then @position will not be set, and this
|
* matches. If @item was not found, then @position will not be set, and this
|
||||||
* method will return %FALSE.
|
* method will return %FALSE.
|
||||||
*
|
*
|
||||||
@ -517,6 +525,35 @@ g_list_store_find_with_equal_func (GListStore *store,
|
|||||||
gpointer item,
|
gpointer item,
|
||||||
GEqualFunc equal_func,
|
GEqualFunc equal_func,
|
||||||
guint *position)
|
guint *position)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (equal_func != NULL, FALSE);
|
||||||
|
|
||||||
|
return g_list_store_find_with_equal_func_full (store, item, simple_equal,
|
||||||
|
equal_func, position);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* g_list_store_find_with_equal_func_full:
|
||||||
|
* @store: a #GListStore
|
||||||
|
* @item: (type GObject): an item
|
||||||
|
* @equal_func: (scope call): A custom equality check function
|
||||||
|
* @user_data: (closure): user data for @equal_func
|
||||||
|
* @position: (out) (optional): the first position of @item, if it was found.
|
||||||
|
*
|
||||||
|
* Like g_list_store_find_with_equal_func() but with an additional @user_data
|
||||||
|
* that is passed to @equal_func.
|
||||||
|
*
|
||||||
|
* Returns: Whether @store contains @item. If it was found, @position will be
|
||||||
|
* set to the position where @item occurred for the first time.
|
||||||
|
*
|
||||||
|
* Since: 2.74
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
g_list_store_find_with_equal_func_full (GListStore *store,
|
||||||
|
gpointer item,
|
||||||
|
GEqualFuncFull equal_func,
|
||||||
|
gpointer user_data,
|
||||||
|
guint *position)
|
||||||
{
|
{
|
||||||
GSequenceIter *iter, *begin, *end;
|
GSequenceIter *iter, *begin, *end;
|
||||||
|
|
||||||
@ -536,7 +573,7 @@ g_list_store_find_with_equal_func (GListStore *store,
|
|||||||
gpointer iter_item;
|
gpointer iter_item;
|
||||||
|
|
||||||
iter_item = g_sequence_get (iter);
|
iter_item = g_sequence_get (iter);
|
||||||
if (equal_func (iter_item, item))
|
if (equal_func (iter_item, item, user_data))
|
||||||
{
|
{
|
||||||
if (position)
|
if (position)
|
||||||
*position = g_sequence_iter_get_position (iter);
|
*position = g_sequence_iter_get_position (iter);
|
||||||
|
@ -83,6 +83,13 @@ gboolean g_list_store_find_with_equal_func (GListSt
|
|||||||
GEqualFunc equal_func,
|
GEqualFunc equal_func,
|
||||||
guint *position);
|
guint *position);
|
||||||
|
|
||||||
|
GLIB_AVAILABLE_IN_2_74
|
||||||
|
gboolean g_list_store_find_with_equal_func_full (GListStore *store,
|
||||||
|
gpointer item,
|
||||||
|
GEqualFuncFull equal_func,
|
||||||
|
gpointer user_data,
|
||||||
|
guint *position);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __G_LIST_STORE_H__ */
|
#endif /* __G_LIST_STORE_H__ */
|
||||||
|
@ -813,6 +813,18 @@ list_model_casecmp_action_by_name (gconstpointer a,
|
|||||||
g_action_get_name (G_ACTION (b))) == 0;
|
g_action_get_name (G_ACTION (b))) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
list_model_casecmp_action_by_name_full (gconstpointer a,
|
||||||
|
gconstpointer b,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
char buf[4];
|
||||||
|
const char *suffix = user_data;
|
||||||
|
|
||||||
|
g_snprintf (buf, sizeof buf, "%s%s", g_action_get_name (G_ACTION (b)), suffix);
|
||||||
|
return g_strcmp0 (g_action_get_name (G_ACTION (a)), buf) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Test if find() and find_with_equal_func() works */
|
/* Test if find() and find_with_equal_func() works */
|
||||||
static void
|
static void
|
||||||
test_store_find (void)
|
test_store_find (void)
|
||||||
@ -866,6 +878,17 @@ test_store_find (void)
|
|||||||
g_assert_cmpint (position, ==, 2);
|
g_assert_cmpint (position, ==, 2);
|
||||||
g_clear_object (&other_item);
|
g_clear_object (&other_item);
|
||||||
|
|
||||||
|
/* try to find element which should only work with custom equality check and string concat */
|
||||||
|
other_item = g_simple_action_new ("c", NULL);
|
||||||
|
g_assert_false (g_list_store_find (store, other_item, NULL));
|
||||||
|
g_assert_true (g_list_store_find_with_equal_func_full (store,
|
||||||
|
other_item,
|
||||||
|
list_model_casecmp_action_by_name_full,
|
||||||
|
"cc",
|
||||||
|
&position));
|
||||||
|
g_assert_cmpint (position, ==, 3);
|
||||||
|
g_clear_object (&other_item);
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (item_strs); i++)
|
for (i = 0; i < G_N_ELEMENTS (item_strs); i++)
|
||||||
g_clear_object(&items[i]);
|
g_clear_object(&items[i]);
|
||||||
g_clear_object (&store);
|
g_clear_object (&store);
|
||||||
|
@ -110,6 +110,27 @@ typedef gint (*GCompareDataFunc) (gconstpointer a,
|
|||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
typedef gboolean (*GEqualFunc) (gconstpointer a,
|
typedef gboolean (*GEqualFunc) (gconstpointer a,
|
||||||
gconstpointer b);
|
gconstpointer b);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GEqualFuncFull:
|
||||||
|
* @a: a value
|
||||||
|
* @b: a value to compare with
|
||||||
|
* @user_data: user data provided by the caller
|
||||||
|
*
|
||||||
|
* Specifies the type of a function used to test two values for
|
||||||
|
* equality. The function should return %TRUE if both values are equal
|
||||||
|
* and %FALSE otherwise.
|
||||||
|
*
|
||||||
|
* This is a version of #GEqualFunc which provides a @user_data closure from
|
||||||
|
* the caller.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @a = @b; %FALSE otherwise
|
||||||
|
* Since: 2.74
|
||||||
|
*/
|
||||||
|
typedef gboolean (*GEqualFuncFull) (gconstpointer a,
|
||||||
|
gconstpointer b,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
typedef void (*GDestroyNotify) (gpointer data);
|
typedef void (*GDestroyNotify) (gpointer data);
|
||||||
typedef void (*GFunc) (gpointer data,
|
typedef void (*GFunc) (gpointer data,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user