[glib/wip/3v1n0/g_str_has_optimization: 1/7] Optimize g_str_has_*() functions to detect const arguments at compile-time
- From: Marco Trevisan <marcotrevi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/3v1n0/g_str_has_optimization: 1/7] Optimize g_str_has_*() functions to detect const arguments at compile-time
- Date: Thu, 13 Oct 2022 00:19:24 +0000 (UTC)
commit 0f4be1429d41de234f6a849c9b76445f61dd4a1e
Author: Emmanuel Fleury <emmanuel fleury gmail com>
Date: Fri Aug 19 18:00:19 2022 +0200
Optimize g_str_has_*() functions to detect const arguments at compile-time
Compilers can emit optimized code for str|strn|mem)cmp(str,"literal")
at compile-time. This commit use the preprocessor to introduce this
kind of optimization for the functions g_str_has_prefix() and
g_str_has_suffix().
Original work by Ben @bdejean
Closes issue #24
glib/gstrfuncs.c | 10 ++++------
glib/gstrfuncs.h | 34 ++++++++++++++++++++++++++++++----
2 files changed, 34 insertions(+), 10 deletions(-)
---
diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c
index ee934e5d76..3030114e33 100644
--- a/glib/gstrfuncs.c
+++ b/glib/gstrfuncs.c
@@ -2928,9 +2928,8 @@ g_strrstr_len (const gchar *haystack,
*
* Since: 2.2
*/
-gboolean
-g_str_has_suffix (const gchar *str,
- const gchar *suffix)
+gboolean (g_str_has_suffix) (const gchar *str,
+ const gchar *suffix)
{
gsize str_len;
gsize suffix_len;
@@ -2958,9 +2957,8 @@ g_str_has_suffix (const gchar *str,
*
* Since: 2.2
*/
-gboolean
-g_str_has_prefix (const gchar *str,
- const gchar *prefix)
+gboolean (g_str_has_prefix) (const gchar *str,
+ const gchar *prefix)
{
g_return_val_if_fail (str != NULL, FALSE);
g_return_val_if_fail (prefix != NULL, FALSE);
diff --git a/glib/gstrfuncs.h b/glib/gstrfuncs.h
index 37d2728d89..88c8c3cf7d 100644
--- a/glib/gstrfuncs.h
+++ b/glib/gstrfuncs.h
@@ -32,6 +32,8 @@
#endif
#include <stdarg.h>
+#include <string.h>
+
#include <glib/gmacros.h>
#include <glib/gtypes.h>
#include <glib/gerror.h>
@@ -137,11 +139,35 @@ gchar * g_strrstr_len (const gchar *haystack,
const gchar *needle);
GLIB_AVAILABLE_IN_ALL
-gboolean g_str_has_suffix (const gchar *str,
- const gchar *suffix);
+gboolean g_str_has_suffix (const gchar *str,
+ const gchar *suffix);
GLIB_AVAILABLE_IN_ALL
-gboolean g_str_has_prefix (const gchar *str,
- const gchar *prefix);
+gboolean g_str_has_prefix (const gchar *str,
+ const gchar *prefix);
+
+#if defined(__GNUC__) && (__GNUC__ > 2)
+
+#define g_str_has_prefix(STR, PREFIX) \
+ ((STR != NULL && PREFIX != NULL && __builtin_constant_p (PREFIX)) ? G_GNUC_EXTENSION ({ \
+ const char *const __str = STR; \
+ const char *const __prefix = PREFIX; \
+ const size_t __str_len = strlen (__str); \
+ const size_t __prefix_len = strlen (__prefix); \
+ (__str_len >= __prefix_len) ? memcmp (__str, __prefix, __prefix_len) == 0 : FALSE; \
+ }) \
+ : (g_str_has_prefix) (STR, PREFIX))
+
+#define g_str_has_suffix(STR, SUFFIX)
\
+ ((STR != NULL && SUFFIX != NULL && __builtin_constant_p (SUFFIX)) ? G_GNUC_EXTENSION ({
\
+ const char *const __str = STR;
\
+ const char *const __suffix = SUFFIX;
\
+ const size_t __str_len = strlen (__str);
\
+ const size_t __suffix_len = strlen (__suffix);
\
+ (__str_len >= __suffix_len) ? memcmp (__str + __str_len - __suffix_len, __suffix, __suffix_len) == 0 :
FALSE; \
+ })
\
+ : (g_str_has_suffix) (STR, SUFFIX))
+
+#endif
/* String to/from double conversion functions */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]