Add new nl_cache_clone() function.

The function can be used to make a copy of an existing cache. It is very
similar to nl_cache_subset() except that it allows no filtering but
copies every object.

Signed-off-by: Thierry Reding <thierry.reding@avionic-design.de>
Signed-off-by: Thomas Graf <tgraf@redhat.com>
This commit is contained in:
Thierry Reding 2012-02-16 12:57:42 +01:00 committed by Thomas Graf
parent a17970b974
commit 0b40364150
2 changed files with 31 additions and 0 deletions

View file

@ -44,6 +44,7 @@ extern int nl_cache_alloc_name(const char *,
struct nl_cache **);
extern struct nl_cache * nl_cache_subset(struct nl_cache *,
struct nl_object *);
extern struct nl_cache * nl_cache_clone(struct nl_cache *);
extern void nl_cache_clear(struct nl_cache *);
extern void nl_cache_free(struct nl_cache *);

View file

@ -287,6 +287,36 @@ struct nl_cache *nl_cache_subset(struct nl_cache *orig,
return cache;
}
/**
* Allocate new cache and copy the contents of an existing cache
* @arg cache Original cache to base new cache on
*
* Allocates a new cache matching the type of the cache specified by
* \p cache. Iterates over the \p cache cache and copies all objects
* to the new cache.
*
* The copied objects are clones but do not contain a reference to each
* other. Later modifications to objects in the original cache will
* not affect objects in the new cache.
*
* @return A newly allocated cache or NULL.
*/
struct nl_cache *nl_cache_clone(struct nl_cache *cache)
{
struct nl_cache_ops *ops = nl_cache_get_ops(cache);
struct nl_cache *clone;
struct nl_object *obj;
clone = nl_cache_alloc(ops);
if (!clone)
return NULL;
nl_list_for_each_entry(obj, &cache->c_items, ce_list)
nl_cache_add(clone, obj);
return clone;
}
/**
* Remove all objects of a cache.
* @arg cache Cache to clear