Browse Source

Merge pull request #78529 from Chaosus/string_reverse

Add `String.reverse` method
Rémi Verschelde 2 years ago
parent
commit
20e24bd2bb

+ 17 - 0
core/string/ustring.cpp

@@ -3635,6 +3635,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;

+ 1 - 0
core/string/ustring.h

@@ -305,6 +305,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;

+ 1 - 0
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());

+ 6 - 0
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" />

+ 6 - 0
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" />

+ 5 - 0
tests/core/string/test_string.h

@@ -1609,6 +1609,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";