From 230385b5875643c2e162e6c4d2a27aaef95e1cc8 Mon Sep 17 00:00:00 2001 From: Yuri Roubinski Date: Wed, 21 Jun 2023 20:40:48 +0300 Subject: [PATCH] Add `String.reverse` method --- core/string/ustring.cpp | 17 +++++++++++++++++ core/string/ustring.h | 1 + core/variant/variant_call.cpp | 1 + doc/classes/String.xml | 6 ++++++ doc/classes/StringName.xml | 6 ++++++ tests/core/string/test_string.h | 5 +++++ 6 files changed, 36 insertions(+) diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index c276f20f994..6a77f077e59 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 782ca47507b..317fef6232f 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 dad91832168..ccf9b820227 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::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 ca8d1d5255f..91fc16c6a4f 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]. + + + + Returns the copy of this string in reverse order. + + diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml index 557f94b84a5..56406a565df 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]. + + + + Returns the copy of this string in reverse order. + + diff --git a/tests/core/string/test_string.h b/tests/core/string/test_string.h index 7c76e7aa7bc..afe6b8a7ed5 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";