get_short_oid: sort ambiguous objects by type, then SHA-1
[git.git] / Documentation / technical / api-oid-array.txt
blob9febfb1d528b2764d6d603ea25eae0ac6b048f68
1 oid-array API
2 ==============
4 The oid-array API provides storage and manipulation of sets of object
5 identifiers. The emphasis is on storage and processing efficiency,
6 making them suitable for large lists. Note that the ordering of items is
7 not preserved over some operations.
9 Data Structures
10 ---------------
12 `struct oid_array`::
14         A single array of object IDs. This should be initialized by
15         assignment from `OID_ARRAY_INIT`.  The `oid` member contains
16         the actual data. The `nr` member contains the number of items in
17         the set.  The `alloc` and `sorted` members are used internally,
18         and should not be needed by API callers.
20 Functions
21 ---------
23 `oid_array_append`::
24         Add an item to the set. The object ID will be placed at the end of
25         the array (but note that some operations below may lose this
26         ordering).
28 `oid_array_lookup`::
29         Perform a binary search of the array for a specific object ID.
30         If found, returns the offset (in number of elements) of the
31         object ID. If not found, returns a negative integer. If the array
32         is not sorted, this function has the side effect of sorting it.
34 `oid_array_clear`::
35         Free all memory associated with the array and return it to the
36         initial, empty state.
38 `oid_array_for_each`::
39         Iterate over each element of the list, executing the callback
40         function for each one. Does not sort the list, so any custom
41         hash order is retained. If the callback returns a non-zero
42         value, the iteration ends immediately and the callback's
43         return is propagated; otherwise, 0 is returned.
45 `oid_array_for_each_unique`::
46         Iterate over each unique element of the list in sorted order,
47         but otherwise behave like `oid_array_for_each`. If the array
48         is not sorted, this function has the side effect of sorting
49         it.
51 Examples
52 --------
54 -----------------------------------------
55 int print_callback(const struct object_id *oid,
56                     void *data)
58         printf("%s\n", oid_to_hex(oid));
59         return 0; /* always continue */
62 void some_func(void)
64         struct sha1_array hashes = OID_ARRAY_INIT;
65         struct object_id oid;
67         /* Read objects into our set */
68         while (read_object_from_stdin(oid.hash))
69                 oid_array_append(&hashes, &oid);
71         /* Check if some objects are in our set */
72         while (read_object_from_stdin(oid.hash)) {
73                 if (oid_array_lookup(&hashes, &oid) >= 0)
74                         printf("it's in there!\n");
76         /*
77          * Print the unique set of objects. We could also have
78          * avoided adding duplicate objects in the first place,
79          * but we would end up re-sorting the array repeatedly.
80          * Instead, this will sort once and then skip duplicates
81          * in linear time.
82          */
83         oid_array_for_each_unique(&hashes, print_callback, NULL);
85 -----------------------------------------