diff options
author | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-12-07 16:31:40 +0000 |
---|---|---|
committer | Simon McVittie <simon.mcvittie@collabora.co.uk> | 2010-12-17 10:55:03 +0000 |
commit | 173c5201aad8ca3fe733a992d74fdcff6101f09a (patch) | |
tree | 0d009abf8462e4c843688a339782d6aaf399f250 /telepathy-glib/intset.c | |
parent | bf9e9716394c406f754c8a952682ce6eb278ee71 (diff) | |
download | telepathy-glib-173c5201aad8ca3fe733a992d74fdcff6101f09a.tar.gz |
TpIntset: factor out tp_intset_union_update, tp_intset_difference_update
Diffstat (limited to 'telepathy-glib/intset.c')
-rw-r--r-- | telepathy-glib/intset.c | 69 |
1 files changed, 50 insertions, 19 deletions
diff --git a/telepathy-glib/intset.c b/telepathy-glib/intset.c index 96dc76b34..86369f6c9 100644 --- a/telepathy-glib/intset.c +++ b/telepathy-glib/intset.c @@ -624,7 +624,6 @@ tp_intset_intersection (const TpIntset *left, const TpIntset *right) return ret; } - /** * tp_intset_union: * @left: The left operand @@ -640,27 +639,43 @@ tp_intset_intersection (const TpIntset *left, const TpIntset *right) TpIntset * tp_intset_union (const TpIntset *left, const TpIntset *right) { - gpointer key, value; - GHashTableIter iter; TpIntset *ret; ret = tp_intset_copy (left); + tp_intset_union_update (ret, right); - g_hash_table_iter_init (&iter, (GHashTable *) right->table); + return ret; +} + +/** + * tp_intset_union_update: + * @self: the set to change + * @other: members to add + * + * Add each integer in @other to @self, analogous to the bitwise operation + * self |= other. + * + * Since: 0.13.UNRELEASED + */ +void +tp_intset_union_update (TpIntset *self, + const TpIntset *other) +{ + gpointer key, value; + GHashTableIter iter; + + g_hash_table_iter_init (&iter, (GHashTable *) other->table); while (g_hash_table_iter_next (&iter, &key, &value)) { gsize v = GPOINTER_TO_SIZE (value); - intset_update_largest_ever (ret, key); - v |= GPOINTER_TO_SIZE (g_hash_table_lookup (ret->table, key)); - g_hash_table_insert (ret->table, key, GSIZE_TO_POINTER (v)); + intset_update_largest_ever (self, key); + v |= GPOINTER_TO_SIZE (g_hash_table_lookup (self->table, key)); + g_hash_table_insert (self->table, key, GSIZE_TO_POINTER (v)); } - - return ret; } - /** * tp_intset_difference: * @left: The left operand @@ -677,33 +692,49 @@ TpIntset * tp_intset_difference (const TpIntset *left, const TpIntset *right) { TpIntset *ret; - gpointer key, value; - GHashTableIter iter; g_return_val_if_fail (left != NULL, NULL); g_return_val_if_fail (right != NULL, NULL); ret = tp_intset_copy (left); + tp_intset_difference_update (ret, right); - g_hash_table_iter_init (&iter, (GHashTable *) right->table); + return ret; +} + +/** + * tp_intset_difference_update: + * @self: the set to change + * @other: members to remove + * + * Remove each integer in @other from @self, analogous to the bitwise + * operation self &= (~other). + * + * Since: 0.13.UNRELEASED + */ +void +tp_intset_difference_update (TpIntset *self, + const TpIntset *other) +{ + gpointer key, value; + GHashTableIter iter; + + g_hash_table_iter_init (&iter, (GHashTable *) other->table); while (g_hash_table_iter_next (&iter, &key, &value)) { gsize v = GPOINTER_TO_SIZE (value); - v = (GPOINTER_TO_SIZE (g_hash_table_lookup (ret->table, key))) & ~v; + v = (GPOINTER_TO_SIZE (g_hash_table_lookup (self->table, key))) & ~v; /* No need to update largest_ever here - we're only deleting members. */ if (v == 0) - g_hash_table_remove (ret->table, key); + g_hash_table_remove (self->table, key); else - g_hash_table_insert (ret->table, key, GSIZE_TO_POINTER (v)); + g_hash_table_insert (self->table, key, GSIZE_TO_POINTER (v)); } - - return ret; } - /** * tp_intset_symmetric_difference: * @left: The left operand |