summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYuri Roubinski <chaosus89@gmail.com>2023-06-21 20:40:48 +0300
committerYuri Roubinski <chaosus89@gmail.com>2023-06-21 20:40:48 +0300
commit230385b5875643c2e162e6c4d2a27aaef95e1cc8 (patch)
tree097b921e4ca343995af5c4cc4eec988c116ec4ff
parent28a60b3de02e8cfcc742a248078e6b7ee8f728b1 (diff)
downloadredot-engine-230385b5875643c2e162e6c4d2a27aaef95e1cc8.tar.gz
Add `String.reverse` method
-rw-r--r--core/string/ustring.cpp17
-rw-r--r--core/string/ustring.h1
-rw-r--r--core/variant/variant_call.cpp1
-rw-r--r--doc/classes/String.xml6
-rw-r--r--doc/classes/StringName.xml6
-rw-r--r--tests/core/string/test_string.h5
6 files changed, 36 insertions, 0 deletions
diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp
index c276f20f99..6a77f077e5 100644
--- a/core/string/ustring.cpp
+++ b/core/string/ustring.cpp
@@ -3616,6 +3616,23 @@ String String::repeat(int p_count) const {
return new_string;
}
+String String::reverse() const {
+ int len = length();
+ if (len <= 1) {
+ return *this;
+ }
+ String new_string;
+ new_string.resize(len + 1);
+
+ const char32_t *src = ptr();
+ char32_t *dst = new_string.ptrw();
+ for (int i = 0; i < len; i++) {
+ dst[i] = src[len - i - 1];
+ }
+ dst[len] = _null;
+ return new_string;
+}
+
String String::left(int p_len) const {
if (p_len < 0) {
p_len = length() + p_len;
diff --git a/core/string/ustring.h b/core/string/ustring.h
index 782ca47507..317fef6232 100644
--- a/core/string/ustring.h
+++ b/core/string/ustring.h
@@ -304,6 +304,7 @@ public:
String replace(const char *p_key, const char *p_with) const;
String replacen(const String &p_key, const String &p_with) const;
String repeat(int p_count) const;
+ String reverse() const;
String insert(int p_at_pos, const String &p_string) const;
String erase(int p_pos, int p_chars = 1) const;
String pad_decimals(int p_digits) const;
diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp
index dad9183216..ccf9b82022 100644
--- a/core/variant/variant_call.cpp
+++ b/core/variant/variant_call.cpp
@@ -1659,6 +1659,7 @@ static void _register_variant_builtin_methods() {
bind_string_methodv(replace, static_cast<String (String::*)(const String &, const String &) const>(&String::replace), sarray("what", "forwhat"), varray());
bind_string_method(replacen, sarray("what", "forwhat"), varray());
bind_string_method(repeat, sarray("count"), varray());
+ bind_string_method(reverse, sarray(), varray());
bind_string_method(insert, sarray("position", "what"), varray());
bind_string_method(erase, sarray("position", "chars"), varray(1));
bind_string_method(capitalize, sarray(), varray());
diff --git a/doc/classes/String.xml b/doc/classes/String.xml
index ca8d1d5255..91fc16c6a4 100644
--- a/doc/classes/String.xml
+++ b/doc/classes/String.xml
@@ -720,6 +720,12 @@
Replaces all [b]case-insensitive[/b] occurrences of [param what] inside the string with the given [param forwhat].
</description>
</method>
+ <method name="reverse" qualifiers="const">
+ <return type="String" />
+ <description>
+ Returns the copy of this string in reverse order.
+ </description>
+ </method>
<method name="rfind" qualifiers="const">
<return type="int" />
<param index="0" name="what" type="String" />
diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml
index 557f94b84a..56406a565d 100644
--- a/doc/classes/StringName.xml
+++ b/doc/classes/StringName.xml
@@ -627,6 +627,12 @@
Replaces all [b]case-insensitive[/b] occurrences of [param what] inside the string with the given [param forwhat].
</description>
</method>
+ <method name="reverse" qualifiers="const">
+ <return type="String" />
+ <description>
+ Returns the copy of this string in reverse order.
+ </description>
+ </method>
<method name="rfind" qualifiers="const">
<return type="int" />
<param index="0" name="what" type="String" />
diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h
index 7c76e7aa7b..afe6b8a7ed 100644
--- a/tests/core/string/test_string.h
+++ b/tests/core/string/test_string.h
@@ -1607,6 +1607,11 @@ TEST_CASE("[String] Repeat") {
CHECK(t == s);
}
+TEST_CASE("[String] Reverse") {
+ String s = "Abcd";
+ CHECK(s.reverse() == "dcbA");
+}
+
TEST_CASE("[String] SHA1/SHA256/MD5") {
String s = "Godot";
String sha1 = "a1e91f39b9fce6a9998b14bdbe2aa2b39dc2d201";