Commit dfdebb7c authored by Rusty Russell's avatar Rusty Russell

idtree: add examples, particularly the low-id-reuse example.

parent ce71acce
...@@ -7,6 +7,16 @@ ...@@ -7,6 +7,16 @@
* @mem_ctx: talloc parent to allocate from (may be NULL). * @mem_ctx: talloc parent to allocate from (may be NULL).
* *
* Allocate an empty id tree. You can free it with talloc_free(). * Allocate an empty id tree. You can free it with talloc_free().
*
* Example:
* #include <err.h>
*
* static struct idtree *ids;
*
* ...
* ids = idtree_new(NULL);
* if (!ids)
* err(1, "Failed to allocate idtree");
*/ */
struct idtree *idtree_new(void *mem_ctx); struct idtree *idtree_new(void *mem_ctx);
...@@ -17,6 +27,29 @@ struct idtree *idtree_new(void *mem_ctx); ...@@ -17,6 +27,29 @@ struct idtree *idtree_new(void *mem_ctx);
* @limit: the maximum id to allocate (ie. INT_MAX means no limit). * @limit: the maximum id to allocate (ie. INT_MAX means no limit).
* *
* This returns a non-negative id number, or -1 if all are taken. * This returns a non-negative id number, or -1 if all are taken.
*
* Example:
* struct foo {
* unsigned int id;
* ...
* };
*
* // Create a new foo, assigning an id.
* struct foo *new_foo(void)
* {
* int id;
* foo = malloc(sizeof(*foo));
* if (!foo)
* return NULL;
*
* id = idtree_add(ids, foo, INT_MAX);
* if (id < 0) {
* free(foo);
* return NULL;
* }
* foo->id = id;
* return foo;
* }
*/ */
int idtree_add(struct idtree *idtree, const void *ptr, int limit); int idtree_add(struct idtree *idtree, const void *ptr, int limit);
...@@ -27,7 +60,34 @@ int idtree_add(struct idtree *idtree, const void *ptr, int limit); ...@@ -27,7 +60,34 @@ int idtree_add(struct idtree *idtree, const void *ptr, int limit);
* @starting_id: the minimum id value to consider. * @starting_id: the minimum id value to consider.
* @limit: the maximum id to allocate (ie. INT_MAX means no limit). * @limit: the maximum id to allocate (ie. INT_MAX means no limit).
* *
* This returns a non-negative id number, or -1 if all are taken. * Example:
* static int last_id = -1;
* struct foo {
* unsigned int id;
* ...
* };
*
* // Create a new foo, assigning a consecutive id.
* // This maximizes the time before ids roll.
* struct foo *new_foo(void)
* {
* int id;
* foo = malloc(sizeof(*foo));
* if (!foo)
* return NULL;
*
* id = idtree_add_above(ids, foo, last_id+1, INT_MAX);
* if (id < 0) {
* id = idtree_add(ids, foo, INT_MAX);
* if (id < 0) {
* free(foo);
* return NULL;
* }
* }
* last_id = id;
* foo->id = id;
* return foo;
* }
*/ */
int idtree_add_above(struct idtree *idtree, const void *ptr, int idtree_add_above(struct idtree *idtree, const void *ptr,
int starting_id, int limit); int starting_id, int limit);
...@@ -39,6 +99,13 @@ int idtree_add_above(struct idtree *idtree, const void *ptr, ...@@ -39,6 +99,13 @@ int idtree_add_above(struct idtree *idtree, const void *ptr,
* *
* Returns NULL if the value is not found, otherwise the pointer value * Returns NULL if the value is not found, otherwise the pointer value
* set with the idtree_add()/idtree_add_above(). * set with the idtree_add()/idtree_add_above().
*
* Example:
* // Look up a foo for a given ID.
* struct foo *find_foo(unsigned int id)
* {
* return idtree_lookup(ids, id);
* }
*/ */
void *idtree_lookup(const struct idtree *idtree, int id); void *idtree_lookup(const struct idtree *idtree, int id);
...@@ -48,6 +115,17 @@ void *idtree_lookup(const struct idtree *idtree, int id); ...@@ -48,6 +115,17 @@ void *idtree_lookup(const struct idtree *idtree, int id);
* @id: the id to remove. * @id: the id to remove.
* *
* Returns false if the id was not in the tree. * Returns false if the id was not in the tree.
*
* Example:
* #include <assert.h>
*
* // Look up a foo for a given ID.
* void *free_foo(struct foo *foo)
* {
* bool exists = idtree_remove(ids, foo->id);
* assert(exists);
* free(foo);
* }
*/ */
bool idtree_remove(struct idtree *idtree, int id); bool idtree_remove(struct idtree *idtree, int id);
#endif /* CCAN_IDTREE_H */ #endif /* CCAN_IDTREE_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment