aboutsummaryrefslogtreecommitdiffstats
path: root/include/serd/string_view.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/serd/string_view.h')
-rw-r--r--include/serd/string_view.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/include/serd/string_view.h b/include/serd/string_view.h
new file mode 100644
index 00000000..767cc6b1
--- /dev/null
+++ b/include/serd/string_view.h
@@ -0,0 +1,79 @@
+// Copyright 2011-2021 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#ifndef SERD_STRING_VIEW_H
+#define SERD_STRING_VIEW_H
+
+#include "serd/attributes.h"
+
+#include <stddef.h>
+#include <string.h>
+
+SERD_BEGIN_DECLS
+
+/**
+ @defgroup serd_string_view String View
+ @ingroup serd_utilities
+ @{
+*/
+
+/**
+ An immutable slice of a string.
+
+ This type is used for many string parameters, to allow referring to slices
+ of strings in-place and to avoid redundant string measurement.
+*/
+typedef struct {
+ const char* SERD_NONNULL buf; ///< Start of string
+ size_t len; ///< Length of string in bytes
+} SerdStringView;
+
+/// Return a view of an empty string
+SERD_ALWAYS_INLINE_FUNC SERD_CONST_FUNC static inline SerdStringView
+serd_empty_string(void)
+{
+ const SerdStringView view = {"", 0U};
+ return view;
+}
+
+/**
+ Return a view of a substring, or a premeasured string.
+
+ This makes either a view of a slice of a string (which may not be null
+ terminated), or a view of a string that has already been measured. This is
+ faster than serd_string() for dynamic strings since it does not call
+ `strlen`, so should be used when the length of the string is already known.
+
+ @param str Pointer to the start of the substring.
+
+ @param len Length of the substring in bytes, not including the trailing null
+ terminator if present.
+*/
+SERD_ALWAYS_INLINE_FUNC SERD_CONST_FUNC static inline SerdStringView
+serd_substring(const char* const SERD_NONNULL str, const size_t len)
+{
+ const SerdStringView view = {str, len};
+ return view;
+}
+
+/**
+ Return a view of an entire string by measuring it.
+
+ This makes a view of the given string by measuring it with `strlen`.
+
+ @param str Pointer to the start of a null-terminated C string, or null.
+*/
+SERD_ALWAYS_INLINE_FUNC SERD_PURE_FUNC static inline SerdStringView
+// NOLINTNEXTLINE(clang-diagnostic-unused-function)
+serd_string(const char* const SERD_NULLABLE str)
+{
+ return str ? serd_substring(str, strlen(str)) : serd_empty_string();
+}
+
+/**
+ @}
+*/
+
+SERD_END_DECLS
+
+#endif // SERD_STRING_VIEW_H