From: Junio C Hamano <gitster@pobox.com>
To: Jeremiah Mahler <jmmahler@gmail.com>
Cc: Eric Sunshine <sunshine@sunshineco.com>,
Michael Haggerty <mhagger@alum.mit.edu>,
git@vger.kernel.org
Subject: Re: [PATCH v3 1/2] add strbuf_set operations
Date: Thu, 12 Jun 2014 11:50:41 -0700 [thread overview]
Message-ID: <xmqqr42u55dq.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <f4d043b7c1e00f9c967faff39244274fe40fd371.1402557437.git.jmmahler@gmail.com> (Jeremiah Mahler's message of "Thu, 12 Jun 2014 00:29:33 -0700")
Jeremiah Mahler <jmmahler@gmail.com> writes:
> A common use case with strubfs is to set the buffer to a new value.
> This must be done in two steps: a reset followed by an add.
>
> strbuf_reset(buf);
> strbuf_add(buf, new_buf, len);
>
> In cases where the buffer is being built up in steps, these operations
> make sense and correctly convey what is being performed.
>
> strbuf_reset(buf);
> strbuf_add(buf, data1, len1);
> strbuf_add(buf, data2, len2);
> strbuf_add(buf, data3, len3);
>
> However, in other cases, it can be confusing and is not very concise.
>
> strbuf_reset(buf);
> strbuf_add(buf, default, len1);
>
> if (cond1) {
> strbuf_reset(buf);
> strbuf_add(buf, data2, len2);
> }
>
> if (cond2) {
> strbuf_reset(buf);
> strbuf_add(buf, data3, len3);
> }
>
> Add strbuf_set operations so that it can be re-written in a clear and
> concise way.
>
> strbuf_set(buf, default len1);
>
> if (cond1) {
> strbuf_set(buf, data2, len2);
> }
>
> if (cond2) {
> strbuf_set(buf, data3, len3);
> }
Or even more concisely without making unnecessary internal calls to
strbuf_reset():
strbuf_reset(buf);
if (cond2)
strbuf_add(buf, data3, len3);
else if (cond1)
strbuf_add(buf, data2, len2);
else
strbuf_add(buf, default, len2);
;-)
I am on the fence.
I have this suspicion that the addition of strbuf_set() would *only*
help when the original written with reset-and-then-add sequence was
suboptimal to begin with, and it helps *only* how the code reads,
without correcting the fact that it is still doing unnecessary
"first set to a value to be discarded and then reset to set the
right value", sweeping the issue under the rug.
Repeated reset-and-then-add on the same strbuf used to be something
that may indicate that the code is doing unnecessary work. Now,
repeated uses of strbuf_set on the same strbuf replaced that pattern
to be watched for to spot wasteful code paths.
I dunno...
> Signed-off-by: Jeremiah Mahler <jmmahler@gmail.com>
> ---
> Documentation/technical/api-strbuf.txt | 18 ++++++++++++++++++
> strbuf.c | 21 +++++++++++++++++++++
> strbuf.h | 13 +++++++++++++
> 3 files changed, 52 insertions(+)
>
> diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt
> index f9c06a7..ae9c9cc 100644
> --- a/Documentation/technical/api-strbuf.txt
> +++ b/Documentation/technical/api-strbuf.txt
> @@ -149,6 +149,24 @@ Functions
> than zero if the first buffer is found, respectively, to be less than,
> to match, or be greater than the second buffer.
>
> +* Setting the buffer
> +
> +`strbuf_set`::
> +
> + Replace content with data of a given length.
> +
> +`strbuf_setstr`::
> +
> + Replace content with data from a NUL-terminated string.
> +
> +`strbuf_setf`::
> +
> + Replace content with a formatted string.
> +
> +`strbuf_setbuf`::
> +
> + Replace content with data from another buffer.
> +
> * Adding data to the buffer
>
> NOTE: All of the functions in this section will grow the buffer as necessary.
> diff --git a/strbuf.c b/strbuf.c
> index ac62982..9d64b00 100644
> --- a/strbuf.c
> +++ b/strbuf.c
> @@ -189,6 +189,27 @@ void strbuf_splice(struct strbuf *sb, size_t pos, size_t len,
> strbuf_setlen(sb, sb->len + dlen - len);
> }
>
> +void strbuf_set(struct strbuf *sb, const void *data, size_t len)
> +{
> + strbuf_reset(sb);
> + strbuf_add(sb, data, len);
> +}
> +
> +void strbuf_setf(struct strbuf *sb, const char *fmt, ...)
> +{
> + va_list ap;
> + strbuf_reset(sb);
> + va_start(ap, fmt);
> + strbuf_vaddf(sb, fmt, ap);
> + va_end(ap);
> +}
> +
> +void strbuf_setbuf(struct strbuf *sb, const struct strbuf *sb2)
> +{
> + strbuf_reset(sb);
> + strbuf_add(sb, sb2->buf, sb2->len);
> +}
> +
> void strbuf_insert(struct strbuf *sb, size_t pos, const void *data, size_t len)
> {
> strbuf_splice(sb, pos, 0, data, len);
> diff --git a/strbuf.h b/strbuf.h
> index e9ad03e..5041c35 100644
> --- a/strbuf.h
> +++ b/strbuf.h
> @@ -101,6 +101,19 @@ static inline struct strbuf **strbuf_split(const struct strbuf *sb,
> */
> extern void strbuf_list_free(struct strbuf **);
>
> +/*----- set buffer to data -----*/
> +extern void strbuf_set(struct strbuf *sb, const void *data, size_t len);
> +
> +static inline void strbuf_setstr(struct strbuf *sb, const char *s)
> +{
> + strbuf_set(sb, s, strlen(s));
> +}
> +
> +__attribute__((format (printf,2,3)))
> +extern void strbuf_setf(struct strbuf *sb, const char *fmt, ...);
> +
> +extern void strbuf_setbuf(struct strbuf *sb, const struct strbuf *sb2);
> +
> /*----- add data in your buffer -----*/
> static inline void strbuf_addch(struct strbuf *sb, int c)
> {
next prev parent reply other threads:[~2014-06-12 18:50 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-12 7:29 [PATCH v3 0/2] add strbuf_set operations Jeremiah Mahler
2014-06-12 7:29 ` [PATCH v3 1/2] " Jeremiah Mahler
2014-06-12 8:11 ` Thomas Braun
2014-06-12 8:22 ` Jeremiah Mahler
2014-06-12 18:51 ` Junio C Hamano
2014-06-12 19:36 ` Jeremiah Mahler
2014-06-12 21:18 ` Eric Sunshine
2014-06-12 23:14 ` Jeremiah Mahler
2014-06-12 18:50 ` Junio C Hamano [this message]
2014-06-12 19:31 ` Jeremiah Mahler
2014-06-12 21:48 ` Eric Sunshine
2014-06-12 23:46 ` Jeremiah Mahler
2014-06-13 7:15 ` Jeff King
2014-06-14 4:49 ` Jeremiah Mahler
2014-06-12 7:29 ` [PATCH v3 2/2] builtin/remote: improve readability via strbuf_set() Jeremiah Mahler
2014-06-12 8:19 ` Eric Sunshine
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=xmqqr42u55dq.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=jmmahler@gmail.com \
--cc=mhagger@alum.mit.edu \
--cc=sunshine@sunshineco.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.