mirror of
https://github.com/git/git.git
synced 2026-03-26 10:53:27 +01:00
The interface `cb_each()` iterates through a crit-bit tree and calls a specific callback function for each of the contained items. The callback function is expected to return either: - `CB_CONTINUE` in case iteration shall continue. - `CB_BREAK` to abort iteration. This is needlessly restrictive though, as callers may want to return arbitrary values and have them be bubbled up to the `cb_each()` call site. In fact, this is a rather common pattern we have: whenever such a callback function returns a non-zero error code, we abort iteration and bubble up the code as-is. Refactor both the crit-bit tree and oidtree subsystems to behave accordingly. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
57 lines
1.7 KiB
C
57 lines
1.7 KiB
C
#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 */
|