diff options
author | Stef Walter <stefw@collabora.co.uk> | 2011-11-03 14:32:31 +0100 |
---|---|---|
committer | Stef Walter <stefw@collabora.co.uk> | 2011-11-03 14:32:31 +0100 |
commit | 8667b2f7756b42a570ef1328d3f4658da7dffb3f (patch) | |
tree | fabd99ecf4349aa85de7dec80e4ef56bb73943b7 | |
parent | 468414442f0c4a785fcf784752cae8a1e44323c9 (diff) | |
download | gcr-8667b2f7756b42a570ef1328d3f4658da7dffb3f.tar.gz |
gck: Add gck_attribute_hash and cleanup for use in hash table
* Add gck_attribute_hash() so GckAttribute can be used as a
hash table key.
* Change gck_attribute_free() and gck_attribute_equal() to use
pointers so they can be used as GEqualFunc and GDestroyNotify
without casting
-rw-r--r-- | docs/reference/gck/gck-sections.txt | 1 | ||||
-rw-r--r-- | gck/gck-attributes.c | 47 | ||||
-rw-r--r-- | gck/gck.h | 8 |
3 files changed, 42 insertions, 14 deletions
diff --git a/docs/reference/gck/gck-sections.txt b/docs/reference/gck/gck-sections.txt index da8cab5..266d286 100644 --- a/docs/reference/gck/gck-sections.txt +++ b/docs/reference/gck/gck-sections.txt @@ -26,6 +26,7 @@ gck_attribute_clear gck_attribute_free gck_attribute_dump gck_attribute_equal +gck_attribute_hash <SUBSECTION Private> GCK_TYPE_ATTRIBUTE gck_attribute_get_type diff --git a/gck/gck-attributes.c b/gck/gck-attributes.c index cb48ca1..6f3b2ec 100644 --- a/gck/gck-attributes.c +++ b/gck/gck-attributes.c @@ -641,39 +641,41 @@ gck_attribute_clear (GckAttribute *attr) /** * gck_attribute_free: - * @attr: Attribute to free. + * @attr: (type Gck.Attribute): attribute to free * * Free an attribute and its allocated memory. These is usually * used with attributes that are allocated by gck_attribute_new() * or a similar function. **/ void -gck_attribute_free (GckAttribute *attr) +gck_attribute_free (gpointer attr) { + GckAttribute *a = attr; if (attr) { - attribute_clear (attr, g_realloc); - g_slice_free (GckAttribute, attr); + attribute_clear (a, g_realloc); + g_slice_free (GckAttribute, a); } } /** * gck_attribute_equal: - * @a: (type Gck.Attribute): first attribute to compare - * @b: (type Gck.Attribute): second attribute to compare + * @attr1: (type Gck.Attribute): first attribute to compare + * @attr2: (type Gck.Attribute): second attribute to compare * * Compare two attributes. Useful with <code>GHashTable</code>. * * Returns: %TRUE if the attributes are equal. */ gboolean -gck_attribute_equal (gconstpointer a, gconstpointer b) +gck_attribute_equal (gconstpointer attr1, + gconstpointer attr2) { - const GckAttribute *aa = a; - const GckAttribute *ab = b; + const GckAttribute *aa = attr1; + const GckAttribute *ab = attr2; - if (!a && !b) + if (!aa && !ab) return TRUE; - if (!a || !b) + if (!aa || !ab) return FALSE; if (aa->type != ab->type) @@ -688,6 +690,29 @@ gck_attribute_equal (gconstpointer a, gconstpointer b) } /** + * gck_attribute_hash: + * @attr: (type Gck.Attribute): attribute to hash + * + * Hash an attribute for use in <code>GHashTable</code> keys. + * + * Returns: the hash code + */ +guint +gck_attribute_hash (gconstpointer attr) +{ + const GckAttribute *a = attr; + const signed char *p, *e; + guint32 h = 5381; + + h ^= _gck_ulong_hash (&a->type); + + for (p = (signed char *)a->value, e = p + a->length; p != e; p++) + h = (h << 5) + h + *p; + + return h; +} + +/** * SECTION:gck-attributes * @title: GckAttributes * @short_description: A set of PKCS11 attributes. @@ -174,14 +174,16 @@ gchar* gck_attribute_get_string (GckAttribute *attr) void gck_attribute_get_date (GckAttribute *attr, GDate* value); -gboolean gck_attribute_equal (gconstpointer a, - gconstpointer b); +gboolean gck_attribute_equal (gconstpointer attr1, + gconstpointer attr2); + +guint gck_attribute_hash (gconstpointer attr); GckAttribute* gck_attribute_dup (GckAttribute *attr); void gck_attribute_clear (GckAttribute *attr); -void gck_attribute_free (GckAttribute *attr); +void gck_attribute_free (gpointer attr); void gck_attribute_dump (GckAttribute *attr); |