summaryrefslogtreecommitdiffstats
path: root/src/variant/char_string.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/variant/char_string.cpp')
-rw-r--r--src/variant/char_string.cpp205
1 files changed, 107 insertions, 98 deletions
diff --git a/src/variant/char_string.cpp b/src/variant/char_string.cpp
index 0c8cd0f..856037c 100644
--- a/src/variant/char_string.cpp
+++ b/src/variant/char_string.cpp
@@ -38,116 +38,120 @@
#include <godot_cpp/godot.hpp>
#include <cmath>
+#include <string>
namespace godot {
-int CharString::length() const {
- return _length;
-}
-
-const char *CharString::get_data() const {
- return _data;
-}
-
-CharString::CharString(CharString &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
-}
+template <typename L, typename R>
+_FORCE_INLINE_ bool is_str_less(const L *l_ptr, const R *r_ptr) {
+ while (true) {
+ const char32_t l = *l_ptr;
+ const char32_t r = *r_ptr;
+
+ if (l == 0 && r == 0) {
+ return false;
+ } else if (l == 0) {
+ return true;
+ } else if (r == 0) {
+ return false;
+ } else if (l < r) {
+ return true;
+ } else if (l > r) {
+ return false;
+ }
-void CharString::operator=(CharString &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
+ l_ptr++;
+ r_ptr++;
+ }
}
-CharString::CharString(const char *str, int length) :
- _data(str), _length(length) {}
-
-CharString::~CharString() {
- if (_data != nullptr) {
- memdelete_arr(_data);
+template <class T>
+bool CharStringT<T>::operator<(const CharStringT<T> &p_right) const {
+ if (length() == 0) {
+ return p_right.length() != 0;
}
-}
-int Char16String::length() const {
- return _length;
+ return is_str_less(get_data(), p_right.get_data());
}
-const char16_t *Char16String::get_data() const {
- return _data;
-}
+template <class T>
+CharStringT<T> &CharStringT<T>::operator+=(T p_char) {
+ const int lhs_len = length();
+ resize(lhs_len + 2);
-Char16String::Char16String(Char16String &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
-}
+ T *dst = ptrw();
+ dst[lhs_len] = p_char;
+ dst[lhs_len + 1] = 0;
-void Char16String::operator=(Char16String &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
+ return *this;
}
-Char16String::Char16String(const char16_t *str, int length) :
- _data(str), _length(length) {}
+template <class T>
+void CharStringT<T>::operator=(const T *p_cstr) {
+ copy_from(p_cstr);
+}
-Char16String::~Char16String() {
- if (_data != nullptr) {
- memdelete_arr(_data);
+template <>
+const char *CharStringT<char>::get_data() const {
+ if (size()) {
+ return &operator[](0);
+ } else {
+ return "";
}
}
-int Char32String::length() const {
- return _length;
+template <>
+const char16_t *CharStringT<char16_t>::get_data() const {
+ if (size()) {
+ return &operator[](0);
+ } else {
+ return u"";
+ }
}
-const char32_t *Char32String::get_data() const {
- return _data;
+template <>
+const char32_t *CharStringT<char32_t>::get_data() const {
+ if (size()) {
+ return &operator[](0);
+ } else {
+ return U"";
+ }
}
-Char32String::Char32String(Char32String &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
+template <>
+const wchar_t *CharStringT<wchar_t>::get_data() const {
+ if (size()) {
+ return &operator[](0);
+ } else {
+ return L"";
+ }
}
-void Char32String::operator=(Char32String &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
-}
+template <class T>
+void CharStringT<T>::copy_from(const T *p_cstr) {
+ if (!p_cstr) {
+ resize(0);
+ return;
+ }
-Char32String::Char32String(const char32_t *str, int length) :
- _data(str), _length(length) {}
+ size_t len = std::char_traits<T>::length(p_cstr);
-Char32String::~Char32String() {
- if (_data != nullptr) {
- memdelete_arr(_data);
+ if (len == 0) {
+ resize(0);
+ return;
}
-}
-int CharWideString::length() const {
- return _length;
-}
+ Error err = resize(++len); // include terminating null char
-const wchar_t *CharWideString::get_data() const {
- return _data;
-}
-
-CharWideString::CharWideString(CharWideString &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
-}
+ ERR_FAIL_COND_MSG(err != OK, "Failed to copy C-string.");
-void CharWideString::operator=(CharWideString &&p_str) {
- SWAP(_length, p_str._length);
- SWAP(_data, p_str._data);
+ memcpy(ptrw(), p_cstr, len);
}
-CharWideString::CharWideString(const wchar_t *str, int length) :
- _data(str), _length(length) {}
-
-CharWideString::~CharWideString() {
- if (_data != nullptr) {
- memdelete_arr(_data);
- }
-}
+template class CharStringT<char>;
+template class CharStringT<char16_t>;
+template class CharStringT<char32_t>;
+template class CharStringT<wchar_t>;
// Custom String functions that are not part of bound API.
// It's easier to have them written in C++ directly than in a Python script that generates them.
@@ -228,56 +232,61 @@ String rtoss(double p_val) {
CharString String::utf8() const {
int length = internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), nullptr, 0);
int size = length + 1;
- char *cstr = memnew_arr(char, size);
- internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), cstr, length);
+ CharString str;
+ str.resize(size);
+ internal::gdextension_interface_string_to_utf8_chars(_native_ptr(), str.ptrw(), length);
- cstr[length] = '\0';
+ str[length] = '\0';
- return CharString(cstr, length);
+ return str;
}
CharString String::ascii() const {
int length = internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), nullptr, 0);
int size = length + 1;
- char *cstr = memnew_arr(char, size);
- internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), cstr, length);
+ CharString str;
+ str.resize(size);
+ internal::gdextension_interface_string_to_latin1_chars(_native_ptr(), str.ptrw(), length);
- cstr[length] = '\0';
+ str[length] = '\0';
- return CharString(cstr, length);
+ return str;
}
Char16String String::utf16() const {
int length = internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), nullptr, 0);
int size = length + 1;
- char16_t *cstr = memnew_arr(char16_t, size);
- internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), cstr, length);
+ Char16String str;
+ str.resize(size);
+ internal::gdextension_interface_string_to_utf16_chars(_native_ptr(), str.ptrw(), length);
- cstr[length] = '\0';
+ str[length] = '\0';
- return Char16String(cstr, length);
+ return str;
}
Char32String String::utf32() const {
int length = internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), nullptr, 0);
int size = length + 1;
- char32_t *cstr = memnew_arr(char32_t, size);
- internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), cstr, length);
+ Char32String str;
+ str.resize(size);
+ internal::gdextension_interface_string_to_utf32_chars(_native_ptr(), str.ptrw(), length);
- cstr[length] = '\0';
+ str[length] = '\0';
- return Char32String(cstr, length);
+ return str;
}
CharWideString String::wide_string() const {
int length = internal::gdextension_interface_string_to_wide_chars(_native_ptr(), nullptr, 0);
int size = length + 1;
- wchar_t *cstr = memnew_arr(wchar_t, size);
- internal::gdextension_interface_string_to_wide_chars(_native_ptr(), cstr, length);
+ CharWideString str;
+ str.resize(size);
+ internal::gdextension_interface_string_to_wide_chars(_native_ptr(), str.ptrw(), length);
- cstr[length] = '\0';
+ str[length] = '\0';
- return CharWideString(cstr, length);
+ return str;
}
String &String::operator=(const char *p_str) {