qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Markus Armbruster <armbru@redhat.com>
To: qemu-devel@nongnu.org
Cc: mdroth@linux.vnet.ibm.com
Subject: [PATCH 20/20] qobject: Make QString immutable
Date: Fri, 11 Dec 2020 18:11:52 +0100	[thread overview]
Message-ID: <20201211171152.146877-21-armbru@redhat.com> (raw)
In-Reply-To: <20201211171152.146877-1-armbru@redhat.com>

The functions to modify a QString's string are all unused now.  Drop
them, and make the string immutable.  Saves 16 bytes per QString on my
system.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 include/qapi/qmp/qstring.h |  8 +----
 qobject/qstring.c          | 65 ++------------------------------------
 tests/check-qobject.c      |  3 +-
 tests/check-qstring.c      | 16 ----------
 4 files changed, 4 insertions(+), 88 deletions(-)

diff --git a/include/qapi/qmp/qstring.h b/include/qapi/qmp/qstring.h
index 53567db6c0..1d8ba46936 100644
--- a/include/qapi/qmp/qstring.h
+++ b/include/qapi/qmp/qstring.h
@@ -17,19 +17,13 @@
 
 struct QString {
     struct QObjectBase_ base;
-    char *string;
-    size_t length;
-    size_t capacity;
+    const char *string;
 };
 
 QString *qstring_new(void);
 QString *qstring_from_str(const char *str);
 QString *qstring_from_substr(const char *str, size_t start, size_t end);
 QString *qstring_from_gstring(GString *gstr);
-size_t qstring_get_length(const QString *qstring);
 const char *qstring_get_str(const QString *qstring);
-void qstring_append_int(QString *qstring, int64_t value);
-void qstring_append(QString *qstring, const char *str);
-void qstring_append_chr(QString *qstring, int c);
 
 #endif /* QSTRING_H */
diff --git a/qobject/qstring.c b/qobject/qstring.c
index ea86d80cf0..b4613899b9 100644
--- a/qobject/qstring.c
+++ b/qobject/qstring.c
@@ -24,14 +24,6 @@ QString *qstring_new(void)
     return qstring_from_str("");
 }
 
-/**
- * qstring_get_length(): Get the length of a QString
- */
-size_t qstring_get_length(const QString *qstring)
-{
-    return qstring->length;
-}
-
 /**
  * qstring_from_substr(): Create a new QString from a C string substring
  *
@@ -42,18 +34,9 @@ QString *qstring_from_substr(const char *str, size_t start, size_t end)
     QString *qstring;
 
     assert(start <= end);
-
     qstring = g_malloc(sizeof(*qstring));
     qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
-
-    qstring->length = end - start;
-    qstring->capacity = qstring->length;
-
-    assert(qstring->capacity < SIZE_MAX);
-    qstring->string = g_malloc(qstring->capacity + 1);
-    memcpy(qstring->string, str + start, qstring->length);
-    qstring->string[qstring->length] = 0;
-
+    qstring->string = g_strndup(str + start, end - start);
     return qstring;
 }
 
@@ -79,55 +62,11 @@ QString *qstring_from_gstring(GString *gstr)
 
     qstring = g_malloc(sizeof(*qstring));
     qobject_init(QOBJECT(qstring), QTYPE_QSTRING);
-    qstring->length = gstr->len;
-    qstring->capacity = gstr->allocated_len;
     qstring->string = g_string_free(gstr, false);
     return qstring;
 }
 
 
-static void capacity_increase(QString *qstring, size_t len)
-{
-    if (qstring->capacity < (qstring->length + len)) {
-        assert(len <= SIZE_MAX - qstring->capacity);
-        qstring->capacity += len;
-        assert(qstring->capacity <= SIZE_MAX / 2);
-        qstring->capacity *= 2; /* use exponential growth */
-
-        qstring->string = g_realloc(qstring->string, qstring->capacity + 1);
-    }
-}
-
-/* qstring_append(): Append a C string to a QString
- */
-void qstring_append(QString *qstring, const char *str)
-{
-    size_t len = strlen(str);
-
-    capacity_increase(qstring, len);
-    memcpy(qstring->string + qstring->length, str, len);
-    qstring->length += len;
-    qstring->string[qstring->length] = 0;
-}
-
-void qstring_append_int(QString *qstring, int64_t value)
-{
-    char num[32];
-
-    snprintf(num, sizeof(num), "%" PRId64, value);
-    qstring_append(qstring, num);
-}
-
-/**
- * qstring_append_chr(): Append a C char to a QString
- */
-void qstring_append_chr(QString *qstring, int c)
-{
-    capacity_increase(qstring, 1);
-    qstring->string[qstring->length++] = c;
-    qstring->string[qstring->length] = 0;
-}
-
 /**
  * qstring_get_str(): Return a pointer to the stored string
  *
@@ -158,6 +97,6 @@ void qstring_destroy_obj(QObject *obj)
 
     assert(obj != NULL);
     qs = qobject_to(QString, obj);
-    g_free(qs->string);
+    g_free((char *)qs->string);
     g_free(qs);
 }
diff --git a/tests/check-qobject.c b/tests/check-qobject.c
index 6b6deaeb8b..c1713d15af 100644
--- a/tests/check-qobject.c
+++ b/tests/check-qobject.c
@@ -155,8 +155,7 @@ static void qobject_is_equal_string_test(void)
     str_case = qstring_from_str("Foo");
 
     /* Should yield "foo" */
