From: Michael Haggerty <mhagger@alum.mit.edu>
To: Junio C Hamano <gitster@pobox.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/4] Add a new function, filter_string_list()
Date: Mon, 10 Sep 2012 10:58:29 +0200 [thread overview]
Message-ID: <504DABB5.7090401@alum.mit.edu> (raw)
In-Reply-To: <7vk3w3sfe9.fsf@alter.siamese.dyndns.org>
On 09/09/2012 11:40 AM, Junio C Hamano wrote:
> Michael Haggerty <mhagger@alum.mit.edu> writes:
>
>> Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
>> ---
>> Documentation/technical/api-string-list.txt | 8 ++++++++
>> string-list.c | 17 +++++++++++++++++
>> string-list.h | 9 +++++++++
>> 3 files changed, 34 insertions(+)
>>
>> diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt
>> index 3b959a2..15b8072 100644
>> --- a/Documentation/technical/api-string-list.txt
>> +++ b/Documentation/technical/api-string-list.txt
>> @@ -60,6 +60,14 @@ Functions
>>
>> * General ones (works with sorted and unsorted lists as well)
>>
>> +`filter_string_list`::
>> +
>> + Apply a function to each item in a list, retaining only the
>> + items for which the function returns true. If free_util is
>> + true, call free() on the util members of any items that have
>> + to be deleted. Preserve the order of the items that are
>> + retained.
>
> In other words, this can safely be used on both sorted and unsorted
> string list. Good.
Preserving order (while retaining performance) is the main reason for
this function. Otherwise, unsorted_string_list_delete_item() could be
used in a loop.
>> `print_string_list`::
>>
>> Dump a string_list to stdout, useful mainly for debugging purposes. It
>> diff --git a/string-list.c b/string-list.c
>> index 110449c..72610ce 100644
>> --- a/string-list.c
>> +++ b/string-list.c
>> @@ -102,6 +102,23 @@ int for_each_string_list(struct string_list *list,
>> return ret;
>> }
>>
>> +void filter_string_list(struct string_list *list, int free_util,
>> + string_list_each_func_t fn, void *cb_data)
>> +{
>> + int src, dst = 0;
>> + for (src = 0; src < list->nr; src++) {
>> + if (fn(&list->items[src], cb_data)) {
>> + list->items[dst++] = list->items[src];
>> + } else {
>> + if (list->strdup_strings)
>> + free(list->items[src].string);
>> + if (free_util)
>> + free(list->items[src].util);
>> + }
>> + }
>> + list->nr = dst;
>> +}
>> +
>> void string_list_clear(struct string_list *list, int free_util)
>> {
>> if (list->items) {
>> diff --git a/string-list.h b/string-list.h
>> index 7e51d03..84996aa 100644
>> --- a/string-list.h
>> +++ b/string-list.h
>> @@ -29,6 +29,15 @@ int for_each_string_list(struct string_list *list,
>> #define for_each_string_list_item(item,list) \
>> for (item = (list)->items; item < (list)->items + (list)->nr; ++item)
>>
>> +/*
>> + * Apply fn to each item in list, retaining only the ones for which
>> + * the function returns true. If free_util is true, call free() on
>> + * the util members of any items that have to be deleted. Preserve
>> + * the order of the items that are retained.
>> + */
>> +void filter_string_list(struct string_list *list, int free_util,
>> + string_list_each_func_t fn, void *cb_data);
>> +
>> /* Use these functions only on sorted lists: */
>> int string_list_has_string(const struct string_list *list, const char *string);
>> int string_list_find_insert_index(const struct string_list *list, const char *string,
>
> Having seen that the previous patch introduced a new test helper for
> unit testing (which is a very good idea) and dedicated a new test
> number, I would have expected to see a new test for filtering
> here.
I thought that the code was too trivial to warrant a test, especially
considering that the memory handling aspect of the function can't be
tested very well. But you've correctly shamed me into adding tests for
this and also for patch 3/4, string_list_remove_duplicates().
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
next prev parent reply other threads:[~2012-09-10 8:59 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-09 5:53 [PATCH 0/4] Add some string_list-related functions Michael Haggerty
2012-09-09 5:53 ` [PATCH 1/4] Add a new function, string_list_split_in_place() Michael Haggerty
2012-09-09 9:35 ` Junio C Hamano
2012-09-10 4:45 ` Michael Haggerty
2012-09-10 5:47 ` Junio C Hamano
2012-09-10 11:48 ` Michael Haggerty
2012-09-10 16:09 ` Junio C Hamano
2012-09-09 5:53 ` [PATCH 2/4] Add a new function, filter_string_list() Michael Haggerty
2012-09-09 9:40 ` Junio C Hamano
2012-09-10 8:58 ` Michael Haggerty [this message]
2012-09-09 5:53 ` [PATCH 3/4] Add a new function, string_list_remove_duplicates() Michael Haggerty
2012-09-09 9:45 ` Junio C Hamano
2012-09-10 9:15 ` Michael Haggerty
2012-09-09 5:53 ` [PATCH 4/4] Add a function string_list_longest_prefix() Michael Haggerty
2012-09-09 9:54 ` Junio C Hamano
2012-09-10 10:01 ` Michael Haggerty
2012-09-10 16:24 ` Junio C Hamano
2012-09-10 16:33 ` Jeff King
2012-09-10 17:48 ` Andreas Ericsson
2012-09-10 19:21 ` Using doxygen (or something similar) to generate API docs [was [PATCH 4/4] Add a function string_list_longest_prefix()] Michael Haggerty
2012-09-10 21:56 ` Jeff King
2012-09-10 22:09 ` Michael Haggerty
2012-09-11 1:01 ` Andreas Ericsson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=504DABB5.7090401@alum.mit.edu \
--to=mhagger@alum.mit.edu \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.