On Sun, Jan 27, 2019 at 11:41:22AM -0800, sxenos@xxxxxxxxxx wrote: > From: Stefan Xenos <sxenos@xxxxxxxxx> > > Implement a "readonly_contains" function for oid_array that won't > sort the array if it is unsorted. This can be used to test containment in > the rare situations where the array order matters. > > The function has intentionally been given a name that is more cumbersome > than the "lookup" function, which is what most callers will will want > in most situations. > > Signed-off-by: Stefan Xenos <sxenos@xxxxxxxxxx> > --- > sha1-array.c | 15 +++++++++++++++ > sha1-array.h | 2 ++ > t/helper/test-sha1-array.c | 6 ++++++ > t/t0064-sha1-array.sh | 22 ++++++++++++++++++++++ > 4 files changed, 45 insertions(+) > > diff --git a/sha1-array.c b/sha1-array.c > index b94e0ec0f5..071fce7e90 100644 > --- a/sha1-array.c > +++ b/sha1-array.c > @@ -26,6 +26,21 @@ static const unsigned char *sha1_access(size_t index, void *table) > return array[index].hash; > } > > +int oid_array_readonly_contains(const struct oid_array* array, > + const struct object_id* oid) > +{ > + int i; > + if (array->sorted) { > + return sha1_pos(oid->hash, array->oid, array->nr, sha1_access) >= 0; > + } Style nit: unnecessary braces. According to CodingGuidelines we tend not to use braces when the body of a loop or if statement is only a single line. > + for (i = 0; i < array->nr; i++) { > + if (hashcmp(array->oid[i].hash, oid->hash) == 0) { Please use oideq() instead. > + return 1; > + } > + } > + return 0; > +} > + > int oid_array_lookup(struct oid_array *array, const struct object_id *oid) > { > if (!array->sorted) > diff --git a/t/t0064-sha1-array.sh b/t/t0064-sha1-array.sh > index 5dda570b9a..c1bac6fcdd 100755 > --- a/t/t0064-sha1-array.sh > +++ b/t/t0064-sha1-array.sh > @@ -32,6 +32,28 @@ test_expect_success 'ordered enumeration with duplicate suppression' ' > test_cmp expect actual > ' > > +test_expect_success 'readonly_contains finds existing' ' > + echo 1 > expect && > + echoid "" 88 44 aa 55 >> expect && Style nit: not space between redirection operator and filename. > + { > + echoid append 88 44 aa 55 && > + echoid readonly_contains 55 && > + echo for_each > + } | test-tool sha1-array >actual && > + test_cmp expect actual > +' > + > +test_expect_success 'readonly_contains non-existing query' ' > + echo 0 > expect && > + echoid "" 88 44 aa 55 >> expect && > + { > + echoid append 88 44 aa 55 && > + echoid readonly_contains 33 && > + echo for_each > + } | test-tool sha1-array >actual && > + test_cmp expect actual > +' > + > test_expect_success 'lookup' ' > { > echoid append 88 44 aa 55 && > -- > 2.20.1.495.gaa96b0ce6b-goog >