-    str_built = qstring_from_substr("form", 0, 2);
-    qstring_append_chr(str_built, 'o');
+    str_built = qstring_from_substr("buffoon", 3, 6);
 
     check_unequal(str_base, str_whitespace_0, str_whitespace_1,
                   str_whitespace_2, str_whitespace_3, str_case);
diff --git a/tests/check-qstring.c b/tests/check-qstring.c
index 2d079921e3..4bf9772093 100644
--- a/tests/check-qstring.c
+++ b/tests/check-qstring.c
@@ -47,21 +47,6 @@ static void qstring_get_str_test(void)
     qobject_unref(qstring);
 }
 
-static void qstring_append_chr_test(void)
-{
-    int i;
-    QString *qstring;
-    const char *str = "qstring append char unit-test";
-
-    qstring = qstring_new();
-
-    for (i = 0; str[i]; i++)
-        qstring_append_chr(qstring, str[i]);
-
-    g_assert(strcmp(str, qstring_get_str(qstring)) == 0);
-    qobject_unref(qstring);
-}
-
 static void qstring_from_substr_test(void)
 {
     QString *qs;
@@ -90,7 +75,6 @@ int main(int argc, char **argv)
 
     g_test_add_func("/public/from_str", qstring_from_str_test);
     g_test_add_func("/public/get_str", qstring_get_str_test);
-    g_test_add_func("/public/append_chr", qstring_append_chr_test);
     g_test_add_func("/public/from_substr", qstring_from_substr_test);
     g_test_add_func("/public/to_qstring", qobject_to_qstring_test);
 
-- 
2.26.2



  parent reply	other threads:[~2020-12-11 18:07 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-11 17:11 [PATCH 00/20] Immutable QString, and also one JSON writer less Markus Armbruster
2020-12-11 17:11 ` [PATCH 01/20] hmp: Simplify how qmp_human_monitor_command() gets output Markus Armbruster
2020-12-16 18:53   ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 02/20] monitor: Use GString instead of QString for output buffer Markus Armbruster
2020-12-16 19:36   ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 03/20] qobject: Make qobject_to_json_pretty() take a pretty argument Markus Armbruster
2020-12-11 17:11 ` [PATCH 04/20] qobject: Use GString instead of QString to accumulate JSON Markus Armbruster
2020-12-11 17:11 ` [PATCH 05/20] qobject: Change qobject_to_json()'s value to GString Markus Armbruster
2021-03-24  7:16   ` Thomas Huth
2021-03-24  8:14     ` Markus Armbruster
2020-12-11 17:11 ` [PATCH 06/20] Revert "qstring: add qstring_free()" Markus Armbruster
2020-12-11 17:11 ` [PATCH 07/20] hw/rdma: Replace QList by GQueue Markus Armbruster
2020-12-11 17:11 ` [PATCH 08/20] qobject: Move internals to qobject-internal.h Markus Armbruster
2020-12-11 17:11 ` [PATCH 09/20] qmp: Fix tracing of non-string command IDs Markus Armbruster
2020-12-11 17:11 ` [PATCH 10/20] block: Avoid qobject_get_try_str() Markus Armbruster
2020-12-11 18:28   ` Vladimir Sementsov-Ogievskiy
2020-12-11 17:11 ` [PATCH 11/20] Revert "qobject: let object_property_get_str() use new API" Markus Armbruster
2020-12-11 19:48   ` Eduardo Habkost
2020-12-11 17:11 ` [PATCH 12/20] qobject: Drop qobject_get_try_str() Markus Armbruster
2020-12-11 17:11 ` [PATCH 13/20] qobject: Drop qstring_get_try_str() Markus Armbruster
2020-12-11 17:11 ` [PATCH 14/20] qobject: Factor quoted_str() out of to_json() Markus Armbruster
2020-12-11 17:11 ` [PATCH 15/20] qobject: Factor JSON writer out of qobject_to_json() Markus Armbruster
2020-12-11 17:11 ` [PATCH 16/20] migration: Replace migration's JSON writer by the general one Markus Armbruster
2020-12-16 19:46   ` Dr. David Alan Gilbert
2020-12-17  7:10     ` Markus Armbruster
2020-12-17  9:38       ` Dr. David Alan Gilbert
2020-12-17 10:32       ` Dr. David Alan Gilbert
2020-12-11 17:11 ` [PATCH 17/20] json: Use GString instead of QString to accumulate strings Markus Armbruster
2020-12-11 17:11 ` [PATCH 18/20] keyval: Use GString to accumulate value strings Markus Armbruster
2020-12-22  9:56   ` Paolo Bonzini
2021-01-11 13:05     ` Markus Armbruster
2021-01-11 13:51       ` Paolo Bonzini
2020-12-11 17:11 ` [PATCH 19/20] block: Use GString instead of QString to build filenames Markus Armbruster
2020-12-11 18:47   ` Vladimir Sementsov-Ogievskiy
2020-12-11 17:11 ` Markus Armbruster [this message]
2020-12-22  9:59 ` [PATCH 00/20] Immutable QString, and also one JSON writer less Paolo Bonzini

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=20201211171152.146877-21-armbru@redhat.com \
    --to=armbru@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).