summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2018-06-12 14:05:02 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2018-06-12 14:06:25 +0100
commit25012bf96c3ec6ae54dd2f31f1de4cadb671c9fd (patch)
treee8a9a9a6c0a53b79546117215d93295397da2d6b
parentb606ce30a2aadd7f393777634b5fd3cdd6258f3d (diff)
downloadglib-refcount-box.tar.gz
Add length accessor for GRefStringrefcount-box
Since we store the size of the allocation in the underlying ArcBox, we can get a constant time getter for the length of the string.
-rw-r--r--docs/reference/glib/glib-sections.txt1
-rw-r--r--glib/grefstring.c18
-rw-r--r--glib/grefstring.h3
-rw-r--r--glib/tests/refstring.c1
4 files changed, 23 insertions, 0 deletions
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index 4f6fbc5bb..833642909 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -3497,4 +3497,5 @@ g_ref_string_new
g_ref_string_new_intern
g_ref_string_acquire
g_ref_string_release
+g_ref_string_length
</SECTION>
diff --git a/glib/grefstring.c b/glib/grefstring.c
index cc62c8011..9d64a968b 100644
--- a/glib/grefstring.c
+++ b/glib/grefstring.c
@@ -173,3 +173,21 @@ g_ref_string_release (char *str)
g_arc_box_release_full (str, remove_if_interned);
}
+
+/**
+ * g_ref_string_length:
+ * @str: a reference counted string
+ *
+ * Retrieves the length of @str.
+ *
+ * Returns: the length of the given string, in bytes
+ *
+ * Since: 2.58
+ */
+gsize
+g_ref_string_length (char *str)
+{
+ g_return_val_if_fail (str != NULL && *str != '\0', 0);
+
+ return g_arc_box_get_size (str) - 1;
+}
diff --git a/glib/grefstring.h b/glib/grefstring.h
index f2156fef4..2afe23a73 100644
--- a/glib/grefstring.h
+++ b/glib/grefstring.h
@@ -33,6 +33,9 @@ char * g_ref_string_acquire (char *str);
GLIB_AVAILABLE_IN_2_58
void g_ref_string_release (char *str);
+GLIB_AVAILABLE_IN_2_58
+gsize g_ref_string_length (char *str);
+
typedef char GRefString;
G_END_DECLS
diff --git a/glib/tests/refstring.c b/glib/tests/refstring.c
index 0181be945..67b3ca302 100644
--- a/glib/tests/refstring.c
+++ b/glib/tests/refstring.c
@@ -28,6 +28,7 @@ test_refstring_base (void)
g_test_message ("s = '%s' (%p)", s, s);
g_assert_cmpint (strcmp (s, "hello, world"), ==, 0);
g_assert_cmpint (strlen (s), ==, strlen ("hello, world"));
+ g_assert_cmpuint (g_ref_string_length (s), ==, strlen ("hello, world"));
g_ref_string_release (s);
}