blob: 2b7bad2e60a51d4910e8773d4e28d32f99df1c40 [file] [log] [blame]
#ifndef OIDTREE_H
#define OIDTREE_H
#include "cbtree.h"
#include "hash.h"
#include "mem-pool.h"
/*
* OID trees are an efficient storage for object IDs that use a critbit tree
* internally. Common prefixes are duplicated and object IDs are stored in a
* way that allow easy iteration over the objects in lexicographic order. As a
* consequence, operations that want to enumerate all object IDs that match a
* given prefix can be answered efficiently.
*
* Note that it is not (yet) possible to store data other than the object IDs
* themselves in this tree.
*/
struct oidtree {
struct cb_tree tree;
struct mem_pool mem_pool;
};
/* Initialize the oidtree so that it is ready for use. */
void oidtree_init(struct oidtree *ot);
/*
* Release all memory associated with the oidtree and reinitialize it for
* subsequent use.
*/
void oidtree_clear(struct oidtree *ot);
/* Insert the object ID into the tree. */
void oidtree_insert(struct oidtree *ot, const struct object_id *oid);
/* Check whether the tree contains the given object ID. */
bool oidtree_contains(struct oidtree *ot, const struct object_id *oid);
/*
* Callback function used for `oidtree_each()`. Returning a non-zero exit code
* will cause iteration to stop. The exit code will be propagated to the caller
* of `oidtree_each()`.
*/
typedef int (*oidtree_each_cb)(const struct object_id *oid,
void *cb_data);
/*
* Iterate through all object IDs in the tree whose prefix matches the given
* object ID prefix and invoke the callback function on each of them.
*
* Returns any non-zero exit code from the provided callback function.
*/
int oidtree_each(struct oidtree *ot,
const struct object_id *prefix, size_t prefix_hex_len,
oidtree_each_cb cb, void *cb_data);
#endif /* OIDTREE_H */