<!-- ##### SECTION Title ##### -->
Caches

<!-- ##### SECTION Short_Description ##### -->
caches allow sharing of complex data structures to save resources.

<!-- ##### SECTION Long_Description ##### -->
<para>
A #GCache allows sharing of complex data structures, in order to save
system resources.
</para>
<para>
GTK+ uses caches for #GtkStyles and #GdkGCs. These consume a lot of
resources, so a #GCache is used to see if a #GtkStyle or #GdkGC with the
required properties already exists. If it does, then the existing
object is used instead of creating a new one.
</para>
<para>
#GCache uses keys and values.
A #GCache key describes the properties of a particular resource.
A #GCache value is the actual resource.
</para>

<!-- ##### SECTION See_Also ##### -->
<para>

</para>

<!-- ##### STRUCT GCache ##### -->
<para>
The #GCache struct is an opaque data structure containing information about
a #GCache. It should only be accessed via the following functions.
</para>


<!-- ##### FUNCTION g_cache_new ##### -->
<para>
Creates a new #GCache.
</para>

@value_new_func: a function to create a new object given a key.
This is called by g_cache_insert() if an object with the given key
does not already exist.
@value_destroy_func: a function to destroy an object. It is
called by g_cache_remove() when the object is no longer needed (i.e. its
reference count drops to 0).
@key_dup_func: a function to copy a key. It is called by
g_cache_insert() if the key does not already exist in the #GCache.
@key_destroy_func: a function to destroy a key. It is
called by g_cache_remove() when the object is no longer needed (i.e. its
reference count drops to 0).
@hash_key_func: a function to create a hash value from a key.
@hash_value_func: a function to create a hash value from a value.
@key_equal_func: a function to compare two keys. It should return %TRUE if
the two keys are equivalent.
@Returns: a new #GCache.


<!-- ##### FUNCTION g_cache_insert ##### -->
<para>
Gets the value corresponding to the given key, creating it if necessary.
It first checks if the value already exists in the #GCache, by using
the @key_equal_func function passed to g_cache_new().
If it does already exist it is returned, and its reference count is increased
by one.
If the value does not currently exist, if is created by calling the
@value_new_func. The key is duplicated by calling
@key_dup_func and the duplicated key and value are inserted
into the #GCache.
</para>

@cache: a #GCache.
@key: a key describing a #GCache object.
@Returns: a pointer to a #GCache value.


<!-- ##### FUNCTION g_cache_remove ##### -->
<para>
Decreases the reference count of the given value.
If it drops to 0 then the value and its corresponding key are destroyed,
using the @value_destroy_func and @key_destroy_func passed to g_cache_new().
</para>

@cache: a #GCache.
@value: the value to remove.


<!-- ##### FUNCTION g_cache_destroy ##### -->
<para>
Frees the memory allocated for the #GCache.
</para>
<para>
Note that it does not destroy the keys and values which were contained in the
#GCache.
</para>

@cache: a #GCache.


<!-- ##### FUNCTION g_cache_key_foreach ##### -->
<para>
Calls the given function for each of the keys in the #GCache.
</para>

@cache: a #GCache.
@func: the function to call with each #GCache key.
@user_data: user data to pass to the function.


<!-- ##### FUNCTION g_cache_value_foreach ##### -->
<para>
Calls the given function for each of the values in the #GCache.
</para>

@cache: a #GCache.
@func: the function to call with each #GCache value.
@user_data: user data to pass to the function.


<!-- ##### USER_FUNCTION GCacheDestroyFunc ##### -->
<para>
Specifies the type of the @value_destroy_func and @key_destroy_func functions
passed to g_cache_new().
The functions are passed a pointer to the #GCache key or #GCache value and
should free any memory and other resources associated with it.
</para>

@value: the #GCache value to destroy.


<!-- ##### USER_FUNCTION GCacheDupFunc ##### -->
<para>
Specifies the type of the @key_dup_func function passed to g_cache_new().
The function is passed a key (<emphasis>not</emphasis> a value as the prototype implies) and
should return a duplicate of the key.
</para>

@value: the #GCache key to destroy (<emphasis>not</emphasis> a #GCache value as it seems).
@Returns: a copy of the #GCache key.


<!-- ##### USER_FUNCTION GCacheNewFunc ##### -->
<para>
Specifies the type of the @value_new_func function passed to g_cache_new().
It is passed a #GCache key and should create the value corresponding to the
key.
</para>

@key: a #GCache key.
@Returns: a new #GCache value corresponding to the key.


